summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <hf@deer.(none)>2003-07-23 15:23:20 +0500
committerunknown <hf@deer.(none)>2003-07-23 15:23:20 +0500
commit41e77ddf657bd14a14ab7b48a4b2f8bad12b0d69 (patch)
tree4f5589680b89450eee716ef28e4b85348fdb2c1f
parentceb2374b69e37e18fa014f6685725fa4c5e52383 (diff)
downloadmariadb-git-41e77ddf657bd14a14ab7b48a4b2f8bad12b0d69.tar.gz
SCRUM - adding client into embedded server
error handling fixed fetch_lengths made to work differently in embedded and client cases include/mysql.h: removed 'embedded' error containers - they're unnecessary now added declarations for fetch_lengths to be 'virtual' include/sql_common.h: fetch_lengths declaration removed libmysql/libmysql.c: implementations for fetch_lengths to be 'virtual' added libmysqld/lib_sql.cc: error informations now is moved from thd->net to mysql-net libmysqld/libmysqld.c: error data is in mysql->net now sql-common/client.c: we have to return old fetch_lengths implementation for 'client' case sql/protocol.cc: handling of sqlstate for embedded library added
-rw-r--r--include/mysql.h5
-rw-r--r--include/sql_common.h1
-rw-r--r--libmysql/libmysql.c5
-rw-r--r--libmysqld/lib_sql.cc10
-rw-r--r--libmysqld/libmysqld.c35
-rw-r--r--sql-common/client.c29
-rw-r--r--sql/protocol.cc2
7 files changed, 65 insertions, 22 deletions
diff --git a/include/mysql.h b/include/mysql.h
index 58391d615d2..719cf800234 100644
--- a/include/mysql.h
+++ b/include/mysql.h
@@ -250,9 +250,6 @@ typedef struct st_mysql
const struct st_mysql_methods *methods;
struct st_mysql_res *result;
void *thd;
- unsigned int last_errno;
- char *last_error;
- char sqlstate[SQLSTATE_LENGTH+1]; /* Used by embedded server */
} MYSQL;
typedef struct st_mysql_res {
@@ -267,6 +264,7 @@ typedef struct st_mysql_res {
MYSQL_ROW row; /* If unbuffered read */
MYSQL_ROW current_row; /* buffer to current row */
my_bool eof; /* Used by mysql_fetch_row */
+ const struct st_mysql_methods *methods;
} MYSQL_RES;
#define MAX_MYSQL_MANAGER_ERR 256
@@ -552,6 +550,7 @@ typedef struct st_mysql_methods
ulong arg_length, my_bool skip_check);
MYSQL_RES * STDCALL (*store_result)(MYSQL *mysql);
MYSQL_RES * STDCALL (*use_result)(MYSQL *mysql);
+ void STDCALL (*fetch_lengths)(ulong *to, MYSQL_ROW column, uint field_count);
} MYSQL_METHODS;
MYSQL_STMT * STDCALL mysql_prepare(MYSQL * mysql, const char *query,
diff --git a/include/sql_common.h b/include/sql_common.h
index cd1d2331d96..9fea46be298 100644
--- a/include/sql_common.h
+++ b/include/sql_common.h
@@ -31,7 +31,6 @@ void free_rows(MYSQL_DATA *cur);
MYSQL_DATA *read_rows (MYSQL *mysql,MYSQL_FIELD *fields,
uint field_count);
my_bool mysql_autenticate(MYSQL *mysql, const char *passwd);
-void fetch_lengths(ulong *to, MYSQL_ROW column, uint field_count);
void free_old_query(MYSQL *mysql);
void end_server(MYSQL *mysql);
my_bool mysql_reconnect(MYSQL *mysql);
diff --git a/libmysql/libmysql.c b/libmysql/libmysql.c
index a90fb2f1205..d75f217585d 100644
--- a/libmysql/libmysql.c
+++ b/libmysql/libmysql.c
@@ -868,7 +868,7 @@ mysql_fetch_lengths(MYSQL_RES *res)
if (!(column=res->current_row))
return 0; /* Something is wrong */
if (res->data)
- fetch_lengths(res->lengths, column, res->field_count);
+ (*res->methods->fetch_lengths)(res->lengths, column, res->field_count);
return res->lengths;
}
@@ -979,6 +979,7 @@ mysql_list_fields(MYSQL *mysql, const char *table, const char *wild)
free_rows(query);
DBUG_RETURN(NULL);
}
+ result->methods= mysql->methods;
result->field_alloc=mysql->field_alloc;
mysql->fields=0;
result->field_count = (uint) query->rows;
@@ -1704,6 +1705,7 @@ mysql_prepare_result(MYSQL_STMT *stmt)
MYF(MY_WME | MY_ZEROFILL))))
return 0;
+ result->methods= stmt->mysql->methods;
result->eof=1; /* Marker for buffered */
result->fields= stmt->fields;
result->field_count= stmt->field_count;
@@ -3193,6 +3195,7 @@ int STDCALL mysql_stmt_store_result(MYSQL_STMT *stmt)
set_stmt_error(stmt, CR_OUT_OF_MEMORY, unknown_sqlstate);
DBUG_RETURN(1);
}
+ result->methods= mysql->methods;
stmt->result_buffered= 1;
if (!(result->data= read_binary_rows(stmt)))
{
diff --git a/libmysqld/lib_sql.cc b/libmysqld/lib_sql.cc
index f7b69b51d46..6d7b71c61be 100644
--- a/libmysqld/lib_sql.cc
+++ b/libmysqld/lib_sql.cc
@@ -76,8 +76,13 @@ emb_advanced_command(MYSQL *mysql, enum enum_server_command command,
if (!skip_check)
result= thd->net.last_errno ? -1 : 0;
- mysql->last_error= thd->net.last_error;
- mysql->net.last_errno= thd->net.last_errno;
+ if ((mysql->net.last_errno= thd->net.last_errno))
+ {
+ memcpy(mysql->net.last_error, thd->net.last_error,
+ sizeof(mysql->net.last_error));
+ memcpy(mysql->net.sqlstate, thd->net.sqlstate,
+ sizeof(mysql->net.sqlstate));
+ }
mysql->warning_count= ((THD*)mysql->thd)->total_warn_count;
return result;
}
@@ -292,7 +297,6 @@ void init_embedded_mysql(MYSQL *mysql, int client_flag, char *db)
{
THD *thd = (THD *)mysql->thd;
thd->mysql= mysql;
- mysql->last_error= thd->net.last_error;
}
void *create_embedded_thd(int client_flag, char *db)
diff --git a/libmysqld/libmysqld.c b/libmysqld/libmysqld.c
index b6278ab3c0b..357c13c5826 100644
--- a/libmysqld/libmysqld.c
+++ b/libmysqld/libmysqld.c
@@ -144,25 +144,42 @@ static inline int mysql_init_charset(MYSQL *mysql)
if (!mysql->charset)
{
- mysql->last_errno=CR_CANT_READ_CHARSET;
- strmov(mysql->sqlstate, "HY0000");
+ mysql->net.last_errno=CR_CANT_READ_CHARSET;
+ strmov(mysql->net.sqlstate, "HY0000");
if (mysql->options.charset_dir)
- sprintf(mysql->last_error,ER(mysql->last_errno),
+ sprintf(mysql->net.last_error,ER(mysql->net.last_errno),
charset_name ? charset_name : "unknown",
mysql->options.charset_dir);
else
{
char cs_dir_name[FN_REFLEN];
get_charsets_dir(cs_dir_name);
- sprintf(mysql->last_error,ER(mysql->last_errno),
+ sprintf(mysql->net.last_error,ER(mysql->net.last_errno),
charset_name ? charset_name : "unknown",
cs_dir_name);
}
- return mysql->last_errno;
+ return mysql->net.last_errno;
}
return 0;
}
+/**************************************************************************
+ Get column lengths of the current row
+ If one uses mysql_use_result, res->lengths contains the length information,
+ else the lengths are calculated from the offset between pointers.
+**************************************************************************/
+
+static void emb_fetch_lengths(ulong *to, MYSQL_ROW column, uint field_count)
+{
+ MYSQL_ROW end;
+
+ for (end=column + field_count; column != end ; column++,to++)
+ {
+ *to= *column ? strlen(*column) : 0;
+ }
+}
+
+
/*
** Note that the mysql argument must be initialized with mysql_init()
** before calling mysql_real_connect !
@@ -178,6 +195,7 @@ static MYSQL_METHODS embedded_methods=
emb_advanced_command,
emb_mysql_store_result,
emb_mysql_use_result,
+ emb_fetch_lengths
};
MYSQL * STDCALL
@@ -259,7 +277,7 @@ mysql_real_connect(MYSQL *mysql,const char *host, const char *user,
DBUG_RETURN(mysql);
error:
- DBUG_PRINT("error",("message: %u (%s)",mysql->last_errno,mysql->last_error));
+ DBUG_PRINT("error",("message: %u (%s)",mysql->net.last_errno,mysql->net.last_error));
{
/* Free alloced memory */
my_bool free_me=mysql->free_me;
@@ -320,7 +338,7 @@ void STDCALL mysql_close(MYSQL *mysql)
static my_bool STDCALL emb_mysql_read_query_result(MYSQL *mysql)
{
- if (mysql->last_errno)
+ if (mysql->net.last_errno)
return -1;
if (mysql->field_count)
@@ -342,7 +360,8 @@ static MYSQL_RES * STDCALL emb_mysql_store_result(MYSQL *mysql)
MYSQL_RES *result= mysql->result;
if (!result)
return 0;
-
+
+ result->methods= mysql->methods;
mysql->result= NULL;
*result->data->prev_ptr= 0;
result->eof= 1;
diff --git a/sql-common/client.c b/sql-common/client.c
index 7c0de2dba73..58d82b5b801 100644
--- a/sql-common/client.c
+++ b/sql-common/client.c
@@ -965,11 +965,25 @@ void mysql_read_default_options(struct st_mysql_options *options,
else the lengths are calculated from the offset between pointers.
**************************************************************************/
-void fetch_lengths(ulong *to, MYSQL_ROW column, uint field_count)
+static void cli_fetch_lengths(ulong *to, MYSQL_ROW column, uint field_count)
{
+ ulong *prev_length;
+ byte *start=0;
MYSQL_ROW end;
- for (end=column + field_count; column != end ; column++, to++)
- *to= *column ? strlen(*column) : 0;
+
+ prev_length=0; /* Keep gcc happy */
+ for (end=column + field_count + 1 ; column != end ; column++, to++)
+ {
+ if (!*column)
+ {
+ *to= 0; /* Null */
+ continue;
+ }
+ if (start) /* Found end of prev string */
+ *prev_length= (ulong) (*column-start-1);
+ start= *column;
+ prev_length= to;
+ }
}
/***************************************************************************
@@ -999,7 +1013,7 @@ unpack_fields(MYSQL_DATA *data,MEM_ROOT *alloc,uint fields,
for (row=data->data; row ; row = row->next,field++)
{
uchar *pos;
- fetch_lengths(&lengths[0], row->data, default_value ? 8 : 7);
+ cli_fetch_lengths(&lengths[0], row->data, default_value ? 8 : 7);
field->catalog = strdup_root(alloc,(char*) row->data[0]);
field->db = strdup_root(alloc,(char*) row->data[1]);
field->table = strdup_root(alloc,(char*) row->data[2]);
@@ -1040,7 +1054,7 @@ unpack_fields(MYSQL_DATA *data,MEM_ROOT *alloc,uint fields,
/* old protocol, for backward compatibility */
for (row=data->data; row ; row = row->next,field++)
{
- fetch_lengths(&lengths[0], row->data, default_value ? 6 : 5);
+ cli_fetch_lengths(&lengths[0], row->data, default_value ? 6 : 5);
field->org_table= field->table= strdup_root(alloc,(char*) row->data[0]);
field->name= strdup_root(alloc,(char*) row->data[1]);
field->length= (uint) uint3korr(row->data[2]);
@@ -1418,7 +1432,8 @@ static MYSQL_METHODS client_methods=
cli_mysql_read_query_result,
cli_advanced_command,
cli_mysql_store_result,
- cli_mysql_use_result
+ cli_mysql_use_result,
+ cli_fetch_lengths
};
MYSQL * STDCALL
@@ -2320,6 +2335,7 @@ static MYSQL_RES * STDCALL cli_mysql_store_result(MYSQL *mysql)
strmov(mysql->net.last_error, ER(mysql->net.last_errno));
DBUG_RETURN(0);
}
+ result->methods= mysql->methods;
result->eof=1; /* Marker for buffered */
result->lengths=(ulong*) (result+1);
if (!(result->data=read_rows(mysql,mysql->fields,mysql->field_count)))
@@ -2370,6 +2386,7 @@ static MYSQL_RES * STDCALL cli_mysql_use_result(MYSQL *mysql)
MYF(MY_WME | MY_ZEROFILL))))
DBUG_RETURN(0);
result->lengths=(ulong*) (result+1);
+ result->methods= mysql->methods;
if (!(result->row=(MYSQL_ROW)
my_malloc(sizeof(result->row[0])*(mysql->field_count+1), MYF(MY_WME))))
{ /* Ptrs: to one row */
diff --git a/sql/protocol.cc b/sql/protocol.cc
index b695409ec61..e90aa7585e2 100644
--- a/sql/protocol.cc
+++ b/sql/protocol.cc
@@ -83,6 +83,7 @@ void send_error(THD *thd, uint sql_errno, const char *err)
#ifdef EMBEDDED_LIBRARY
net->last_errno= sql_errno;
strmake(net->last_error, err, sizeof(net->last_error)-1);
+ strmov(net->sqlstate, mysql_errno_to_sqlstate(sql_errno));
#else
if (net->vio == 0)
@@ -230,6 +231,7 @@ net_printf(THD *thd, uint errcode, ...)
#else
net->last_errno= errcode;
strmake(net->last_error, text_pos, length);
+ strmake(net->sqlstate, mysql_errno_to_sqlstate(errcode), SQLSTATE_LENGTH);
#endif
thd->is_fatal_error=0; // Error message is given
DBUG_VOID_RETURN;