diff --git a/include/mariadb_stmt.h b/include/mariadb_stmt.h index d07540ea..e0ed3aed 100644 --- a/include/mariadb_stmt.h +++ b/include/mariadb_stmt.h @@ -161,46 +161,6 @@ typedef struct st_mysql_error_info char sqlstate[SQLSTATE_LENGTH + 1]; } mysql_error_info; - -struct st_mysqlnd_stmt_methods -{ - my_bool (*prepare)(const MYSQL_STMT * stmt, const char * const query, size_t query_len); - my_bool (*execute)(const MYSQL_STMT * stmt); - MYSQL_RES * (*use_result)(const MYSQL_STMT * stmt); - MYSQL_RES * (*store_result)(const MYSQL_STMT * stmt); - MYSQL_RES * (*get_result)(const MYSQL_STMT * stmt); - my_bool (*free_result)(const MYSQL_STMT * stmt); - my_bool (*seek_data)(const MYSQL_STMT * stmt, unsigned long long row); - my_bool (*reset)(const MYSQL_STMT * stmt); - my_bool (*close)(const MYSQL_STMT * stmt); /* private */ - my_bool (*dtor)(const MYSQL_STMT * stmt); /* use this for mysqlnd_stmt_close */ - - my_bool (*fetch)(const MYSQL_STMT * stmt, my_bool * const fetched_anything); - - my_bool (*bind_param)(const MYSQL_STMT * stmt, const MYSQL_BIND bind); - my_bool (*refresh_bind_param)(const MYSQL_STMT * stmt); - my_bool (*bind_result)(const MYSQL_STMT * stmt, const MYSQL_BIND *bind); - my_bool (*send_long_data)(const MYSQL_STMT * stmt, unsigned int param_num, - const char * const data, size_t length); - MYSQL_RES *(*get_parameter_metadata)(const MYSQL_STMT * stmt); - MYSQL_RES *(*get_result_metadata)(const MYSQL_STMT * stmt); - unsigned long long (*get_last_insert_id)(const MYSQL_STMT * stmt); - unsigned long long (*get_affected_rows)(const MYSQL_STMT * stmt); - unsigned long long (*get_num_rows)(const MYSQL_STMT * stmt); - - unsigned int (*get_param_count)(const MYSQL_STMT * stmt); - unsigned int (*get_field_count)(const MYSQL_STMT * stmt); - unsigned int (*get_warning_count)(const MYSQL_STMT * stmt); - - unsigned int (*get_error_no)(const MYSQL_STMT * stmt); - const char * (*get_error_str)(const MYSQL_STMT * stmt); - const char * (*get_sqlstate)(const MYSQL_STMT * stmt); - - my_bool (*get_attribute)(const MYSQL_STMT * stmt, enum enum_stmt_attr_type attr_type, const void * value); - my_bool (*set_attribute)(const MYSQL_STMT * stmt, enum enum_stmt_attr_type attr_type, const void * value); - void (*set_error)(MYSQL_STMT *stmt, unsigned int error_nr, const char *sqlstate, const char *format, ...); -}; - typedef int (*mysql_stmt_fetch_row_func)(MYSQL_STMT *stmt, unsigned char **row); typedef void (*ps_result_callback)(void *data, unsigned int column, unsigned char **row); typedef my_bool *(*ps_param_callback)(void *data, MYSQL_BIND *bind, unsigned int row_nr); @@ -239,13 +199,14 @@ struct st_mysql_stmt mysql_stmt_fetch_row_func fetch_row_func; unsigned int execute_count;/* count how many times the stmt was executed */ mysql_stmt_use_or_store_func default_rset_handler; - struct st_mysqlnd_stmt_methods *m; + unsigned char *request_buffer; unsigned int array_size; size_t row_size; unsigned int prebind_params; void *user_data; ps_result_callback result_callback; ps_param_callback param_callback; + size_t request_length; }; typedef void (*ps_field_fetch_func)(MYSQL_BIND *r_param, const MYSQL_FIELD * field, unsigned char **row); diff --git a/include/mysql.h b/include/mysql.h index ccd1149c..b66cf170 100644 --- a/include/mysql.h +++ b/include/mysql.h @@ -874,6 +874,7 @@ struct st_mariadb_methods { void (*invalidate_stmts)(MYSQL *mysql, const char *function_name); struct st_mariadb_api *api; int (*db_read_execute_response)(MYSQL_STMT *stmt); + unsigned char* (*db_execute_generate_request)(MYSQL_STMT *stmt, size_t *request_len, my_bool internal); }; /* synonyms/aliases functions */ diff --git a/libmariadb/mariadb_lib.c b/libmariadb/mariadb_lib.c index e4baff33..0ffe8cdb 100644 --- a/libmariadb/mariadb_lib.c +++ b/libmariadb/mariadb_lib.c @@ -104,6 +104,7 @@ extern int run_plugin_auth(MYSQL *mysql, char *data, uint data_len, const char *data_plugin, const char *db); extern int net_add_multi_command(NET *net, uchar command, const uchar *packet, size_t length); +extern unsigned char* ma_stmt_execute_generate_request(MYSQL_STMT *stmt, size_t *request_len, my_bool internal); extern LIST *pvio_callback; @@ -117,7 +118,7 @@ extern int mthd_stmt_fetch_row(MYSQL_STMT *stmt, unsigned char **row); extern int mthd_stmt_fetch_to_bind(MYSQL_STMT *stmt, unsigned char *row); extern int mthd_stmt_read_all_rows(MYSQL_STMT *stmt); extern void mthd_stmt_flush_unbuffered(MYSQL_STMT *stmt); -extern my_bool _mariadb_read_options(MYSQL *mysql, const char *dir, const char *config_file, char *group, unsigned int recursion); +extern my_bool _mariadb_read_options(MYSQL *mysql, const char *dir, const char *config_file, const char *group, unsigned int recursion); extern unsigned char *mysql_net_store_length(unsigned char *packet, size_t length); extern void @@ -4518,5 +4519,7 @@ struct st_mariadb_methods MARIADB_DEFAULT_METHODS = { /* API functions */ &MARIADB_API, /* read execute response */ - mthd_stmt_read_execute_response + mthd_stmt_read_execute_response, + /* generate execute request */ + ma_stmt_execute_generate_request, }; diff --git a/libmariadb/mariadb_stmt.c b/libmariadb/mariadb_stmt.c index 60bb125f..ee117d31 100644 --- a/libmariadb/mariadb_stmt.c +++ b/libmariadb/mariadb_stmt.c @@ -673,8 +673,8 @@ int store_param(MYSQL_STMT *stmt, int column, unsigned char **p, unsigned long r return 0; } -/* {{{ mysqlnd_stmt_execute_generate_simple_request */ -unsigned char* mysql_stmt_execute_generate_simple_request(MYSQL_STMT *stmt, size_t *request_len) +/* {{{ ma_stmt_execute_generate_simple_request */ +unsigned char* ma_stmt_execute_generate_simple_request(MYSQL_STMT *stmt, size_t *request_len) { /* execute packet has the following format: Offset Length Description @@ -854,8 +854,8 @@ my_bool mysql_stmt_skip_paramset(MYSQL_STMT *stmt, uint row) } /* }}} */ -/* {{{ mysql_stmt_execute_generate_bulk_request */ -unsigned char* mysql_stmt_execute_generate_bulk_request(MYSQL_STMT *stmt, size_t *request_len) +/* {{{ ma_stmt_execute_generate_bulk_request */ +unsigned char* ma_stmt_execute_generate_bulk_request(MYSQL_STMT *stmt, size_t *request_len) { /* execute packet has the following format: Offset Length Description @@ -1046,6 +1046,40 @@ mem_error: return NULL; } /* }}} */ + + +unsigned char* ma_stmt_execute_generate_request(MYSQL_STMT *stmt, size_t *request_len, my_bool internal) +{ + unsigned char *buf; + + + if (stmt->request_buffer) + { + *request_len= stmt->request_length; + buf= stmt->request_buffer; + /* store actual stmt id */ + int4store(buf, stmt->stmt_id); + /* clear buffer, memory will be freed in execute */ + stmt->request_buffer= NULL; + stmt->request_length= 0; + return buf; + } + if (stmt->array_size > 0) + buf= ma_stmt_execute_generate_bulk_request(stmt, request_len); + else + buf= ma_stmt_execute_generate_simple_request(stmt, request_len); + + if (internal) + { + if (stmt->request_buffer) + free(stmt->request_buffer); + stmt->request_buffer= buf; + stmt->request_length= *request_len; + } + return buf; +} + + /*! ******************************************************************************* @@ -2056,11 +2090,8 @@ int STDCALL mysql_stmt_execute(MYSQL_STMT *stmt) } /* CONC-344: set row count to zero */ stmt->result.rows= 0; - if (stmt->array_size > 0) - request= (char *)mysql_stmt_execute_generate_bulk_request(stmt, &request_len); - else - request= (char *)mysql_stmt_execute_generate_simple_request(stmt, &request_len); + request= (char *)ma_stmt_execute_generate_request(stmt, &request_len, 0); if (!request) return 1;