diff options
author | unknown <hf@deer.(none)> | 2003-09-19 14:05:28 +0500 |
---|---|---|
committer | unknown <hf@deer.(none)> | 2003-09-19 14:05:28 +0500 |
commit | 83e8881a5ad2a0fdfcb1ad06adca3614b6c7e0e4 (patch) | |
tree | 2577ed3a7cb5e2f36f2d4fbcadf4fec7b885e4b9 | |
parent | 4c63804846d1530b602a74ff30ad26df7645a94b (diff) | |
download | mariadb-git-83e8881a5ad2a0fdfcb1ad06adca3614b6c7e0e4.tar.gz |
SCRUM
prepared statements in embedded library.
some fixes after testing
include/mysql.h:
virtual method added
libmysql/client_settings.h:
declaration added
libmysql/libmysql.c:
implementation added
mysql_fetch changed to work in both libraries
libmysqld/lib_sql.cc:
implementation added
sql-common/client.c:
added items in methods table
sql/client_settings.h:
decided to remove such defines - i placed single #ifdef in client.c
-rw-r--r-- | include/mysql.h | 3 | ||||
-rw-r--r-- | libmysql/client_settings.h | 1 | ||||
-rw-r--r-- | libmysql/libmysql.c | 16 | ||||
-rw-r--r-- | libmysqld/lib_sql.cc | 28 | ||||
-rw-r--r-- | sql-common/client.c | 9 | ||||
-rw-r--r-- | sql/client_settings.h | 5 |
6 files changed, 46 insertions, 16 deletions
diff --git a/include/mysql.h b/include/mysql.h index f9f7342bc6d..2e9147894ca 100644 --- a/include/mysql.h +++ b/include/mysql.h @@ -557,10 +557,13 @@ typedef struct st_mysql_methods MYSQL_RES * (STDCALL *use_result)(MYSQL *mysql); void (STDCALL *fetch_lengths)(unsigned long *to, MYSQL_ROW column, unsigned int field_count); +#if !defined(MYSQL_SERVER) || defined(EMBEDDED_LIBRARY) MYSQL_FIELD * (STDCALL *list_fields)(MYSQL *mysql); my_bool (STDCALL *read_prepare_result)(MYSQL *mysql, MYSQL_STMT *stmt); int (STDCALL *stmt_execute)(MYSQL_STMT *stmt); MYSQL_DATA *(STDCALL *read_binary_rows)(MYSQL_STMT *stmt); + int (STDCALL *unbuffered_fetch)(MYSQL *mysql, char **row); +#endif } MYSQL_METHODS; diff --git a/libmysql/client_settings.h b/libmysql/client_settings.h index 4fdbab08969..d0432503ee9 100644 --- a/libmysql/client_settings.h +++ b/libmysql/client_settings.h @@ -56,3 +56,4 @@ MYSQL_DATA *cli_read_rows(MYSQL *mysql,MYSQL_FIELD *mysql_fields, uint fields); int STDCALL cli_stmt_execute(MYSQL_STMT *stmt); MYSQL_DATA *cli_read_binary_rows(MYSQL_STMT *stmt); +int STDCALL cli_unbuffered_fetch(MYSQL *mysql, char **row); diff --git a/libmysql/libmysql.c b/libmysql/libmysql.c index c3592844024..debe3e54679 100644 --- a/libmysql/libmysql.c +++ b/libmysql/libmysql.c @@ -2965,6 +2965,14 @@ static int stmt_fetch_row(MYSQL_STMT *stmt, uchar *row) return 0; } +int STDCALL cli_unbuffered_fetch(MYSQL *mysql, char **row) +{ + if (packet_error == net_safe_read(mysql)) + return 1; + + *row= (mysql->net.read_pos[0] == 254) ? NULL : (mysql->net.read_pos+1); + return 0; +} /* Fetch and return row data to bound buffers, if any @@ -2994,20 +3002,20 @@ int STDCALL mysql_fetch(MYSQL_STMT *stmt) } else /* un-buffered */ { - if (packet_error == net_safe_read(mysql)) + if((*mysql->methods->unbuffered_fetch)(mysql, ( char **)&row)) { set_stmt_errmsg(stmt, mysql->net.last_error, mysql->net.last_errno, mysql->net.sqlstate); DBUG_RETURN(1); } - if (mysql->net.read_pos[0] == 254) + if (!row) { mysql->status= MYSQL_STATUS_READY; stmt->current_row= 0; goto no_data; } - row= mysql->net.read_pos+1; - } + } + stmt->current_row= row; DBUG_RETURN(stmt_fetch_row(stmt, row)); diff --git a/libmysqld/lib_sql.cc b/libmysqld/lib_sql.cc index d5f35b6c550..24ef3b76c0e 100644 --- a/libmysqld/lib_sql.cc +++ b/libmysqld/lib_sql.cc @@ -195,6 +195,26 @@ MYSQL_DATA *emb_read_binary_rows(MYSQL_STMT *stmt) return emb_read_rows(stmt->mysql, 0, 0); } +int STDCALL emb_unbuffered_fetch(MYSQL *mysql, char **row) +{ + MYSQL_DATA *data= ((THD*)mysql->thd)->data; + if (!data || !data->data) + { + *row= NULL; + if (data) + { + free_rows(data); + ((THD*)mysql->thd)->data= NULL; + } + } + else + { + *row= (char *)data->data->data; + data->data= data->data->next; + } + return 0; +} + MYSQL_METHODS embedded_methods= { emb_mysql_read_query_result, @@ -205,7 +225,8 @@ MYSQL_METHODS embedded_methods= emb_list_fields, emb_read_prepare_result, emb_stmt_execute, - emb_read_binary_rows + emb_read_binary_rows, + emb_unbuffered_fetch }; C_MODE_END @@ -561,9 +582,8 @@ bool Protocol_prep::write() *data->prev_ptr= cur; data->prev_ptr= &cur->next; - next_field=cur->data; - next_mysql_field= thd->mysql->fields; - + cur->next= 0; + return false; } diff --git a/sql-common/client.c b/sql-common/client.c index 5cdfd93158d..cd3763da725 100644 --- a/sql-common/client.c +++ b/sql-common/client.c @@ -1405,11 +1405,14 @@ static MYSQL_METHODS client_methods= cli_advanced_command, cli_read_rows, cli_mysql_use_result, - cli_fetch_lengths, - cli_list_fields, + cli_fetch_lengths +#ifndef MYSQL_SERVER + ,cli_list_fields, cli_read_prepare_result, cli_stmt_execute, - cli_read_binary_rows + cli_read_binary_rows, + cli_unbuffered_fetch +#endif }; MYSQL * STDCALL diff --git a/sql/client_settings.h b/sql/client_settings.h index c345021d7f5..b357e52ec9d 100644 --- a/sql/client_settings.h +++ b/sql/client_settings.h @@ -32,8 +32,3 @@ #undef HAVE_SMEM #undef _CUSTOMCONFIG_ -#define cli_list_fields NULL -#define cli_read_prepare_result NULL -#define cli_stmt_execute NULL -#define cli_read_binary_rows NULL - |