Commit 392481da authored by konstantin@mysql.com's avatar konstantin@mysql.com

Implementation of mysql_stmt_attr_get and mysql_stmt_attr_set

requested by Monty for Bug#1647 (No way to determine what size 
blob/clob is being returned into bound buffer)
parent 40ac433e
...@@ -589,8 +589,25 @@ typedef struct st_mysql_stmt ...@@ -589,8 +589,25 @@ typedef struct st_mysql_stmt
my_bool bind_result_done; /* output buffers were supplied */ my_bool bind_result_done; /* output buffers were supplied */
/* mysql_stmt_close() had to cancel this result */ /* mysql_stmt_close() had to cancel this result */
my_bool unbuffered_fetch_cancelled; my_bool unbuffered_fetch_cancelled;
/*
Is set to true if we need to calculate field->max_length for
metadata fields when doing mysql_stmt_store_result.
*/
my_bool update_max_length;
} MYSQL_STMT; } MYSQL_STMT;
enum enum_stmt_attr_type
{
/*
When doing mysql_stmt_store_result calculate max_length attribute
of statement metadata. This is to be consistent with the old API,
where this was done automatically.
In the new API we do that only by request because it slows down
mysql_stmt_store_result sufficiently.
*/
STMT_ATTR_UPDATE_MAX_LENGTH
};
typedef struct st_mysql_methods typedef struct st_mysql_methods
{ {
...@@ -648,6 +665,12 @@ int STDCALL mysql_stmt_fetch_column(MYSQL_STMT *stmt, MYSQL_BIND *bind, ...@@ -648,6 +665,12 @@ int STDCALL mysql_stmt_fetch_column(MYSQL_STMT *stmt, MYSQL_BIND *bind,
unsigned long offset); unsigned long offset);
int STDCALL mysql_stmt_store_result(MYSQL_STMT *stmt); int STDCALL mysql_stmt_store_result(MYSQL_STMT *stmt);
unsigned long STDCALL mysql_stmt_param_count(MYSQL_STMT * stmt); unsigned long STDCALL mysql_stmt_param_count(MYSQL_STMT * stmt);
my_bool STDCALL mysql_stmt_attr_set(MYSQL_STMT *stmt,
enum enum_stmt_attr_type attr_type,
const void *attr);
my_bool STDCALL mysql_stmt_attr_get(MYSQL_STMT *stmt,
enum enum_stmt_attr_type attr_type,
void *attr);
my_bool STDCALL mysql_stmt_bind_param(MYSQL_STMT * stmt, MYSQL_BIND * bnd); my_bool STDCALL mysql_stmt_bind_param(MYSQL_STMT * stmt, MYSQL_BIND * bnd);
my_bool STDCALL mysql_stmt_bind_result(MYSQL_STMT * stmt, MYSQL_BIND * bnd); my_bool STDCALL mysql_stmt_bind_result(MYSQL_STMT * stmt, MYSQL_BIND * bnd);
my_bool STDCALL mysql_stmt_close(MYSQL_STMT * stmt); my_bool STDCALL mysql_stmt_close(MYSQL_STMT * stmt);
......
...@@ -2514,6 +2514,56 @@ stmt_read_row_no_data(MYSQL_STMT *stmt __attribute__((unused)), ...@@ -2514,6 +2514,56 @@ stmt_read_row_no_data(MYSQL_STMT *stmt __attribute__((unused)),
return MYSQL_NO_DATA; return MYSQL_NO_DATA;
} }
/*
Get/set statement attributes
SYNOPSIS
mysql_stmt_attr_get()
mysql_stmt_attr_set()
attr_type statemenet attribute
value casted to const void * pointer to value.
RETURN VALUE
0 success
!0 wrong attribute type
*/
my_bool STDCALL mysql_stmt_attr_set(MYSQL_STMT *stmt,
enum enum_stmt_attr_type attr_type,
const void *value)
{
switch (attr_type) {
case STMT_ATTR_UPDATE_MAX_LENGTH:
/*
Do we need a flags variable for all attributes or a bool for each
attribute?
*/
stmt->update_max_length= value ? *(const my_bool*) value : 0;
break;
default:
return TRUE;
}
return FALSE;
}
my_bool STDCALL mysql_stmt_attr_get(MYSQL_STMT *stmt,
enum enum_stmt_attr_type attr_type,
void *value)
{
switch (attr_type) {
case STMT_ATTR_UPDATE_MAX_LENGTH:
*(unsigned long *) value= stmt->update_max_length;
break;
default:
return TRUE;
}
return FALSE;
}
/* /*
Execute the prepared query Execute the prepared query
*/ */
......
...@@ -127,3 +127,5 @@ EXPORTS ...@@ -127,3 +127,5 @@ EXPORTS
mysql_stmt_prepare mysql_stmt_prepare
mysql_stmt_init mysql_stmt_init
mysql_stmt_insert_id mysql_stmt_insert_id
mysql_stmt_attr_get
mysql_stmt_attr_set
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment