dovecot-2.0: mysql: Enable CLIENT_MULTI_RESULTS

dovecot at dovecot.org dovecot at dovecot.org
Sat Mar 13 23:33:44 EET 2010


details:   http://hg.dovecot.org/dovecot-2.0/rev/612db456c090
changeset: 10904:612db456c090
user:      Timo Sirainen <tss at iki.fi>
date:      Sat Mar 13 23:33:40 2010 +0200
description:
mysql: Enable CLIENT_MULTI_RESULTS
Based on patch by Alain Williams

diffstat:

 src/lib-sql/driver-mysql.c |  20 +++++++++++++++++---
 1 files changed, 17 insertions(+), 3 deletions(-)

diffs (47 lines):

diff -r 6e639833c3fc -r 612db456c090 src/lib-sql/driver-mysql.c
--- a/src/lib-sql/driver-mysql.c	Sat Mar 13 22:54:41 2010 +0200
+++ b/src/lib-sql/driver-mysql.c	Sat Mar 13 23:33:40 2010 +0200
@@ -132,9 +132,11 @@
 	}
 
 	alarm(MYSQL_CONNECT_FAILURE_TIMEOUT);
+	/* CLIENT_MULTI_RESULTS allows the use of stored procedures */
 	failed = mysql_real_connect(conn->mysql, host, db->user, db->password,
 				    db->dbname, db->port, unix_socket,
-				    db->client_flags) == NULL;
+				    db->client_flags |
+				    CLIENT_MULTI_RESULTS) == NULL;
 	alarm(0);
 	if (failed) {
 		if (conn->connect_failure_count > 0) {
@@ -425,6 +427,7 @@
 	struct mysql_db *db = (struct mysql_db *)_db;
 	struct mysql_connection *conn;
 	struct mysql_result *result;
+	int ret;
 
 	result = i_new(struct mysql_result, 1);
 	result->api = driver_mysql_result;
@@ -438,9 +441,20 @@
 	case 1:
 		/* query ok */
 		result->result = mysql_store_result(conn->mysql);
-		if (result->result != NULL || mysql_errno(conn->mysql) == 0)
+
+		/* Because we've enabled CLIENT_MULTI_RESULTS, we need to read
+		   (ignore) extra results - there should not be any.
+		   ret is: -1 = done, >0 = error, 0 = more results. */
+		while ((ret = mysql_next_result(conn->mysql)) == 0) ;
+
+		if (ret < 0 &&
+		    (result->result != NULL || mysql_errno(conn->mysql) == 0))
 			break;
-		/* fallback */
+
+		/* failed */
+		if (result->result != NULL)
+			mysql_free_result(result->result);
+		/* fall through */
 	case -1:
 		/* error */
 		result->api = driver_mysql_error_result;


More information about the dovecot-cvs mailing list