diff --git a/dbdimp.c b/dbdimp.c index 0f440892..4c39e82f 100644 --- a/dbdimp.c +++ b/dbdimp.c @@ -4007,7 +4007,9 @@ static bool mariadb_st_free_result_sets(SV *sth, imp_sth_t *imp_sth, bool free_l if (next_result_rc == 0) { - if (!(imp_sth->result = mysql_store_result(imp_dbh->pmysql))) + imp_sth->result = imp_sth->use_mysql_use_result ? + mysql_use_result(imp_dbh->pmysql) : mysql_store_result(imp_dbh->pmysql); + if (!imp_sth->result) { /* Check for possible error */ if (mysql_errno(imp_dbh->pmysql)) @@ -4023,6 +4025,13 @@ static bool mariadb_st_free_result_sets(SV *sth, imp_sth_t *imp_sth, bool free_l imp_dbh->insertid = imp_sth->insertid = mysql_insert_id(imp_dbh->pmysql); } } + if (imp_sth->use_mysql_use_result) { + while (mysql_fetch_row(imp_sth->result)) {} + if (mysql_errno(imp_dbh->pmysql)) + mariadb_dr_do_error(sth, mysql_errno(imp_dbh->pmysql), + mysql_error(imp_dbh->pmysql), + mysql_sqlstate(imp_dbh->pmysql)); + } if (imp_sth->result && (mysql_more_results(imp_dbh->pmysql) || free_last)) { mysql_free_result(imp_sth->result); @@ -4215,7 +4224,7 @@ bool mariadb_st_more_results(SV* sth, imp_sth_t* imp_sth) sv_2mortal(newSVuv(mysql_num_fields(imp_sth->result))) ); - if (imp_sth->row_num) + if (imp_sth->row_num || use_mysql_use_result) DBIc_ACTIVE_on(imp_sth); } @@ -4691,11 +4700,14 @@ IV mariadb_st_execute_iv(SV* sth, imp_sth_t* imp_sth) /** Store the result in the current statement handle */ num_fields = mysql_num_fields(imp_sth->result); DBIc_NUM_FIELDS(imp_sth) = (num_fields <= INT_MAX) ? num_fields : INT_MAX; - if (imp_sth->row_num) + if (imp_sth->row_num || imp_sth->use_mysql_use_result) DBIc_ACTIVE_on(imp_sth); if (!use_server_side_prepare) imp_sth->done_desc = FALSE; } + + /* Remember whether we actually used server side prepare */ + imp_sth->use_server_side_prepare = use_server_side_prepare; } imp_sth->warning_count = mysql_warning_count(imp_dbh->pmysql); @@ -5255,7 +5267,9 @@ mariadb_st_fetch(SV *sth, imp_sth_t* imp_sth) return Nullav; } - if (imp_sth->currow >= imp_sth->row_num && !mysql_more_results(imp_dbh->pmysql)) + if (imp_sth->use_mysql_use_result) + imp_sth->row_num++; + else if (imp_sth->currow >= imp_sth->row_num && !mysql_more_results(imp_dbh->pmysql)) DBIc_ACTIVE_off(imp_sth); num_fields= mysql_num_fields(imp_sth->result); @@ -6485,6 +6499,7 @@ my_ulonglong mariadb_db_async_result(SV* h, MYSQL_RES** resp) unsigned int num_fields; int htype; bool async_sth = FALSE; + bool use_mysql_use_result; if(! resp) { resp = &_res; @@ -6495,12 +6510,14 @@ my_ulonglong mariadb_db_async_result(SV* h, MYSQL_RES** resp) if(htype == DBIt_DB) { D_imp_dbh(h); dbh = imp_dbh; + use_mysql_use_result = imp_dbh->use_mysql_use_result; } else { D_imp_sth(h); D_imp_dbh_from_sth; dbh = imp_dbh; async_sth = imp_sth->is_async; retval = imp_sth->row_num; + use_mysql_use_result = imp_sth->use_mysql_use_result; } if(! dbh->async_query_in_flight) { @@ -6536,7 +6553,8 @@ my_ulonglong mariadb_db_async_result(SV* h, MYSQL_RES** resp) if (!mysql_read_query_result(svsock)) { - *resp= mysql_store_result(svsock); + *resp= use_mysql_use_result ? + mysql_use_result(svsock) : mysql_store_result(svsock); if (mysql_errno(svsock)) { @@ -6567,7 +6585,7 @@ my_ulonglong mariadb_db_async_result(SV* h, MYSQL_RES** resp) } else { num_fields = mysql_num_fields(imp_sth->result); DBIc_NUM_FIELDS(imp_sth) = (num_fields <= INT_MAX) ? num_fields : INT_MAX; - if (imp_sth->row_num) + if (imp_sth->row_num || imp_sth->use_mysql_use_result) DBIc_ACTIVE_on(imp_sth); } imp_sth->warning_count = mysql_warning_count(imp_dbh->pmysql);