summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <hf@deer.(none)>2003-09-12 19:36:42 +0500
committerunknown <hf@deer.(none)>2003-09-12 19:36:42 +0500
commit774c65c7a37b0b02912940dd3c804fb526b68afa (patch)
tree38b0ef8c6f4b6f0091d8017c2347b99f5e902787
parent11930efba69eb4d0d76affe34a1323cdd5b5bd79 (diff)
parentdc250a6efc8bc451b301c74b494200dfb3dd3f8b (diff)
downloadmariadb-git-774c65c7a37b0b02912940dd3c804fb526b68afa.tar.gz
Merge abotchkov@bk-internal.mysql.com:/home/bk/mysql-4.1
into deer.(none):/home/hf/work/mysql-4.1.stmt include/mysql.h: Auto merged libmysql/libmysql.c: Auto merged libmysqld/libmysqld.c: Auto merged
-rw-r--r--include/mysql.h1
-rw-r--r--libmysql/client_settings.h1
-rw-r--r--libmysql/libmysql.c24
-rw-r--r--libmysqld/libmysqld.c6
-rw-r--r--sql-common/client.c3
-rw-r--r--sql/client_settings.h1
-rw-r--r--sql/sql_prepare.cc13
7 files changed, 31 insertions, 18 deletions
diff --git a/include/mysql.h b/include/mysql.h
index a4e4e9fcee4..453325453af 100644
--- a/include/mysql.h
+++ b/include/mysql.h
@@ -558,6 +558,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 68f596c833d..4652f3e8986 100644
--- a/libmysql/libmysql.c
+++ b/libmysql/libmysql.c
@@ -1563,13 +1563,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)
@@ -1593,18 +1593,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);
}
@@ -1648,14 +1638,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 56be78e3509..579ff8eadbe 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