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