]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
db_port and db_client_flags weren't integers. Reconnects now immediately if
authorTimo Sirainen <tss@iki.fi>
Fri, 23 Jul 2004 18:50:18 +0000 (21:50 +0300)
committerTimo Sirainen <tss@iki.fi>
Fri, 23 Jul 2004 18:50:18 +0000 (21:50 +0300)
mysql_query() failed because connection was lost.

--HG--
branch : HEAD

src/auth/db-mysql.c
src/auth/db-mysql.h

index 70cbd1e3d98d50f35374fbce3048f3efd1dae842..8f7ecee3d77c4e97364d887745f2c1f318556a3a 100644 (file)
@@ -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);
index 7b252069ccf406b1859f213d78952df207417ba9..85f405103a26fb6021cc9760382f44b353630219 100644 (file)
@@ -3,8 +3,10 @@
 
 #ifdef HAVE_MYSQL_MYSQL_H
 #  include <mysql/mysql.h>
+#  include <mysql/errmsg.h>
 #else
 #  include <mysql.h>
+#  include <errmsg.h>
 #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;