diff options
author | unknown <hf@deer.(none)> | 2003-09-12 19:35:34 +0500 |
---|---|---|
committer | unknown <hf@deer.(none)> | 2003-09-12 19:35:34 +0500 |
commit | dc250a6efc8bc451b301c74b494200dfb3dd3f8b (patch) | |
tree | 46609c9322de2696057f154dff31ea468a3f6280 | |
parent | d6f15e9d02d7fb33627c937ff47c948dd9ae0b2e (diff) | |
download | mariadb-git-dc250a6efc8bc451b301c74b494200dfb3dd3f8b.tar.gz |
SCRUM:
#977 Prepared statements in embedded library
include/mysql.h:
read_prepare_result function moved to 'virtual'
libmysql/client_settings.h:
declare proper function for libmysql
libmysql/libmysql.c:
some code moved from implementation of read_prepare_result to
mysql_prepare_result to make creating separate (remote and embedded-server)
versions easier
libmysqld/libmysqld.c:
emb_read_prepare_result prototype
sql-common/client.c:
cli_read_prepare_result added to the client_methods
sql/client_settings.h:
we don't need prepared statements in mini_client
sql/sql_prepare.cc:
embedded send_prep_stmt added
-rw-r--r-- | include/mysql.h | 1 | ||||
-rw-r--r-- | libmysql/client_settings.h | 1 | ||||
-rw-r--r-- | libmysql/libmysql.c | 24 | ||||
-rw-r--r-- | libmysqld/libmysqld.c | 6 | ||||
-rw-r--r-- | sql-common/client.c | 3 | ||||
-rw-r--r-- | sql/client_settings.h | 1 | ||||
-rw-r--r-- | sql/sql_prepare.cc | 13 |
7 files changed, 31 insertions, 18 deletions
diff --git a/include/mysql.h b/include/mysql.h index ff00e75687d..f9adee6de04 100644 --- a/include/mysql.h +++ b/include/mysql.h @@ -556,6 +556,7 @@ typedef struct st_mysql_methods MYSQL_ROW column, uint field_count); MYSQL_RES * (STDCALL *list_fields)(MYSQL *mysql, const char *table, const char *wild); + my_bool (STDCALL *read_prepare_result)(MYSQL *mysql, MYSQL_STMT *stmt); } MYSQL_METHODS; MYSQL_STMT * STDCALL mysql_prepare(MYSQL * mysql, const char *query, diff --git a/libmysql/client_settings.h b/libmysql/client_settings.h index 9cafd7182d0..77506333779 100644 --- a/libmysql/client_settings.h +++ b/libmysql/client_settings.h @@ -42,4 +42,5 @@ my_bool send_file_to_server(MYSQL *mysql, const char *filename); #endif MYSQL_RES * STDCALL cli_list_fields(MYSQL *mysql, const char *table, const char *wild); +my_bool cli_read_prepare_result(MYSQL *mysql, MYSQL_STMT *stmt); diff --git a/libmysql/libmysql.c b/libmysql/libmysql.c index 3058efb83cb..ecc34dd6add 100644 --- a/libmysql/libmysql.c +++ b/libmysql/libmysql.c @@ -1556,13 +1556,13 @@ static my_bool my_realloc_str(NET *net, ulong length) 1 error */ -static my_bool read_prepare_result(MYSQL *mysql, MYSQL_STMT *stmt) +my_bool STDCALL cli_read_prepare_result(MYSQL *mysql, MYSQL_STMT *stmt) { uchar *pos; uint field_count; ulong length, param_count; MYSQL_DATA *fields_data; - DBUG_ENTER("read_prepare_result"); + DBUG_ENTER("cli_read_prepare_result"); mysql= mysql->last_used_con; if ((length= net_safe_read(mysql)) == packet_error) @@ -1586,18 +1586,8 @@ static my_bool read_prepare_result(MYSQL *mysql, MYSQL_STMT *stmt) mysql->server_capabilities))) DBUG_RETURN(1); } - if (!(stmt->params= (MYSQL_BIND *) alloc_root(&stmt->mem_root, - sizeof(MYSQL_BIND)* - (param_count + - field_count)))) - { - set_stmt_error(stmt, CR_OUT_OF_MEMORY, unknown_sqlstate); - DBUG_RETURN(0); - } - stmt->bind= (stmt->params + param_count); stmt->field_count= (uint) field_count; stmt->param_count= (ulong) param_count; - mysql->status= MYSQL_STATUS_READY; DBUG_RETURN(0); } @@ -1641,14 +1631,22 @@ mysql_prepare(MYSQL *mysql, const char *query, ulong length) } init_alloc_root(&stmt->mem_root,8192,0); - if (read_prepare_result(mysql, stmt)) + if ((*mysql->read_prepare_result)(mysql, stmt)) { stmt_close(stmt, 1); DBUG_RETURN(0); } + if (!(stmt->params= (MYSQL_BIND *) alloc_root(&stmt->mem_root, + sizeof(MYSQL_BIND)* + (param_count + + field_count)))) + set_stmt_error(stmt, CR_OUT_OF_MEMORY, unknown_sqlstate); + stmt->bind= stmt->params + param_count; + stmt->state= MY_ST_PREPARE; stmt->mysql= mysql; mysql->stmts= list_add(mysql->stmts, &stmt->list); + mysql->status= MYSQL_STATUS_READY; stmt->list.data= stmt; DBUG_PRINT("info", ("Parameter count: %ld", stmt->param_count)); DBUG_RETURN(stmt); diff --git a/libmysqld/libmysqld.c b/libmysqld/libmysqld.c index f403400812f..8629312949a 100644 --- a/libmysqld/libmysqld.c +++ b/libmysqld/libmysqld.c @@ -211,7 +211,11 @@ emb_list_fields(MYSQL *mysql, const char *table, const char *wild) DBUG_RETURN(result); } - +my_bool STDCALL emb_read_prepare_result(MYSQL *mysql, MYSQL_STMT *stmt) +{ + stmt->fields= mysql->result->fields; + stmt->alloc; +} /* ** Note that the mysql argument must be initialized with mysql_init() diff --git a/sql-common/client.c b/sql-common/client.c index 6372adb8550..4d1318151b3 100644 --- a/sql-common/client.c +++ b/sql-common/client.c @@ -1407,7 +1407,8 @@ static MYSQL_METHODS client_methods= cli_mysql_store_result, cli_mysql_use_result, cli_fetch_lengths, - cli_list_fields + cli_list_fields, + cli_read_prepare_result }; MYSQL * STDCALL diff --git a/sql/client_settings.h b/sql/client_settings.h index e31a75bdddd..97224d9890f 100644 --- a/sql/client_settings.h +++ b/sql/client_settings.h @@ -33,4 +33,5 @@ #undef _CUSTOMCONFIG_ #define cli_list_fields NULL +#define cli_read_prepare_result NULL diff --git a/sql/sql_prepare.cc b/sql/sql_prepare.cc index 4abbbcaff1f..088036e4c7e 100644 --- a/sql/sql_prepare.cc +++ b/sql/sql_prepare.cc @@ -142,6 +142,7 @@ void free_prep_stmt(PREP_STMT *stmt, TREE_FREE mode, void *not_used) Send prepared stmt info to client after prepare */ +#ifndef EMBEDDED_LIBRARY static bool send_prep_stmt(PREP_STMT *stmt, uint columns) { NET *net=&stmt->thd->net; @@ -150,14 +151,20 @@ static bool send_prep_stmt(PREP_STMT *stmt, uint columns) int4store(buff+1, stmt->stmt_id); int2store(buff+5, columns); int2store(buff+7, stmt->param_count); -#ifndef EMBEDDED_LIBRARY /* This should be fixed to work with prepared statements */ return (my_net_write(net, buff, sizeof(buff)) || net_flush(net)); +} #else - return true; -#endif +static bool send_prep_stmt(PREP_STMT *stmt, uint columns) +{ + MYSQL_STMT *client_stmt= stmt->thd->client_stmt; + + client_stmt->stmt_id= stmt->stmt_id; + client_stmt->field_count= columns; + client_stmt->param_count= stmt->param_count; } +#endif /*!EMBEDDED_LIBRAYR*/ /* Send information about all item parameters |