From c7509a7c72050884c4e1589b2ffd9d702a122e02 Mon Sep 17 00:00:00 2001 From: Timo Sirainen Date: Fri, 23 Jul 2004 21:50:18 +0300 Subject: [PATCH] db_port and db_client_flags weren't integers. Reconnects now immediately if mysql_query() failed because connection was lost. --HG-- branch : HEAD --- src/auth/db-mysql.c | 38 ++++++++++++++++++++++++++------------ src/auth/db-mysql.h | 6 ++++-- 2 files changed, 30 insertions(+), 14 deletions(-) diff --git a/src/auth/db-mysql.c b/src/auth/db-mysql.c index 70cbd1e3d9..8f7ecee3d7 100644 --- a/src/auth/db-mysql.c +++ b/src/auth/db-mysql.c @@ -4,7 +4,6 @@ #undef HAVE_CONFIG_H #if defined(PASSDB_MYSQL) || defined(USERDB_MYSQL) - #include "common.h" #include "network.h" #include "str.h" @@ -51,7 +50,7 @@ static void mysql_conn_close(struct mysql_connection *conn); void db_mysql_query(struct mysql_connection *conn, const char *query, struct mysql_request *request) { - MYSQL_RES *res; + MYSQL_RES *res = NULL; int failed; if (verbose_debug) @@ -64,23 +63,38 @@ void db_mysql_query(struct mysql_connection *conn, const char *query, } } - if (mysql_query(conn->mysql, query) == 0) { + failed = mysql_query(conn->mysql, query) != 0; + if (failed) { + /* query failed */ + switch (mysql_errno(conn->mysql)) { + case CR_SERVER_GONE_ERROR: + case CR_SERVER_LOST: + /* connection lost - try immediate reconnect */ + if (!mysql_conn_open(conn)) + break; + if (mysql_query(conn->mysql, query) == 0) { + failed = FALSE; + break; + } + /* query failed, fallback to error handler */ + default: + i_error("MySQL: Error executing query \"%s\": %s", + query, mysql_error(conn->mysql)); + break; + } + } + + if (!failed) { /* query succeeded */ - if ((res = mysql_store_result(conn->mysql))) - failed = FALSE; - else { + if ((res = mysql_store_result(conn->mysql)) == NULL) { /* something went wrong on storing result */ + failed = TRUE; i_error("MySQL: Error retrieving results: %s", mysql_error(conn->mysql)); } - } else { - /* query failed */ - i_error("MySQL: Error executing query \"%s\": %s", query, - mysql_error(conn->mysql)); - failed = TRUE; } - request->callback(conn, request, failed ? NULL : res); + request->callback(conn, request, res); if (!failed) mysql_free_result(res); i_free(request); diff --git a/src/auth/db-mysql.h b/src/auth/db-mysql.h index 7b252069cc..85f405103a 100644 --- a/src/auth/db-mysql.h +++ b/src/auth/db-mysql.h @@ -3,8 +3,10 @@ #ifdef HAVE_MYSQL_MYSQL_H # include +# include #else # include +# include #endif struct mysql_connection; @@ -16,12 +18,12 @@ typedef void mysql_query_callback_t(struct mysql_connection *conn, struct mysql_settings { const char *db_host; - const char *db_port; + unsigned int db_port; const char *db_unix_socket; const char *db; const char *db_user; const char *db_passwd; - const char *db_client_flags; + unsigned int db_client_flags; const char *password_query; const char *user_query; const char *default_pass_scheme; -- 2.47.3