Skip to content

Commit bf017a2

Browse files
author
hf@deer.(none)
committed
SCRUM
Prepared statements in embedded server Several changes in library code with two goals: to make mysql_prepare_stmt working in embedded server to get rid of #define mysql_interface_func mysql->methods->interface_func in user's interface
1 parent e63e222 commit bf017a2

10 files changed

Lines changed: 180 additions & 234 deletions

File tree

include/mysql.h

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -250,7 +250,6 @@ typedef struct st_mysql
250250

251251
LIST *stmts; /* list of all statements */
252252
const struct st_mysql_methods *methods;
253-
struct st_mysql_res *result;
254253
void *thd;
255254
} MYSQL;
256255

@@ -359,6 +358,8 @@ int STDCALL mysql_send_query(MYSQL *mysql, const char *q,
359358
unsigned long length);
360359
int STDCALL mysql_real_query(MYSQL *mysql, const char *q,
361360
unsigned long length);
361+
MYSQL_RES * STDCALL mysql_store_result(MYSQL *mysql);
362+
362363
/* perform query on master */
363364
my_bool STDCALL mysql_master_query(MYSQL *mysql, const char *q,
364365
unsigned long length);
@@ -427,6 +428,8 @@ MYSQL_FIELD_OFFSET STDCALL mysql_field_seek(MYSQL_RES *result,
427428
MYSQL_ROW STDCALL mysql_fetch_row(MYSQL_RES *result);
428429
unsigned long * STDCALL mysql_fetch_lengths(MYSQL_RES *result);
429430
MYSQL_FIELD * STDCALL mysql_fetch_field(MYSQL_RES *result);
431+
MYSQL_RES * STDCALL mysql_list_fields(MYSQL *mysql, const char *table,
432+
const char *wild);
430433
unsigned long STDCALL mysql_escape_string(char *to,const char *from,
431434
unsigned long from_length);
432435
unsigned long STDCALL mysql_real_escape_string(MYSQL *mysql,
@@ -538,9 +541,7 @@ typedef struct st_mysql_stmt
538541

539542

540543
#define mysql_read_query_result(mysql) (*(mysql)->methods->read_query_result)(mysql)
541-
#define mysql_store_result(mysql) (*(mysql)->methods->store_result)(mysql)
542544
#define mysql_use_result(mysql) (*(mysql)->methods->use_result)(mysql)
543-
#define mysql_list_fields(mysql, table, wild) (*(mysql)->methods->list_fields)(mysql, table, wild)
544545

545546
typedef struct st_mysql_methods
546547
{
@@ -552,12 +553,12 @@ typedef struct st_mysql_methods
552553
const char *arg,
553554
unsigned long arg_length,
554555
my_bool skip_check);
555-
MYSQL_RES * (STDCALL *store_result)(MYSQL *mysql);
556+
MYSQL_DATA *(STDCALL *read_rows)(MYSQL *mysql,MYSQL_FIELD *mysql_fields,
557+
uint fields);
556558
MYSQL_RES * (STDCALL *use_result)(MYSQL *mysql);
557559
void (STDCALL *fetch_lengths)(unsigned long *to,
558560
MYSQL_ROW column, uint field_count);
559-
MYSQL_RES * (STDCALL *list_fields)(MYSQL *mysql, const char *table,
560-
const char *wild);
561+
MYSQL_FIELD * (STDCALL *list_fields)(MYSQL *mysql);
561562
my_bool (STDCALL *read_prepare_result)(MYSQL *mysql, MYSQL_STMT *stmt);
562563
} MYSQL_METHODS;
563564

include/sql_common.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,6 @@ my_ulonglong net_field_length_ll(uchar **packet);
2828
MYSQL_FIELD *unpack_fields(MYSQL_DATA *data,MEM_ROOT *alloc,uint fields,
2929
my_bool default_value, uint server_capabilities);
3030
void free_rows(MYSQL_DATA *cur);
31-
MYSQL_DATA *read_rows (MYSQL *mysql,MYSQL_FIELD *fields,
32-
uint field_count);
3331
my_bool mysql_autenticate(MYSQL *mysql, const char *passwd);
3432
void free_old_query(MYSQL *mysql);
3533
void end_server(MYSQL *mysql);

libmysql/client_settings.h

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,16 @@ my_bool send_file_to_server(MYSQL *mysql, const char *filename);
4141
#define reset_sigpipe(mysql)
4242
#endif
4343

44-
MYSQL_RES * STDCALL cli_list_fields(MYSQL *mysql, const char *table, const char *wild);
45-
my_bool cli_read_prepare_result(MYSQL *mysql, MYSQL_STMT *stmt);
44+
void mysql_read_default_options(struct st_mysql_options *options,
45+
const char *filename,const char *group);
46+
MYSQL * STDCALL
47+
cli_mysql_real_connect(MYSQL *mysql,const char *host, const char *user,
48+
const char *passwd, const char *db,
49+
uint port, const char *unix_socket,ulong client_flag);
4650

51+
void STDCALL cli_mysql_close(MYSQL *mysql);
52+
53+
MYSQL_FIELD * STDCALL cli_list_fields(MYSQL *mysql);
54+
my_bool STDCALL cli_read_prepare_result(MYSQL *mysql, MYSQL_STMT *stmt);
55+
MYSQL_DATA *cli_read_rows(MYSQL *mysql,MYSQL_FIELD *mysql_fields,
56+
uint fields);

libmysql/libmysql.c

Lines changed: 29 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -973,6 +973,19 @@ mysql_list_tables(MYSQL *mysql, const char *wild)
973973
DBUG_RETURN (mysql_store_result(mysql));
974974
}
975975

976+
MYSQL_FIELD * STDCALL cli_list_fields(MYSQL *mysql)
977+
{
978+
MYSQL_DATA *query;
979+
if (!(query= cli_read_rows(mysql,(MYSQL_FIELD*) 0,
980+
protocol_41(mysql) ? 8 : 6)))
981+
return NULL;
982+
983+
mysql->field_count= query->rows;
984+
return unpack_fields(query,&mysql->field_alloc,
985+
query->rows, 1, mysql->server_capabilities);
986+
}
987+
988+
976989
/**************************************************************************
977990
List all fields in a table
978991
If wild is given then only the fields matching wild is returned
@@ -981,36 +994,29 @@ mysql_list_tables(MYSQL *mysql, const char *wild)
981994
**************************************************************************/
982995

983996
MYSQL_RES * STDCALL
984-
cli_list_fields(MYSQL *mysql, const char *table, const char *wild)
997+
mysql_list_fields(MYSQL *mysql, const char *table, const char *wild)
985998
{
986-
MYSQL_RES *result;
987-
MYSQL_DATA *query;
999+
MYSQL_RES *result;
1000+
MYSQL_FIELD *fields;
9881001
char buff[257],*end;
9891002
DBUG_ENTER("mysql_list_fields");
9901003
DBUG_PRINT("enter",("table: '%s' wild: '%s'",table,wild ? wild : ""));
9911004

992-
LINT_INIT(query);
993-
9941005
end=strmake(strmake(buff, table,128)+1,wild ? wild : "",128);
1006+
free_old_query(mysql);
9951007
if (simple_command(mysql,COM_FIELD_LIST,buff,(ulong) (end-buff),1) ||
996-
!(query = read_rows(mysql,(MYSQL_FIELD*) 0,
997-
protocol_41(mysql) ? 8 : 6)))
1008+
!(fields= (*mysql->methods->list_fields)(mysql)))
9981009
DBUG_RETURN(NULL);
9991010

1000-
free_old_query(mysql);
10011011
if (!(result = (MYSQL_RES *) my_malloc(sizeof(MYSQL_RES),
10021012
MYF(MY_WME | MY_ZEROFILL))))
1003-
{
1004-
free_rows(query);
10051013
DBUG_RETURN(NULL);
1006-
}
1014+
10071015
result->methods= mysql->methods;
10081016
result->field_alloc=mysql->field_alloc;
10091017
mysql->fields=0;
1010-
result->field_count = (uint) query->rows;
1011-
result->fields= unpack_fields(query,&result->field_alloc,
1012-
result->field_count, 1,
1013-
mysql->server_capabilities);
1018+
result->field_count = mysql->field_count;
1019+
result->fields= fields;
10141020
result->eof=1;
10151021
DBUG_RETURN(result);
10161022
}
@@ -1031,8 +1037,8 @@ mysql_list_processes(MYSQL *mysql)
10311037
free_old_query(mysql);
10321038
pos=(uchar*) mysql->net.read_pos;
10331039
field_count=(uint) net_field_length(&pos);
1034-
if (!(fields = read_rows(mysql,(MYSQL_FIELD*) 0,
1035-
protocol_41(mysql) ? 7 : 5)))
1040+
if (!(fields = (*mysql->methods->read_rows)(mysql,(MYSQL_FIELD*) 0,
1041+
protocol_41(mysql) ? 7 : 5)))
10361042
DBUG_RETURN(NULL);
10371043
if (!(mysql->fields=unpack_fields(fields,&mysql->field_alloc,field_count,0,
10381044
mysql->server_capabilities)))
@@ -1569,7 +1575,7 @@ my_bool STDCALL cli_read_prepare_result(MYSQL *mysql, MYSQL_STMT *stmt)
15691575
uint field_count;
15701576
ulong length, param_count;
15711577
MYSQL_DATA *fields_data;
1572-
DBUG_ENTER("cli_read_prepare_result");
1578+
DBUG_ENTER("read_prepare_result");
15731579

15741580
mysql= mysql->last_used_con;
15751581
if ((length= net_safe_read(mysql)) == packet_error)
@@ -1586,7 +1592,7 @@ my_bool STDCALL cli_read_prepare_result(MYSQL *mysql, MYSQL_STMT *stmt)
15861592
mysql->server_status|= SERVER_STATUS_IN_TRANS;
15871593

15881594
mysql->extra_info= net_field_length_ll(&pos);
1589-
if (!(fields_data= read_rows(mysql, (MYSQL_FIELD*) 0, 7)))
1595+
if (!(fields_data= (*mysql->methods->read_rows)(mysql,(MYSQL_FIELD*)0,7)))
15901596
DBUG_RETURN(1);
15911597
if (!(stmt->fields= unpack_fields(fields_data,&stmt->mem_root,
15921598
field_count,0,
@@ -1638,17 +1644,17 @@ mysql_prepare(MYSQL *mysql, const char *query, ulong length)
16381644
}
16391645

16401646
init_alloc_root(&stmt->mem_root,8192,0);
1641-
if ((*mysql->read_prepare_result)(mysql, stmt))
1647+
if ((*mysql->methods->read_prepare_result)(mysql, stmt))
16421648
{
16431649
stmt_close(stmt, 1);
16441650
DBUG_RETURN(0);
16451651
}
16461652
if (!(stmt->params= (MYSQL_BIND *) alloc_root(&stmt->mem_root,
16471653
sizeof(MYSQL_BIND)*
1648-
(param_count +
1649-
field_count))))
1654+
(stmt->param_count +
1655+
stmt->field_count))))
16501656
set_stmt_error(stmt, CR_OUT_OF_MEMORY, unknown_sqlstate);
1651-
stmt->bind= stmt->params + param_count;
1657+
stmt->bind= stmt->params + stmt->param_count;
16521658

16531659
stmt->state= MY_ST_PREPARE;
16541660
stmt->mysql= mysql;

libmysqld/embedded_priv.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,4 +26,7 @@ C_MODE_START
2626
extern void lib_connection_phase(NET *net, int phase);
2727
extern void init_embedded_mysql(MYSQL *mysql, int client_flag, char *db);
2828
extern void *create_embedded_thd(int client_flag, char *db);
29+
extern MYSQL_METHODS embedded_methods;
30+
void free_old_query(MYSQL *mysql);
31+
extern my_bool server_inited;
2932
C_MODE_END

0 commit comments

Comments
 (0)