From 392481dae51c5a075757d9fdcceb4bf6aee95b77 Mon Sep 17 00:00:00 2001 From: "konstantin@mysql.com" <> Date: Fri, 30 Apr 2004 01:02:29 +0400 Subject: [PATCH] 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) --- include/mysql.h | 23 ++++++++++++++++++++ libmysql/libmysql.c | 50 +++++++++++++++++++++++++++++++++++++++++++ libmysql/libmysql.def | 2 ++ 3 files changed, 75 insertions(+) diff --git a/include/mysql.h b/include/mysql.h index 852d633facf..077c66235a7 100644 --- a/include/mysql.h +++ b/include/mysql.h @@ -589,8 +589,25 @@ typedef struct st_mysql_stmt my_bool bind_result_done; /* output buffers were supplied */ /* mysql_stmt_close() had to cancel this result */ 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; +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 { @@ -648,6 +665,12 @@ int STDCALL mysql_stmt_fetch_column(MYSQL_STMT *stmt, MYSQL_BIND *bind, unsigned long offset); int STDCALL mysql_stmt_store_result(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_result(MYSQL_STMT * stmt, MYSQL_BIND * bnd); my_bool STDCALL mysql_stmt_close(MYSQL_STMT * stmt); diff --git a/libmysql/libmysql.c b/libmysql/libmysql.c index 4447ece308e..eb5048bbb61 100644 --- a/libmysql/libmysql.c +++ b/libmysql/libmysql.c @@ -2514,6 +2514,56 @@ stmt_read_row_no_data(MYSQL_STMT *stmt __attribute__((unused)), 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 */ diff --git a/libmysql/libmysql.def b/libmysql/libmysql.def index 4f6347776e0..1790b0fa888 100644 --- a/libmysql/libmysql.def +++ b/libmysql/libmysql.def @@ -127,3 +127,5 @@ EXPORTS mysql_stmt_prepare mysql_stmt_init mysql_stmt_insert_id + mysql_stmt_attr_get + mysql_stmt_attr_set