diff options
author | unknown <hf@deer.(none)> | 2003-09-17 15:18:18 +0500 |
---|---|---|
committer | unknown <hf@deer.(none)> | 2003-09-17 15:18:18 +0500 |
commit | 6b05f916b8bd29af6205a946c4954bc3a2cb62df (patch) | |
tree | e8962724415be2d9f12cb72ce87a2be43fe4b342 /libmysql | |
parent | eead70fe70b5fc821827ea0bbe884eef9ad684de (diff) | |
download | mariadb-git-6b05f916b8bd29af6205a946c4954bc3a2cb62df.tar.gz |
SCRUM
prepared statements in embedded library
include/mysql.h:
stmt_execute 'virtual' method added
include/sql_common.h:
two functions became global
libmysql/client_settings.h:
declaration for cli_stmt_execute
libmysql/libmysql.c:
some functions changed to be usable from embedded library
libmysqld/lib_sql.cc:
code for embedded stmt_execute added
sql-common/client.c:
cli_stmt_execute added to the methods table
sql/client_settings.h:
no need for prepared statements in miniclient
Diffstat (limited to 'libmysql')
-rw-r--r-- | libmysql/client_settings.h | 1 | ||||
-rw-r--r-- | libmysql/libmysql.c | 69 |
2 files changed, 42 insertions, 28 deletions
diff --git a/libmysql/client_settings.h b/libmysql/client_settings.h index 2ad10bdc84c..9866c772d3a 100644 --- a/libmysql/client_settings.h +++ b/libmysql/client_settings.h @@ -54,3 +54,4 @@ MYSQL_FIELD * STDCALL cli_list_fields(MYSQL *mysql); my_bool STDCALL cli_read_prepare_result(MYSQL *mysql, MYSQL_STMT *stmt); MYSQL_DATA *cli_read_rows(MYSQL *mysql,MYSQL_FIELD *mysql_fields, uint fields); +int STDCALL cli_stmt_execute(MYSQL_STMT *stmt); diff --git a/libmysql/libmysql.c b/libmysql/libmysql.c index 56b8a1a14e8..bfa7e4e9357 100644 --- a/libmysql/libmysql.c +++ b/libmysql/libmysql.c @@ -1494,8 +1494,8 @@ static void set_stmt_error(MYSQL_STMT * stmt, int errcode, Copy error message to statement handler */ -static void set_stmt_errmsg(MYSQL_STMT * stmt, const char *err, int errcode, - const char *sqlstate) +void set_stmt_errmsg(MYSQL_STMT * stmt, const char *err, int errcode, + const char *sqlstate) { DBUG_ENTER("set_stmt_error_msg"); DBUG_PRINT("enter", ("error: %d/%s '%s'", errcode, sqlstate, err)); @@ -1601,6 +1601,16 @@ my_bool STDCALL cli_read_prepare_result(MYSQL *mysql, MYSQL_STMT *stmt) } stmt->field_count= (uint) field_count; stmt->param_count= (ulong) param_count; + if (!(stmt->params= (MYSQL_BIND *) alloc_root(&stmt->mem_root, + sizeof(MYSQL_BIND)* + (stmt->param_count + + stmt->field_count)))) + { + set_stmt_error(stmt, CR_OUT_OF_MEMORY, unknown_sqlstate); + DBUG_RETURN(1); + } + stmt->bind= stmt->params + stmt->param_count; + DBUG_RETURN(0); } @@ -1649,12 +1659,6 @@ mysql_prepare(MYSQL *mysql, const char *query, ulong length) stmt_close(stmt, 1); DBUG_RETURN(0); } - if (!(stmt->params= (MYSQL_BIND *) alloc_root(&stmt->mem_root, - sizeof(MYSQL_BIND)* - (stmt->param_count + - stmt->field_count)))) - set_stmt_error(stmt, CR_OUT_OF_MEMORY, unknown_sqlstate); - stmt->bind= stmt->params + stmt->param_count; stmt->state= MY_ST_PREPARE; stmt->mysql= mysql; @@ -1975,36 +1979,21 @@ static my_bool execute(MYSQL_STMT * stmt, char *packet, ulong length) mysql->last_used_con= mysql; int4store(buff, stmt->stmt_id); /* Send stmt id to server */ - if ((*mysql->methods->advanced_command)(mysql, COM_EXECUTE, buff, - MYSQL_STMT_HEADER, packet, - length, 1) || + if (cli_advanced_command(mysql, COM_EXECUTE, buff, + MYSQL_STMT_HEADER, packet, + length, 1) || mysql_read_query_result(mysql)) { set_stmt_errmsg(stmt, net->last_error, net->last_errno, net->sqlstate); DBUG_RETURN(1); } - stmt->state= MY_ST_EXECUTE; - mysql_free_result(stmt->result); - stmt->result= (MYSQL_RES *)0; - stmt->result_buffered= 0; - stmt->current_row= 0; DBUG_RETURN(0); } - -/* - Execute the prepare query -*/ - -int STDCALL mysql_execute(MYSQL_STMT *stmt) +int STDCALL cli_stmt_execute(MYSQL_STMT *stmt) { - DBUG_ENTER("mysql_execute"); + DBUG_ENTER("cli_stmt_execute"); - if (stmt->state == MY_ST_UNKNOWN) - { - set_stmt_error(stmt, CR_NO_PREPARE_STMT, unknown_sqlstate); - DBUG_RETURN(1); - } if (stmt->param_count) { NET *net= &stmt->mysql->net; @@ -2065,6 +2054,30 @@ int STDCALL mysql_execute(MYSQL_STMT *stmt) DBUG_RETURN((int) execute(stmt,0,0)); } +/* + Execute the prepare query +*/ + +int STDCALL mysql_execute(MYSQL_STMT *stmt) +{ + DBUG_ENTER("mysql_execute"); + + if (stmt->state == MY_ST_UNKNOWN) + { + set_stmt_error(stmt, CR_NO_PREPARE_STMT, unknown_sqlstate); + DBUG_RETURN(1); + } + if ((*stmt->mysql->methods->stmt_execute)(stmt)) + DBUG_RETURN(1); + + stmt->state= MY_ST_EXECUTE; + mysql_free_result(stmt->result); + stmt->result= (MYSQL_RES *)0; + stmt->result_buffered= 0; + stmt->current_row= 0; + DBUG_RETURN(0); +} + /* Return total parameters count in the statement |