summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--client/mysql.cc1
-rw-r--r--include/sql_common.h1
-rw-r--r--libmysql/libmysql.c2
-rw-r--r--libmysqld/lib_sql.cc10
-rw-r--r--sql-common/client.c28
-rw-r--r--sql/log.cc10
6 files changed, 35 insertions, 17 deletions
diff --git a/client/mysql.cc b/client/mysql.cc
index 1d673348f58..682ab077b94 100644
--- a/client/mysql.cc
+++ b/client/mysql.cc
@@ -421,6 +421,7 @@ int main(int argc,char *argv[])
if (mysql_server_init(embedded_server_arg_count, embedded_server_args,
(char**) embedded_server_groups))
{
+ put_error(NULL);
free_defaults(defaults_argv);
my_end(0);
exit(1);
diff --git a/include/sql_common.h b/include/sql_common.h
index 56e7305130f..9e43d076ba9 100644
--- a/include/sql_common.h
+++ b/include/sql_common.h
@@ -15,6 +15,7 @@
extern const char *unknown_sqlstate;
+extern const char *cant_connect_sqlstate;
extern const char *not_error_sqlstate;
#ifdef __cplusplus
diff --git a/libmysql/libmysql.c b/libmysql/libmysql.c
index f5ac1c09248..a1fb1d8a3c4 100644
--- a/libmysql/libmysql.c
+++ b/libmysql/libmysql.c
@@ -1500,7 +1500,7 @@ my_ulonglong STDCALL mysql_insert_id(MYSQL *mysql)
const char *STDCALL mysql_sqlstate(MYSQL *mysql)
{
- return mysql->net.sqlstate;
+ return mysql ? mysql->net.sqlstate : cant_connect_sqlstate;
}
uint STDCALL mysql_warning_count(MYSQL *mysql)
diff --git a/libmysqld/lib_sql.cc b/libmysqld/lib_sql.cc
index b467345b5d5..bef51a33d75 100644
--- a/libmysqld/lib_sql.cc
+++ b/libmysqld/lib_sql.cc
@@ -38,6 +38,8 @@ C_MODE_START
#include <sql_common.h>
#include "embedded_priv.h"
+extern unsigned int mysql_server_last_errno;
+extern char mysql_server_last_error[MYSQL_ERRMSG_SIZE];
static my_bool emb_read_query_result(MYSQL *mysql);
@@ -1115,3 +1117,11 @@ bool Protocol::net_store_data(const uchar *from, size_t length)
return FALSE;
}
+
+void vprint_msg_to_log(enum loglevel level __attribute__((unused)),
+ const char *format, va_list argsi)
+{
+ vsnprintf(mysql_server_last_error, sizeof(mysql_server_last_error),
+ format, argsi);
+ mysql_server_last_errno= CR_UNKNOWN_ERROR;
+}
diff --git a/sql-common/client.c b/sql-common/client.c
index 1a0f9c64d7d..e5667fa6735 100644
--- a/sql-common/client.c
+++ b/sql-common/client.c
@@ -112,6 +112,7 @@ uint mysql_port=0;
char *mysql_unix_port= 0;
const char *unknown_sqlstate= "HY000";
const char *not_error_sqlstate= "00000";
+const char *cant_connect_sqlstate= "08001";
#ifdef HAVE_SMEM
char *shared_memory_base_name= 0;
const char *def_shared_memory_base_name= default_shared_memory_base_name;
@@ -126,6 +127,9 @@ static int wait_for_data(my_socket fd, uint timeout);
CHARSET_INFO *default_client_charset_info = &my_charset_latin1;
+/* Server error code and message */
+unsigned int mysql_server_last_errno;
+char mysql_server_last_error[MYSQL_ERRMSG_SIZE];
/****************************************************************************
A modified version of connect(). my_connect() allows you to specify
@@ -288,11 +292,18 @@ void set_mysql_error(MYSQL *mysql, int errcode, const char *sqlstate)
DBUG_PRINT("enter", ("error :%d '%s'", errcode, ER(errcode)));
DBUG_ASSERT(mysql != 0);
- net= &mysql->net;
- net->client_last_errno= errcode;
- strmov(net->client_last_error, ER(errcode));
- strmov(net->sqlstate, sqlstate);
-
+ if (mysql)
+ {
+ net= &mysql->net;
+ net->client_last_errno= errcode;
+ strmov(net->client_last_error, ER(errcode));
+ strmov(net->sqlstate, sqlstate);
+ }
+ else
+ {
+ mysql_server_last_errno= errcode;
+ strmov(mysql_server_last_error, ER(errcode));
+ }
DBUG_VOID_RETURN;
}
@@ -1489,7 +1500,10 @@ mysql_init(MYSQL *mysql)
if (!mysql)
{
if (!(mysql=(MYSQL*) my_malloc(sizeof(*mysql),MYF(MY_WME | MY_ZEROFILL))))
+ {
+ set_mysql_error(NULL, CR_OUT_OF_MEMORY, unknown_sqlstate);
return 0;
+ }
mysql->free_me=1;
}
else
@@ -3079,13 +3093,13 @@ unsigned int STDCALL mysql_num_fields(MYSQL_RES *res)
uint STDCALL mysql_errno(MYSQL *mysql)
{
- return mysql->net.client_last_errno;
+ return mysql ? mysql->net.client_last_errno : mysql_server_last_errno;
}
const char * STDCALL mysql_error(MYSQL *mysql)
{
- return mysql->net.client_last_error;
+ return mysql ? mysql->net.client_last_error : mysql_server_last_error;
}
diff --git a/sql/log.cc b/sql/log.cc
index 99ac9cf509d..cddcf8eced2 100644
--- a/sql/log.cc
+++ b/sql/log.cc
@@ -4378,15 +4378,7 @@ static void print_buffer_to_nt_eventlog(enum loglevel level, char *buff,
return an error (e.g. logging to the log tables)
*/
-#ifdef EMBEDDED_LIBRARY
-int vprint_msg_to_log(enum loglevel level __attribute__((unused)),
- const char *format __attribute__((unused)),
- va_list argsi __attribute__((unused)))
-{
- DBUG_ENTER("vprint_msg_to_log");
- DBUG_RETURN(0);
-}
-#else /*!EMBEDDED_LIBRARY*/
+#ifndef EMBEDDED_LIBRARY
static void print_buffer_to_file(enum loglevel level, const char *buffer)
{
time_t skr;