SCRUM - adding client into embedded server
error handling fixed fetch_lengths made to work differently in embedded and client cases
This commit is contained in:
parent
2e35e6f866
commit
a4f899dfc0
@ -250,9 +250,6 @@ typedef struct st_mysql
|
|||||||
const struct st_mysql_methods *methods;
|
const struct st_mysql_methods *methods;
|
||||||
struct st_mysql_res *result;
|
struct st_mysql_res *result;
|
||||||
void *thd;
|
void *thd;
|
||||||
unsigned int last_errno;
|
|
||||||
char *last_error;
|
|
||||||
char sqlstate[SQLSTATE_LENGTH+1]; /* Used by embedded server */
|
|
||||||
} MYSQL;
|
} MYSQL;
|
||||||
|
|
||||||
typedef struct st_mysql_res {
|
typedef struct st_mysql_res {
|
||||||
@ -267,6 +264,7 @@ typedef struct st_mysql_res {
|
|||||||
MYSQL_ROW row; /* If unbuffered read */
|
MYSQL_ROW row; /* If unbuffered read */
|
||||||
MYSQL_ROW current_row; /* buffer to current row */
|
MYSQL_ROW current_row; /* buffer to current row */
|
||||||
my_bool eof; /* Used by mysql_fetch_row */
|
my_bool eof; /* Used by mysql_fetch_row */
|
||||||
|
const struct st_mysql_methods *methods;
|
||||||
} MYSQL_RES;
|
} MYSQL_RES;
|
||||||
|
|
||||||
#define MAX_MYSQL_MANAGER_ERR 256
|
#define MAX_MYSQL_MANAGER_ERR 256
|
||||||
@ -552,6 +550,7 @@ typedef struct st_mysql_methods
|
|||||||
ulong arg_length, my_bool skip_check);
|
ulong arg_length, my_bool skip_check);
|
||||||
MYSQL_RES * STDCALL (*store_result)(MYSQL *mysql);
|
MYSQL_RES * STDCALL (*store_result)(MYSQL *mysql);
|
||||||
MYSQL_RES * STDCALL (*use_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_METHODS;
|
||||||
|
|
||||||
MYSQL_STMT * STDCALL mysql_prepare(MYSQL * mysql, const char *query,
|
MYSQL_STMT * STDCALL mysql_prepare(MYSQL * mysql, const char *query,
|
||||||
|
@ -31,7 +31,6 @@ void free_rows(MYSQL_DATA *cur);
|
|||||||
MYSQL_DATA *read_rows (MYSQL *mysql,MYSQL_FIELD *fields,
|
MYSQL_DATA *read_rows (MYSQL *mysql,MYSQL_FIELD *fields,
|
||||||
uint field_count);
|
uint field_count);
|
||||||
my_bool mysql_autenticate(MYSQL *mysql, const char *passwd);
|
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 free_old_query(MYSQL *mysql);
|
||||||
void end_server(MYSQL *mysql);
|
void end_server(MYSQL *mysql);
|
||||||
my_bool mysql_reconnect(MYSQL *mysql);
|
my_bool mysql_reconnect(MYSQL *mysql);
|
||||||
|
@ -868,7 +868,7 @@ mysql_fetch_lengths(MYSQL_RES *res)
|
|||||||
if (!(column=res->current_row))
|
if (!(column=res->current_row))
|
||||||
return 0; /* Something is wrong */
|
return 0; /* Something is wrong */
|
||||||
if (res->data)
|
if (res->data)
|
||||||
fetch_lengths(res->lengths, column, res->field_count);
|
(*res->methods->fetch_lengths)(res->lengths, column, res->field_count);
|
||||||
return res->lengths;
|
return res->lengths;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -979,6 +979,7 @@ mysql_list_fields(MYSQL *mysql, const char *table, const char *wild)
|
|||||||
free_rows(query);
|
free_rows(query);
|
||||||
DBUG_RETURN(NULL);
|
DBUG_RETURN(NULL);
|
||||||
}
|
}
|
||||||
|
result->methods= mysql->methods;
|
||||||
result->field_alloc=mysql->field_alloc;
|
result->field_alloc=mysql->field_alloc;
|
||||||
mysql->fields=0;
|
mysql->fields=0;
|
||||||
result->field_count = (uint) query->rows;
|
result->field_count = (uint) query->rows;
|
||||||
@ -1704,6 +1705,7 @@ mysql_prepare_result(MYSQL_STMT *stmt)
|
|||||||
MYF(MY_WME | MY_ZEROFILL))))
|
MYF(MY_WME | MY_ZEROFILL))))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
result->methods= stmt->mysql->methods;
|
||||||
result->eof=1; /* Marker for buffered */
|
result->eof=1; /* Marker for buffered */
|
||||||
result->fields= stmt->fields;
|
result->fields= stmt->fields;
|
||||||
result->field_count= stmt->field_count;
|
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);
|
set_stmt_error(stmt, CR_OUT_OF_MEMORY, unknown_sqlstate);
|
||||||
DBUG_RETURN(1);
|
DBUG_RETURN(1);
|
||||||
}
|
}
|
||||||
|
result->methods= mysql->methods;
|
||||||
stmt->result_buffered= 1;
|
stmt->result_buffered= 1;
|
||||||
if (!(result->data= read_binary_rows(stmt)))
|
if (!(result->data= read_binary_rows(stmt)))
|
||||||
{
|
{
|
||||||
|
@ -76,8 +76,13 @@ emb_advanced_command(MYSQL *mysql, enum enum_server_command command,
|
|||||||
if (!skip_check)
|
if (!skip_check)
|
||||||
result= thd->net.last_errno ? -1 : 0;
|
result= thd->net.last_errno ? -1 : 0;
|
||||||
|
|
||||||
mysql->last_error= thd->net.last_error;
|
if ((mysql->net.last_errno= thd->net.last_errno))
|
||||||
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;
|
mysql->warning_count= ((THD*)mysql->thd)->total_warn_count;
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
@ -292,7 +297,6 @@ void init_embedded_mysql(MYSQL *mysql, int client_flag, char *db)
|
|||||||
{
|
{
|
||||||
THD *thd = (THD *)mysql->thd;
|
THD *thd = (THD *)mysql->thd;
|
||||||
thd->mysql= mysql;
|
thd->mysql= mysql;
|
||||||
mysql->last_error= thd->net.last_error;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void *create_embedded_thd(int client_flag, char *db)
|
void *create_embedded_thd(int client_flag, char *db)
|
||||||
|
@ -144,25 +144,42 @@ static inline int mysql_init_charset(MYSQL *mysql)
|
|||||||
|
|
||||||
if (!mysql->charset)
|
if (!mysql->charset)
|
||||||
{
|
{
|
||||||
mysql->last_errno=CR_CANT_READ_CHARSET;
|
mysql->net.last_errno=CR_CANT_READ_CHARSET;
|
||||||
strmov(mysql->sqlstate, "HY0000");
|
strmov(mysql->net.sqlstate, "HY0000");
|
||||||
if (mysql->options.charset_dir)
|
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",
|
charset_name ? charset_name : "unknown",
|
||||||
mysql->options.charset_dir);
|
mysql->options.charset_dir);
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
char cs_dir_name[FN_REFLEN];
|
char cs_dir_name[FN_REFLEN];
|
||||||
get_charsets_dir(cs_dir_name);
|
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",
|
charset_name ? charset_name : "unknown",
|
||||||
cs_dir_name);
|
cs_dir_name);
|
||||||
}
|
}
|
||||||
return mysql->last_errno;
|
return mysql->net.last_errno;
|
||||||
}
|
}
|
||||||
return 0;
|
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()
|
** Note that the mysql argument must be initialized with mysql_init()
|
||||||
** before calling mysql_real_connect !
|
** before calling mysql_real_connect !
|
||||||
@ -178,6 +195,7 @@ static MYSQL_METHODS embedded_methods=
|
|||||||
emb_advanced_command,
|
emb_advanced_command,
|
||||||
emb_mysql_store_result,
|
emb_mysql_store_result,
|
||||||
emb_mysql_use_result,
|
emb_mysql_use_result,
|
||||||
|
emb_fetch_lengths
|
||||||
};
|
};
|
||||||
|
|
||||||
MYSQL * STDCALL
|
MYSQL * STDCALL
|
||||||
@ -259,7 +277,7 @@ mysql_real_connect(MYSQL *mysql,const char *host, const char *user,
|
|||||||
DBUG_RETURN(mysql);
|
DBUG_RETURN(mysql);
|
||||||
|
|
||||||
error:
|
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 */
|
/* Free alloced memory */
|
||||||
my_bool free_me=mysql->free_me;
|
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)
|
static my_bool STDCALL emb_mysql_read_query_result(MYSQL *mysql)
|
||||||
{
|
{
|
||||||
if (mysql->last_errno)
|
if (mysql->net.last_errno)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
if (mysql->field_count)
|
if (mysql->field_count)
|
||||||
@ -343,6 +361,7 @@ static MYSQL_RES * STDCALL emb_mysql_store_result(MYSQL *mysql)
|
|||||||
if (!result)
|
if (!result)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
result->methods= mysql->methods;
|
||||||
mysql->result= NULL;
|
mysql->result= NULL;
|
||||||
*result->data->prev_ptr= 0;
|
*result->data->prev_ptr= 0;
|
||||||
result->eof= 1;
|
result->eof= 1;
|
||||||
|
@ -965,11 +965,25 @@ void mysql_read_default_options(struct st_mysql_options *options,
|
|||||||
else the lengths are calculated from the offset between pointers.
|
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;
|
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++)
|
for (row=data->data; row ; row = row->next,field++)
|
||||||
{
|
{
|
||||||
uchar *pos;
|
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->catalog = strdup_root(alloc,(char*) row->data[0]);
|
||||||
field->db = strdup_root(alloc,(char*) row->data[1]);
|
field->db = strdup_root(alloc,(char*) row->data[1]);
|
||||||
field->table = strdup_root(alloc,(char*) row->data[2]);
|
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 */
|
/* old protocol, for backward compatibility */
|
||||||
for (row=data->data; row ; row = row->next,field++)
|
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->org_table= field->table= strdup_root(alloc,(char*) row->data[0]);
|
||||||
field->name= strdup_root(alloc,(char*) row->data[1]);
|
field->name= strdup_root(alloc,(char*) row->data[1]);
|
||||||
field->length= (uint) uint3korr(row->data[2]);
|
field->length= (uint) uint3korr(row->data[2]);
|
||||||
@ -1418,7 +1432,8 @@ static MYSQL_METHODS client_methods=
|
|||||||
cli_mysql_read_query_result,
|
cli_mysql_read_query_result,
|
||||||
cli_advanced_command,
|
cli_advanced_command,
|
||||||
cli_mysql_store_result,
|
cli_mysql_store_result,
|
||||||
cli_mysql_use_result
|
cli_mysql_use_result,
|
||||||
|
cli_fetch_lengths
|
||||||
};
|
};
|
||||||
|
|
||||||
MYSQL * STDCALL
|
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));
|
strmov(mysql->net.last_error, ER(mysql->net.last_errno));
|
||||||
DBUG_RETURN(0);
|
DBUG_RETURN(0);
|
||||||
}
|
}
|
||||||
|
result->methods= mysql->methods;
|
||||||
result->eof=1; /* Marker for buffered */
|
result->eof=1; /* Marker for buffered */
|
||||||
result->lengths=(ulong*) (result+1);
|
result->lengths=(ulong*) (result+1);
|
||||||
if (!(result->data=read_rows(mysql,mysql->fields,mysql->field_count)))
|
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))))
|
MYF(MY_WME | MY_ZEROFILL))))
|
||||||
DBUG_RETURN(0);
|
DBUG_RETURN(0);
|
||||||
result->lengths=(ulong*) (result+1);
|
result->lengths=(ulong*) (result+1);
|
||||||
|
result->methods= mysql->methods;
|
||||||
if (!(result->row=(MYSQL_ROW)
|
if (!(result->row=(MYSQL_ROW)
|
||||||
my_malloc(sizeof(result->row[0])*(mysql->field_count+1), MYF(MY_WME))))
|
my_malloc(sizeof(result->row[0])*(mysql->field_count+1), MYF(MY_WME))))
|
||||||
{ /* Ptrs: to one row */
|
{ /* Ptrs: to one row */
|
||||||
|
@ -83,6 +83,7 @@ void send_error(THD *thd, uint sql_errno, const char *err)
|
|||||||
#ifdef EMBEDDED_LIBRARY
|
#ifdef EMBEDDED_LIBRARY
|
||||||
net->last_errno= sql_errno;
|
net->last_errno= sql_errno;
|
||||||
strmake(net->last_error, err, sizeof(net->last_error)-1);
|
strmake(net->last_error, err, sizeof(net->last_error)-1);
|
||||||
|
strmov(net->sqlstate, mysql_errno_to_sqlstate(sql_errno));
|
||||||
#else
|
#else
|
||||||
|
|
||||||
if (net->vio == 0)
|
if (net->vio == 0)
|
||||||
@ -230,6 +231,7 @@ net_printf(THD *thd, uint errcode, ...)
|
|||||||
#else
|
#else
|
||||||
net->last_errno= errcode;
|
net->last_errno= errcode;
|
||||||
strmake(net->last_error, text_pos, length);
|
strmake(net->last_error, text_pos, length);
|
||||||
|
strmake(net->sqlstate, mysql_errno_to_sqlstate(errcode), SQLSTATE_LENGTH);
|
||||||
#endif
|
#endif
|
||||||
thd->is_fatal_error=0; // Error message is given
|
thd->is_fatal_error=0; // Error message is given
|
||||||
DBUG_VOID_RETURN;
|
DBUG_VOID_RETURN;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user