dovecot-1.2: pgsql: Don't use BEGIN/COMMIT if transaction has on...

dovecot at dovecot.org dovecot at dovecot.org
Sat Jan 17 20:56:34 EET 2009


details:   http://hg.dovecot.org/dovecot-1.2/rev/7c568270c8df
changeset: 8646:7c568270c8df
user:      Timo Sirainen <tss at iki.fi>
date:      Sat Jan 17 12:31:28 2009 -0500
description:
pgsql: Don't use BEGIN/COMMIT if transaction has only a single change.

diffstat:

1 file changed, 20 insertions(+)
src/lib-sql/driver-pgsql.c |   20 ++++++++++++++++++++

diffs (67 lines):

diff -r a90d1488bacf -r 7c568270c8df src/lib-sql/driver-pgsql.c
--- a/src/lib-sql/driver-pgsql.c	Sat Jan 17 12:30:54 2009 -0500
+++ b/src/lib-sql/driver-pgsql.c	Sat Jan 17 12:31:28 2009 -0500
@@ -74,6 +74,7 @@ struct pgsql_transaction_context {
 	sql_commit_callback_t *callback;
 	void *context;
 
+	char *first_update;
 	const char *error;
 
 	unsigned int opened:1;
@@ -83,6 +84,8 @@ extern struct sql_db driver_pgsql_db;
 extern struct sql_db driver_pgsql_db;
 extern struct sql_result driver_pgsql_result;
 
+static void
+transaction_update_callback(struct sql_result *result, void *context);
 static void
 driver_pgsql_query_full(struct sql_db *db, const char *query,
 			sql_query_callback_t *callback, void *context,
@@ -384,6 +387,7 @@ static void send_query(struct pgsql_resu
 	i_assert(!db->querying);
 	i_assert(db->connected);
 
+	i_warning("%s", query);
 	if (!PQsendQuery(db->pg, query)) {
 		db->connected = FALSE;
 		result_finish(result);
@@ -893,6 +897,12 @@ driver_pgsql_transaction_commit_s(struct
 		(struct pgsql_transaction_context *)_ctx;
 	struct sql_result *result;
 
+	if (ctx->first_update != NULL) {
+		sql_query(_ctx->db, ctx->first_update,
+			  transaction_update_callback, ctx);
+		i_free_and_null(ctx->first_update);
+	}
+
 	if (ctx->failed) {
 		*error_r = ctx->error;
 		if (ctx->opened)
@@ -922,6 +932,7 @@ driver_pgsql_transaction_rollback(struct
 
 	if (ctx->opened)
 		sql_exec(_ctx->db, "ROLLBACK");
+	i_free(ctx->first_update);
 	i_free(ctx);
 }
 
@@ -946,8 +957,17 @@ driver_pgsql_update(struct sql_transacti
 		return;
 
 	if (!ctx->opened) {
+		if (ctx->first_update == NULL) {
+			/* delay sending the first update in case there is
+			   only one to be sent and we don't need BEGIN/COMMIT */
+			ctx->first_update = i_strdup(query);
+			return;
+		}
 		ctx->opened = TRUE;
 		sql_query(_ctx->db, "BEGIN", transaction_update_callback, ctx);
+		sql_query(_ctx->db, ctx->first_update,
+			  transaction_update_callback, ctx);
+		i_free_and_null(ctx->first_update);
 	}
 
 	driver_pgsql_query_full(_ctx->db, query,


More information about the dovecot-cvs mailing list