From afe09e48e0471e989f01b4fe4125d2fd91db2ab8 Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 17 May 2004 12:05:57 +0500 Subject: Proposed fix for #3744 (embedded server, wrong error message if database is missing) libmysqld/embedded_priv.h: embedded_get_error interface added libmysqld/lib_sql.cc: embedded_get_error implementation/using added libmysqld/libmysqld.c: embedded_get_error call added --- libmysqld/embedded_priv.h | 1 + libmysqld/lib_sql.cc | 31 +++++++++++++++++++------------ libmysqld/libmysqld.c | 1 + 3 files changed, 21 insertions(+), 12 deletions(-) (limited to 'libmysqld') diff --git a/libmysqld/embedded_priv.h b/libmysqld/embedded_priv.h index 1608f4ed4ad..d4316dff63f 100644 --- a/libmysqld/embedded_priv.h +++ b/libmysqld/embedded_priv.h @@ -28,5 +28,6 @@ void init_embedded_mysql(MYSQL *mysql, int client_flag, char *db); void *create_embedded_thd(int client_flag, char *db); int check_embedded_connection(MYSQL *mysql); void free_old_query(MYSQL *mysql); +void embedded_get_error(MYSQL *mysql); extern MYSQL_METHODS embedded_methods; C_MODE_END diff --git a/libmysqld/lib_sql.cc b/libmysqld/lib_sql.cc index cfb50d3907a..137af80313a 100644 --- a/libmysqld/lib_sql.cc +++ b/libmysqld/lib_sql.cc @@ -42,6 +42,22 @@ C_MODE_START #include "errmsg.h" #include +void embedded_get_error(MYSQL *mysql) +{ + THD *thd=(THD *) mysql->thd; + NET *net= &mysql->net; + if ((net->last_errno= thd->net.last_errno)) + { + memcpy(net->last_error, thd->net.last_error, sizeof(net->last_error)); + memcpy(net->sqlstate, thd->net.sqlstate, sizeof(net->sqlstate)); + } + else + { + net->last_error[0]= 0; + strmov(net->sqlstate, not_error_sqlstate); + } +} + static my_bool emb_advanced_command(MYSQL *mysql, enum enum_server_command command, const char *header, ulong header_length, @@ -86,16 +102,7 @@ emb_advanced_command(MYSQL *mysql, enum enum_server_command command, if (!skip_check) result= thd->net.last_errno ? -1 : 0; - if ((net->last_errno= thd->net.last_errno)) - { - memcpy(net->last_error, thd->net.last_error, sizeof(net->last_error)); - memcpy(net->sqlstate, thd->net.sqlstate, sizeof(net->sqlstate)); - } - else - { - net->last_error[0]= 0; - strmov(net->sqlstate, not_error_sqlstate); - } + embedded_get_error(mysql); mysql->server_status= thd->server_status; mysql->warning_count= ((THD*)mysql->thd)->total_warn_count; return result; @@ -237,6 +244,7 @@ static void emb_free_embedded_thd(MYSQL *mysql) free_rows(thd->data); thread_count--; delete thd; + mysql->thd=0; } static const char * emb_read_statistics(MYSQL *mysql) @@ -496,8 +504,7 @@ int check_embedded_connection(MYSQL *mysql) thd->host= (char*)my_localhost; thd->host_or_ip= thd->host; thd->user= my_strdup(mysql->user, MYF(0)); - check_user(thd, COM_CONNECT, NULL, 0, thd->db, true); - return 0; + return check_user(thd, COM_CONNECT, NULL, 0, thd->db, true); } #else diff --git a/libmysqld/libmysqld.c b/libmysqld/libmysqld.c index 95f745aef5f..db9e828369d 100644 --- a/libmysqld/libmysqld.c +++ b/libmysqld/libmysqld.c @@ -232,6 +232,7 @@ mysql_real_connect(MYSQL *mysql,const char *host, const char *user, DBUG_RETURN(mysql); error: + embedded_get_error(mysql); DBUG_PRINT("error",("message: %u (%s)", mysql->net.last_errno, mysql->net.last_error)); { -- cgit v1.2.1