summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <hf@deer.(none)>2003-09-19 14:05:28 +0500
committerunknown <hf@deer.(none)>2003-09-19 14:05:28 +0500
commit83e8881a5ad2a0fdfcb1ad06adca3614b6c7e0e4 (patch)
tree2577ed3a7cb5e2f36f2d4fbcadf4fec7b885e4b9
parent4c63804846d1530b602a74ff30ad26df7645a94b (diff)
downloadmariadb-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.h3
-rw-r--r--libmysql/client_settings.h1
-rw-r--r--libmysql/libmysql.c16
-rw-r--r--libmysqld/lib_sql.cc28
-rw-r--r--sql-common/client.c9
-rw-r--r--sql/client_settings.h5
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
-