summaryrefslogtreecommitdiff
path: root/libmysql
diff options
context:
space:
mode:
authorunknown <ndbdev@dl145c.mysql.com>2005-05-17 20:07:03 +0200
committerunknown <ndbdev@dl145c.mysql.com>2005-05-17 20:07:03 +0200
commitdb4a3d9a703f89e0fbd2a8a8a426e6bc8f4b6571 (patch)
treea53c8aeae0915a82c835c28adacda9f51c99b0f0 /libmysql
parent598df75bc9d90e54cecca628720f0bf0afca10ec (diff)
parentafaa3c8923288aaaa41f8f519bbc96f3b72b1d50 (diff)
downloadmariadb-git-db4a3d9a703f89e0fbd2a8a8a426e6bc8f4b6571.tar.gz
Merge tulin@bk-internal.mysql.com:/home/bk/mysql-5.0
into dl145c.mysql.com:/home/ndbdev/tomas/mysql-5.1 configure.in: Auto merged sql/sql_base.cc: Auto merged sql/sql_yacc.yy: Auto merged
Diffstat (limited to 'libmysql')
-rw-r--r--libmysql/errmsg.c3
-rw-r--r--libmysql/libmysql.c40
2 files changed, 36 insertions, 7 deletions
diff --git a/libmysql/errmsg.c b/libmysql/errmsg.c
index 5d183b478ef..9e1d70a47df 100644
--- a/libmysql/errmsg.c
+++ b/libmysql/errmsg.c
@@ -81,6 +81,7 @@ const char *client_errors[]=
"Attempt to read column without prior row fetch",
"Prepared statement contains no metadata",
"Attempt to read a row while there is no result set associated with the statement",
+ "This feature is not implemented yet",
""
};
@@ -143,6 +144,7 @@ const char *client_errors[]=
"Attempt to read column without prior row fetch",
"Prepared statement contains no metadata",
"Attempt to read a row while there is no result set associated with the statement",
+ "This feature is not implemented yet",
""
};
@@ -203,6 +205,7 @@ const char *client_errors[]=
"Attempt to read column without prior row fetch",
"Prepared statement contains no metadata",
"Attempt to read a row while there is no result set associated with the statement",
+ "This feature is not implemented yet",
""
};
#endif
diff --git a/libmysql/libmysql.c b/libmysql/libmysql.c
index 463f9da6ad5..c87728ab783 100644
--- a/libmysql/libmysql.c
+++ b/libmysql/libmysql.c
@@ -1736,6 +1736,9 @@ myodbc_remove_escape(MYSQL *mysql,char *name)
/******************* Declarations ***********************************/
+/* Default number of rows fetched per one COM_FETCH command. */
+
+#define DEFAULT_PREFETCH_ROWS 1UL
/*
These functions are called by function pointer MYSQL_STMT::read_row_func.
@@ -1761,6 +1764,7 @@ static my_bool setup_one_fetch_function(MYSQL_BIND *bind, MYSQL_FIELD *field);
#define RESET_SERVER_SIDE 1
#define RESET_LONG_DATA 2
+#define RESET_STORE_RESULT 4
static my_bool reset_stmt_handle(MYSQL_STMT *stmt, uint flags);
@@ -2001,6 +2005,7 @@ mysql_stmt_init(MYSQL *mysql)
stmt->state= MYSQL_STMT_INIT_DONE;
stmt->mysql= mysql;
stmt->read_row_func= stmt_read_row_no_data;
+ stmt->prefetch_rows= DEFAULT_PREFETCH_ROWS;
/* The rest of statement members was bzeroed inside malloc */
DBUG_RETURN(stmt);
@@ -2059,7 +2064,7 @@ mysql_stmt_prepare(MYSQL_STMT *stmt, const char *query, ulong length)
/* This is second prepare with another statement */
char buff[MYSQL_STMT_HEADER]; /* 4 bytes - stmt id */
- if (reset_stmt_handle(stmt, RESET_LONG_DATA))
+ if (reset_stmt_handle(stmt, RESET_LONG_DATA | RESET_STORE_RESULT))
DBUG_RETURN(1);
/*
These members must be reset for API to
@@ -2714,7 +2719,7 @@ stmt_read_row_from_cursor(MYSQL_STMT *stmt, unsigned char **row)
result->rows= 0;
/* Send row request to the server */
int4store(buff, stmt->stmt_id);
- int4store(buff + 4, 1); /* number of rows to fetch */
+ int4store(buff + 4, stmt->prefetch_rows); /* number of rows to fetch */
if (cli_advanced_command(mysql, COM_FETCH, buff, sizeof(buff),
NullS, 0, 1))
{
@@ -2772,12 +2777,29 @@ my_bool STDCALL mysql_stmt_attr_set(MYSQL_STMT *stmt,
stmt->update_max_length= value ? *(const my_bool*) value : 0;
break;
case STMT_ATTR_CURSOR_TYPE:
- stmt->flags= value ? *(const unsigned long *) value : 0;
+ {
+ ulong cursor_type;
+ cursor_type= value ? *(ulong*) value : 0UL;
+ if (cursor_type > (ulong) CURSOR_TYPE_READ_ONLY)
+ goto err_not_implemented;
+ stmt->flags= cursor_type;
+ break;
+ }
+ case STMT_ATTR_PREFETCH_ROWS:
+ {
+ ulong prefetch_rows= value ? *(ulong*) value : DEFAULT_PREFETCH_ROWS;
+ if (value == 0)
+ return TRUE;
+ stmt->prefetch_rows= prefetch_rows;
break;
+ }
default:
- return TRUE;
+ goto err_not_implemented;
}
return FALSE;
+err_not_implemented:
+ set_stmt_error(stmt, CR_NOT_IMPLEMENTED, unknown_sqlstate);
+ return TRUE;
}
@@ -2854,7 +2876,7 @@ int STDCALL mysql_stmt_execute(MYSQL_STMT *stmt)
DBUG_RETURN(1);
}
- if (reset_stmt_handle(stmt, 0))
+ if (reset_stmt_handle(stmt, RESET_STORE_RESULT))
DBUG_RETURN(1);
/*
No need to check for stmt->state: if the statement wasn't
@@ -4862,7 +4884,11 @@ static my_bool reset_stmt_handle(MYSQL_STMT *stmt, uint flags)
MYSQL_DATA *result= &stmt->result;
my_bool has_cursor= stmt->read_row_func == stmt_read_row_from_cursor;
- if (result->data)
+ /*
+ Reset stored result set if so was requested or it's a part
+ of cursor fetch.
+ */
+ if (result->data && (has_cursor || (flags & RESET_STORE_RESULT)))
{
/* Result buffered */
free_root(&result->alloc, MYF(MY_KEEP_PREALLOC));
@@ -4921,7 +4947,7 @@ my_bool STDCALL mysql_stmt_free_result(MYSQL_STMT *stmt)
DBUG_ENTER("mysql_stmt_free_result");
/* Free the client side and close the server side cursor if there is one */
- DBUG_RETURN(reset_stmt_handle(stmt, RESET_LONG_DATA));
+ DBUG_RETURN(reset_stmt_handle(stmt, RESET_LONG_DATA | RESET_STORE_RESULT));
}
/********************************************************************