changeset 8660:d8a56ea9f408 HEAD

Added dict_transaction_commit_async().
author Timo Sirainen <tss@iki.fi>
date Mon, 19 Jan 2009 16:03:25 -0500
parents c349c4a106af
children aad162a02672
files src/lib-dict/dict-client.c src/lib-dict/dict-db.c src/lib-dict/dict-private.h src/lib-dict/dict-sql.c src/lib-dict/dict.c src/lib-dict/dict.h
diffstat 6 files changed, 33 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- 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 istream *input;
 	struct ostream *output;
 
+	unsigned int skip_lines;
 	unsigned int connect_counter;
 	unsigned int transaction_id_counter;
 
@@ -224,8 +225,12 @@
 
 	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 @@
 	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 @@
 					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)
--- 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 @@
 	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;
--- 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 @@
 	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,
--- 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 @@
 	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;
--- 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 @@
 	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)
--- 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_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);