dovecot-1.2: Added dict_transaction_commit_async().

dovecot at dovecot.org dovecot at dovecot.org
Mon Jan 19 23:03:57 EET 2009


details:   http://hg.dovecot.org/dovecot-1.2/rev/d8a56ea9f408
changeset: 8660:d8a56ea9f408
user:      Timo Sirainen <tss at iki.fi>
date:      Mon Jan 19 16:03:25 2009 -0500
description:
Added dict_transaction_commit_async().

diffstat:

6 files changed, 33 insertions(+), 8 deletions(-)
src/lib-dict/dict-client.c  |   20 ++++++++++++++++----
src/lib-dict/dict-db.c      |    3 ++-
src/lib-dict/dict-private.h |    3 ++-
src/lib-dict/dict-sql.c     |    3 ++-
src/lib-dict/dict.c         |   10 +++++++++-
src/lib-dict/dict.h         |    2 ++

diffs (122 lines):

diff -r c349c4a106af -r d8a56ea9f408 src/lib-dict/dict-client.c
--- a/src/lib-dict/dict-client.c	Mon Jan 19 15:50:40 2009 -0500
+++ b/src/lib-dict/dict-client.c	Mon Jan 19 16:03:25 2009 -0500
@@ -25,6 +25,7 @@ struct client_dict {
 	struct istream *input;
 	struct ostream *output;
 
+	unsigned int skip_lines;
 	unsigned int connect_counter;
 	unsigned int transaction_id_counter;
 
@@ -224,8 +225,12 @@ static char *client_dict_read_line(struc
 
 	while ((ret = i_stream_read(dict->input)) > 0) {
 		line = i_stream_next_line(dict->input);
-		if (line != NULL)
-			return line;
+		if (line != NULL) {
+			if (dict->skip_lines == 0)
+				return line;
+			/* ignore this reply and wait for the next line */
+			dict->skip_lines--;
+		}
 	}
 	i_assert(ret < 0);
 
@@ -455,7 +460,8 @@ client_dict_transaction_init(struct dict
 	return &ctx->ctx;
 }
 
-static int client_dict_transaction_commit(struct dict_transaction_context *_ctx)
+static int client_dict_transaction_commit(struct dict_transaction_context *_ctx,
+					  bool async)
 {
 	struct client_dict_transaction_context *ctx =
 		(struct client_dict_transaction_context *)_ctx;
@@ -470,7 +476,13 @@ static int client_dict_transaction_commi
 					DICT_PROTOCOL_CMD_ROLLBACK, ctx->id);
 		if (client_dict_send_transaction_query(ctx, query) < 0)
 			ret = -1;
-		else if (ret == 0) {
+		else if (ret < 0) {
+			/* rollback sent, it has no reply */
+		} else if (async) {
+			/* don't wait for the reply. if we read it later,
+			   ignore it. */
+			dict->skip_lines++;
+		} else {
 			/* read reply */
 			line = client_dict_read_line(dict);
 			if (line == NULL || *line != DICT_PROTOCOL_REPLY_OK)
diff -r c349c4a106af -r d8a56ea9f408 src/lib-dict/dict-db.c
--- a/src/lib-dict/dict-db.c	Mon Jan 19 15:50:40 2009 -0500
+++ b/src/lib-dict/dict-db.c	Mon Jan 19 16:03:25 2009 -0500
@@ -371,7 +371,8 @@ db_dict_transaction_init(struct dict *_d
 	return &ctx->ctx;
 }
 
-static int db_dict_transaction_commit(struct dict_transaction_context *_ctx)
+static int db_dict_transaction_commit(struct dict_transaction_context *_ctx,
+				      bool async ATTR_UNUSED)
 {
 	struct db_dict_transaction_context *ctx =
 		(struct db_dict_transaction_context *)_ctx;
diff -r c349c4a106af -r d8a56ea9f408 src/lib-dict/dict-private.h
--- a/src/lib-dict/dict-private.h	Mon Jan 19 15:50:40 2009 -0500
+++ b/src/lib-dict/dict-private.h	Mon Jan 19 16:03:25 2009 -0500
@@ -20,7 +20,8 @@ struct dict_vfuncs {
 	void (*iterate_deinit)(struct dict_iterate_context *ctx);
 
 	struct dict_transaction_context *(*transaction_init)(struct dict *dict);
-	int (*transaction_commit)(struct dict_transaction_context *ctx);
+	int (*transaction_commit)(struct dict_transaction_context *ctx,
+				  bool async);
 	void (*transaction_rollback)(struct dict_transaction_context *ctx);
 
 	void (*set)(struct dict_transaction_context *ctx,
diff -r c349c4a106af -r d8a56ea9f408 src/lib-dict/dict-sql.c
--- a/src/lib-dict/dict-sql.c	Mon Jan 19 15:50:40 2009 -0500
+++ b/src/lib-dict/dict-sql.c	Mon Jan 19 16:03:25 2009 -0500
@@ -462,7 +462,8 @@ sql_dict_transaction_init(struct dict *_
 	return &ctx->ctx;
 }
 
-static int sql_dict_transaction_commit(struct dict_transaction_context *_ctx)
+static int sql_dict_transaction_commit(struct dict_transaction_context *_ctx,
+				       bool async ATTR_UNUSED)
 {
 	struct sql_dict_transaction_context *ctx =
 		(struct sql_dict_transaction_context *)_ctx;
diff -r c349c4a106af -r d8a56ea9f408 src/lib-dict/dict.c
--- a/src/lib-dict/dict.c	Mon Jan 19 15:50:40 2009 -0500
+++ b/src/lib-dict/dict.c	Mon Jan 19 16:03:25 2009 -0500
@@ -141,7 +141,15 @@ int dict_transaction_commit(struct dict_
 	struct dict_transaction_context *ctx = *_ctx;
 
 	*_ctx = NULL;
-	return ctx->dict->v.transaction_commit(ctx);
+	return ctx->dict->v.transaction_commit(ctx, FALSE);
+}
+
+void dict_transaction_commit_async(struct dict_transaction_context **_ctx)
+{
+	struct dict_transaction_context *ctx = *_ctx;
+
+	*_ctx = NULL;
+	ctx->dict->v.transaction_commit(ctx, TRUE);
 }
 
 void dict_transaction_rollback(struct dict_transaction_context **_ctx)
diff -r c349c4a106af -r d8a56ea9f408 src/lib-dict/dict.h
--- a/src/lib-dict/dict.h	Mon Jan 19 15:50:40 2009 -0500
+++ b/src/lib-dict/dict.h	Mon Jan 19 16:03:25 2009 -0500
@@ -52,6 +52,8 @@ struct dict_transaction_context *dict_tr
 struct dict_transaction_context *dict_transaction_begin(struct dict *dict);
 /* Commit the transaction. Returns 0 if ok, -1 if failed. */
 int dict_transaction_commit(struct dict_transaction_context **ctx);
+/* Commit the transaction, but don't wait to see if it finishes successfully. */
+void dict_transaction_commit_async(struct dict_transaction_context **ctx);
 /* Rollback all changes made in transaction. */
 void dict_transaction_rollback(struct dict_transaction_context **ctx);
 


More information about the dovecot-cvs mailing list