Loading include/mysql.h +6 −3 Original line number Diff line number Diff line Loading @@ -130,14 +130,14 @@ typedef MYSQL_ROWS *MYSQL_ROW_OFFSET; /* offset to current row */ #include "my_alloc.h" typedef struct embedded_query_result EMBEDDED_QUERY_RESULT; typedef struct st_mysql_data { my_ulonglong rows; unsigned int fields; MYSQL_ROWS *data; MEM_ROOT alloc; #if !defined(CHECK_EMBEDDED_DIFFERENCES) || defined(EMBEDDED_LIBRARY) MYSQL_ROWS **prev_ptr; #endif /* extra info for embedded library */ struct embedded_query_result *embedded_info; } MYSQL_DATA; enum mysql_option Loading Loading @@ -287,6 +287,8 @@ typedef struct st_mysql from mysql_stmt_close if close had to cancel result set of this object. */ my_bool *unbuffered_fetch_owner; /* needed for embedded server - no net buffer to store the 'info' */ char *info_buffer; } MYSQL; typedef struct st_mysql_res { Loading Loading @@ -755,6 +757,7 @@ typedef struct st_mysql_methods const char *(*read_statistics)(MYSQL *mysql); my_bool (*next_result)(MYSQL *mysql); int (*read_change_user_result)(MYSQL *mysql, char *buff, const char *passwd); int (*read_rows_from_cursor)(MYSQL_STMT *stmt); #endif } MYSQL_METHODS; Loading libmysql/libmysql.c +6 −6 Original line number Diff line number Diff line Loading @@ -2722,13 +2722,13 @@ stmt_read_row_from_cursor(MYSQL_STMT *stmt, unsigned char **row) /* Send row request to the server */ int4store(buff, stmt->stmt_id); int4store(buff + 4, stmt->prefetch_rows); /* number of rows to fetch */ if (cli_advanced_command(mysql, COM_STMT_FETCH, buff, sizeof(buff), NullS, 0, 1)) if ((*mysql->methods->advanced_command)(mysql, COM_STMT_FETCH, buff, sizeof(buff), NullS, 0, 1)) { set_stmt_errmsg(stmt, net->last_error, net->last_errno, net->sqlstate); return 1; } if (cli_read_binary_rows(stmt)) if ((*mysql->methods->read_rows_from_cursor)(stmt)) return 1; stmt->server_status= mysql->server_status; Loading Loading @@ -5101,9 +5101,9 @@ my_bool STDCALL mysql_autocommit(MYSQL * mysql, my_bool auto_mode) DBUG_ENTER("mysql_autocommit"); DBUG_PRINT("enter", ("mode : %d", auto_mode)); if (auto_mode) /* set to true */ DBUG_RETURN((my_bool) mysql_real_query(mysql, "set autocommit=1", 16)); DBUG_RETURN((my_bool) mysql_real_query(mysql, "set autocommit=0", 16)); DBUG_RETURN((my_bool) mysql_real_query(mysql, auto_mode ? "set autocommit=1":"set autocommit=0", 16)); } Loading libmysqld/emb_qcache.cc +69 −60 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ #ifdef HAVE_QUERY_CACHE #include <mysql.h> #include "emb_qcache.h" #include "embedded_priv.h" void Querycache_stream::store_char(char c) { Loading Loading @@ -284,22 +285,25 @@ int Querycache_stream::load_column(MEM_ROOT *alloc, char** column) uint emb_count_querycache_size(THD *thd) { uint result; MYSQL *mysql= thd->mysql; MYSQL_FIELD *field= mysql->fields; MYSQL_FIELD *field_end= field + mysql->field_count; MYSQL_ROWS *cur_row=NULL; my_ulonglong n_rows=0; uint result= 0; MYSQL_FIELD *field; MYSQL_FIELD *field_end; MYSQL_ROWS *cur_row; my_ulonglong n_rows; MYSQL_DATA *data= thd->first_data; while (data->embedded_info->next) data= data->embedded_info->next; field= data->embedded_info->fields_list; field_end= field + data->fields; if (!field) return 0; if (thd->data) { *thd->data->prev_ptr= NULL; // this marks the last record cur_row= thd->data->data; n_rows= thd->data->rows; } result= (uint) (4+8 + (42 + 4*n_rows)*mysql->field_count); return result; *data->embedded_info->prev_ptr= NULL; // this marks the last record cur_row= data->data; n_rows= data->rows; /* n_fields + n_rows + (field_info + strlen * n_rows) * n_fields */ result+= (uint) (4+8 + (42 + 4*n_rows)*data->fields); for(; field < field_end; field++) { Loading @@ -313,7 +317,7 @@ uint emb_count_querycache_size(THD *thd) for (; cur_row; cur_row=cur_row->next) { MYSQL_ROW col= cur_row->data; MYSQL_ROW col_end= col + mysql->field_count; MYSQL_ROW col_end= col + data->fields; for (; col < col_end; col++) if (*col) result+= *(uint *)((*col) - sizeof(uint)); Loading @@ -323,24 +327,28 @@ uint emb_count_querycache_size(THD *thd) void emb_store_querycache_result(Querycache_stream *dst, THD *thd) { MYSQL *mysql= thd->mysql; MYSQL_FIELD *field= mysql->fields; MYSQL_FIELD *field_end= field + mysql->field_count; MYSQL_ROWS *cur_row= NULL; my_ulonglong n_rows= 0; MYSQL_FIELD *field; MYSQL_FIELD *field_end; MYSQL_ROWS *cur_row; my_ulonglong n_rows; MYSQL_DATA *data= thd->first_data; DBUG_ENTER("emb_store_querycache_result"); while (data->embedded_info->next) data= data->embedded_info->next; field= data->embedded_info->fields_list; field_end= field + data->fields; if (!field) return; DBUG_VOID_RETURN; if (thd->data) { *thd->data->prev_ptr= NULL; // this marks the last record cur_row= thd->data->data; n_rows= thd->data->rows; } *data->embedded_info->prev_ptr= NULL; // this marks the last record cur_row= data->data; n_rows= data->rows; dst->store_int((uint)mysql->field_count); dst->store_ll((uint)n_rows); dst->store_int((uint)data->fields); dst->store_ll((ulonglong)n_rows); for(; field < field_end; field++) { Loading @@ -356,14 +364,13 @@ void emb_store_querycache_result(Querycache_stream *dst, THD *thd) dst->store_str(field->org_table, field->org_table_length); dst->store_str(field->db, field->db_length); dst->store_str(field->catalog, field->catalog_length); dst->store_safe_str(field->def, field->def_length); } for (; cur_row; cur_row=cur_row->next) { MYSQL_ROW col= cur_row->data; MYSQL_ROW col_end= col + mysql->field_count; MYSQL_ROW col_end= col + data->fields; for (; col < col_end; col++) { uint len= *col ? *(uint *)((*col) - sizeof(uint)) : 0; Loading @@ -371,28 +378,34 @@ void emb_store_querycache_result(Querycache_stream *dst, THD *thd) } } DBUG_ASSERT(emb_count_querycache_size(thd) == dst->stored_size); DBUG_VOID_RETURN; } int emb_load_querycache_result(THD *thd, Querycache_stream *src) { MYSQL *mysql= thd->mysql; MYSQL_DATA *data; MYSQL_DATA *data= thd->alloc_new_dataset(); MYSQL_FIELD *field; MYSQL_FIELD *field_end; MEM_ROOT *f_alloc= &mysql->field_alloc; MEM_ROOT *f_alloc; MYSQL_ROWS *row, *end_row; MYSQL_ROWS **prev_row; ulonglong rows; MYSQL_ROW columns; DBUG_ENTER("emb_load_querycache_result"); mysql->field_count= src->load_int(); if (!data) goto err; init_alloc_root(&data->alloc, 8192,0); f_alloc= &data->alloc; data->fields= src->load_int(); rows= src->load_ll(); if (!(field= (MYSQL_FIELD *) alloc_root(&mysql->field_alloc,mysql->field_count*sizeof(MYSQL_FIELD)))) alloc_root(f_alloc,data->fields*sizeof(MYSQL_FIELD)))) goto err; mysql->fields= field; for(field_end= field+mysql->field_count; field < field_end; field++) data->embedded_info->fields_list= field; for(field_end= field+data->fields; field < field_end; field++) { field->length= src->load_int(); field->max_length= (unsigned int)src->load_int(); Loading @@ -411,38 +424,34 @@ int emb_load_querycache_result(THD *thd, Querycache_stream *src) goto err; } if (!rows) return 0; if (!(data= (MYSQL_DATA*)my_malloc(sizeof(MYSQL_DATA), MYF(MY_WME | MY_ZEROFILL)))) goto err; thd->data= data; init_alloc_root(&data->alloc, 8192,0); row= (MYSQL_ROWS *)alloc_root(&data->alloc, (uint) (rows * sizeof(MYSQL_ROWS) + rows * (mysql->field_count+1)*sizeof(char*))); row= (MYSQL_ROWS *)alloc_root(&data->alloc, (uint) (rows * sizeof(MYSQL_ROWS) + rows*(data->fields+1)*sizeof(char*))); end_row= row + rows; columns= (MYSQL_ROW)end_row; data->rows= rows; data->fields= mysql->field_count; data->data= row; if (!rows) goto return_ok; for (prev_row= &row->next; row < end_row; prev_row= &row->next, row++) { *prev_row= row; row->data= columns; MYSQL_ROW col_end= columns + mysql->field_count; MYSQL_ROW col_end= columns + data->fields; for (; columns < col_end; columns++) src->load_column(&data->alloc, columns); *(columns++)= NULL; } *prev_row= NULL; data->prev_ptr= prev_row; return 0; data->embedded_info->prev_ptr= prev_row; return_ok: send_eof(thd); DBUG_RETURN(0); err: return 1; DBUG_RETURN(1); } #endif /*HAVE_QUERY_CACHE*/ Loading libmysqld/embedded_priv.h +14 −7 Original line number Diff line number Diff line Loading @@ -16,18 +16,25 @@ /* Prototypes for the embedded version of MySQL */ #include <my_global.h> #include <mysql.h> #include <mysql_embed.h> #include <mysqld_error.h> #include <my_pthread.h> C_MODE_START void lib_connection_phase(NET *net, int phase); void init_embedded_mysql(MYSQL *mysql, int client_flag, char *db); void *create_embedded_thd(int client_flag, char *db); int check_embedded_connection(MYSQL *mysql); void free_old_query(MYSQL *mysql); void embedded_get_error(MYSQL *mysql); extern MYSQL_METHODS embedded_methods; /* This one is used by embedded library to gather returning data */ typedef struct embedded_query_result { MYSQL_ROWS **prev_ptr; unsigned int warning_count, server_status; struct st_mysql_data *next; my_ulonglong affected_rows, insert_id; char info[MYSQL_ERRMSG_SIZE]; MYSQL_FIELD *fields_list; unsigned int last_errno; char sqlstate[SQLSTATE_LENGTH+1]; } EQR; C_MODE_END libmysqld/lib_sql.cc +373 −146 File changed.Preview size limit exceeded, changes collapsed. Show changes Loading
include/mysql.h +6 −3 Original line number Diff line number Diff line Loading @@ -130,14 +130,14 @@ typedef MYSQL_ROWS *MYSQL_ROW_OFFSET; /* offset to current row */ #include "my_alloc.h" typedef struct embedded_query_result EMBEDDED_QUERY_RESULT; typedef struct st_mysql_data { my_ulonglong rows; unsigned int fields; MYSQL_ROWS *data; MEM_ROOT alloc; #if !defined(CHECK_EMBEDDED_DIFFERENCES) || defined(EMBEDDED_LIBRARY) MYSQL_ROWS **prev_ptr; #endif /* extra info for embedded library */ struct embedded_query_result *embedded_info; } MYSQL_DATA; enum mysql_option Loading Loading @@ -287,6 +287,8 @@ typedef struct st_mysql from mysql_stmt_close if close had to cancel result set of this object. */ my_bool *unbuffered_fetch_owner; /* needed for embedded server - no net buffer to store the 'info' */ char *info_buffer; } MYSQL; typedef struct st_mysql_res { Loading Loading @@ -755,6 +757,7 @@ typedef struct st_mysql_methods const char *(*read_statistics)(MYSQL *mysql); my_bool (*next_result)(MYSQL *mysql); int (*read_change_user_result)(MYSQL *mysql, char *buff, const char *passwd); int (*read_rows_from_cursor)(MYSQL_STMT *stmt); #endif } MYSQL_METHODS; Loading
libmysql/libmysql.c +6 −6 Original line number Diff line number Diff line Loading @@ -2722,13 +2722,13 @@ stmt_read_row_from_cursor(MYSQL_STMT *stmt, unsigned char **row) /* Send row request to the server */ int4store(buff, stmt->stmt_id); int4store(buff + 4, stmt->prefetch_rows); /* number of rows to fetch */ if (cli_advanced_command(mysql, COM_STMT_FETCH, buff, sizeof(buff), NullS, 0, 1)) if ((*mysql->methods->advanced_command)(mysql, COM_STMT_FETCH, buff, sizeof(buff), NullS, 0, 1)) { set_stmt_errmsg(stmt, net->last_error, net->last_errno, net->sqlstate); return 1; } if (cli_read_binary_rows(stmt)) if ((*mysql->methods->read_rows_from_cursor)(stmt)) return 1; stmt->server_status= mysql->server_status; Loading Loading @@ -5101,9 +5101,9 @@ my_bool STDCALL mysql_autocommit(MYSQL * mysql, my_bool auto_mode) DBUG_ENTER("mysql_autocommit"); DBUG_PRINT("enter", ("mode : %d", auto_mode)); if (auto_mode) /* set to true */ DBUG_RETURN((my_bool) mysql_real_query(mysql, "set autocommit=1", 16)); DBUG_RETURN((my_bool) mysql_real_query(mysql, "set autocommit=0", 16)); DBUG_RETURN((my_bool) mysql_real_query(mysql, auto_mode ? "set autocommit=1":"set autocommit=0", 16)); } Loading
libmysqld/emb_qcache.cc +69 −60 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ #ifdef HAVE_QUERY_CACHE #include <mysql.h> #include "emb_qcache.h" #include "embedded_priv.h" void Querycache_stream::store_char(char c) { Loading Loading @@ -284,22 +285,25 @@ int Querycache_stream::load_column(MEM_ROOT *alloc, char** column) uint emb_count_querycache_size(THD *thd) { uint result; MYSQL *mysql= thd->mysql; MYSQL_FIELD *field= mysql->fields; MYSQL_FIELD *field_end= field + mysql->field_count; MYSQL_ROWS *cur_row=NULL; my_ulonglong n_rows=0; uint result= 0; MYSQL_FIELD *field; MYSQL_FIELD *field_end; MYSQL_ROWS *cur_row; my_ulonglong n_rows; MYSQL_DATA *data= thd->first_data; while (data->embedded_info->next) data= data->embedded_info->next; field= data->embedded_info->fields_list; field_end= field + data->fields; if (!field) return 0; if (thd->data) { *thd->data->prev_ptr= NULL; // this marks the last record cur_row= thd->data->data; n_rows= thd->data->rows; } result= (uint) (4+8 + (42 + 4*n_rows)*mysql->field_count); return result; *data->embedded_info->prev_ptr= NULL; // this marks the last record cur_row= data->data; n_rows= data->rows; /* n_fields + n_rows + (field_info + strlen * n_rows) * n_fields */ result+= (uint) (4+8 + (42 + 4*n_rows)*data->fields); for(; field < field_end; field++) { Loading @@ -313,7 +317,7 @@ uint emb_count_querycache_size(THD *thd) for (; cur_row; cur_row=cur_row->next) { MYSQL_ROW col= cur_row->data; MYSQL_ROW col_end= col + mysql->field_count; MYSQL_ROW col_end= col + data->fields; for (; col < col_end; col++) if (*col) result+= *(uint *)((*col) - sizeof(uint)); Loading @@ -323,24 +327,28 @@ uint emb_count_querycache_size(THD *thd) void emb_store_querycache_result(Querycache_stream *dst, THD *thd) { MYSQL *mysql= thd->mysql; MYSQL_FIELD *field= mysql->fields; MYSQL_FIELD *field_end= field + mysql->field_count; MYSQL_ROWS *cur_row= NULL; my_ulonglong n_rows= 0; MYSQL_FIELD *field; MYSQL_FIELD *field_end; MYSQL_ROWS *cur_row; my_ulonglong n_rows; MYSQL_DATA *data= thd->first_data; DBUG_ENTER("emb_store_querycache_result"); while (data->embedded_info->next) data= data->embedded_info->next; field= data->embedded_info->fields_list; field_end= field + data->fields; if (!field) return; DBUG_VOID_RETURN; if (thd->data) { *thd->data->prev_ptr= NULL; // this marks the last record cur_row= thd->data->data; n_rows= thd->data->rows; } *data->embedded_info->prev_ptr= NULL; // this marks the last record cur_row= data->data; n_rows= data->rows; dst->store_int((uint)mysql->field_count); dst->store_ll((uint)n_rows); dst->store_int((uint)data->fields); dst->store_ll((ulonglong)n_rows); for(; field < field_end; field++) { Loading @@ -356,14 +364,13 @@ void emb_store_querycache_result(Querycache_stream *dst, THD *thd) dst->store_str(field->org_table, field->org_table_length); dst->store_str(field->db, field->db_length); dst->store_str(field->catalog, field->catalog_length); dst->store_safe_str(field->def, field->def_length); } for (; cur_row; cur_row=cur_row->next) { MYSQL_ROW col= cur_row->data; MYSQL_ROW col_end= col + mysql->field_count; MYSQL_ROW col_end= col + data->fields; for (; col < col_end; col++) { uint len= *col ? *(uint *)((*col) - sizeof(uint)) : 0; Loading @@ -371,28 +378,34 @@ void emb_store_querycache_result(Querycache_stream *dst, THD *thd) } } DBUG_ASSERT(emb_count_querycache_size(thd) == dst->stored_size); DBUG_VOID_RETURN; } int emb_load_querycache_result(THD *thd, Querycache_stream *src) { MYSQL *mysql= thd->mysql; MYSQL_DATA *data; MYSQL_DATA *data= thd->alloc_new_dataset(); MYSQL_FIELD *field; MYSQL_FIELD *field_end; MEM_ROOT *f_alloc= &mysql->field_alloc; MEM_ROOT *f_alloc; MYSQL_ROWS *row, *end_row; MYSQL_ROWS **prev_row; ulonglong rows; MYSQL_ROW columns; DBUG_ENTER("emb_load_querycache_result"); mysql->field_count= src->load_int(); if (!data) goto err; init_alloc_root(&data->alloc, 8192,0); f_alloc= &data->alloc; data->fields= src->load_int(); rows= src->load_ll(); if (!(field= (MYSQL_FIELD *) alloc_root(&mysql->field_alloc,mysql->field_count*sizeof(MYSQL_FIELD)))) alloc_root(f_alloc,data->fields*sizeof(MYSQL_FIELD)))) goto err; mysql->fields= field; for(field_end= field+mysql->field_count; field < field_end; field++) data->embedded_info->fields_list= field; for(field_end= field+data->fields; field < field_end; field++) { field->length= src->load_int(); field->max_length= (unsigned int)src->load_int(); Loading @@ -411,38 +424,34 @@ int emb_load_querycache_result(THD *thd, Querycache_stream *src) goto err; } if (!rows) return 0; if (!(data= (MYSQL_DATA*)my_malloc(sizeof(MYSQL_DATA), MYF(MY_WME | MY_ZEROFILL)))) goto err; thd->data= data; init_alloc_root(&data->alloc, 8192,0); row= (MYSQL_ROWS *)alloc_root(&data->alloc, (uint) (rows * sizeof(MYSQL_ROWS) + rows * (mysql->field_count+1)*sizeof(char*))); row= (MYSQL_ROWS *)alloc_root(&data->alloc, (uint) (rows * sizeof(MYSQL_ROWS) + rows*(data->fields+1)*sizeof(char*))); end_row= row + rows; columns= (MYSQL_ROW)end_row; data->rows= rows; data->fields= mysql->field_count; data->data= row; if (!rows) goto return_ok; for (prev_row= &row->next; row < end_row; prev_row= &row->next, row++) { *prev_row= row; row->data= columns; MYSQL_ROW col_end= columns + mysql->field_count; MYSQL_ROW col_end= columns + data->fields; for (; columns < col_end; columns++) src->load_column(&data->alloc, columns); *(columns++)= NULL; } *prev_row= NULL; data->prev_ptr= prev_row; return 0; data->embedded_info->prev_ptr= prev_row; return_ok: send_eof(thd); DBUG_RETURN(0); err: return 1; DBUG_RETURN(1); } #endif /*HAVE_QUERY_CACHE*/ Loading
libmysqld/embedded_priv.h +14 −7 Original line number Diff line number Diff line Loading @@ -16,18 +16,25 @@ /* Prototypes for the embedded version of MySQL */ #include <my_global.h> #include <mysql.h> #include <mysql_embed.h> #include <mysqld_error.h> #include <my_pthread.h> C_MODE_START void lib_connection_phase(NET *net, int phase); void init_embedded_mysql(MYSQL *mysql, int client_flag, char *db); void *create_embedded_thd(int client_flag, char *db); int check_embedded_connection(MYSQL *mysql); void free_old_query(MYSQL *mysql); void embedded_get_error(MYSQL *mysql); extern MYSQL_METHODS embedded_methods; /* This one is used by embedded library to gather returning data */ typedef struct embedded_query_result { MYSQL_ROWS **prev_ptr; unsigned int warning_count, server_status; struct st_mysql_data *next; my_ulonglong affected_rows, insert_id; char info[MYSQL_ERRMSG_SIZE]; MYSQL_FIELD *fields_list; unsigned int last_errno; char sqlstate[SQLSTATE_LENGTH+1]; } EQR; C_MODE_END
libmysqld/lib_sql.cc +373 −146 File changed.Preview size limit exceeded, changes collapsed. Show changes