From: Timo Sirainen Date: Mon, 19 Jan 2009 21:03:25 +0000 (-0500) Subject: Added dict_transaction_commit_async(). X-Git-Tag: 1.2.beta1~83 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=d3fce898d31ad40b554c91f3035a7f4d7d52ed52;p=thirdparty%2Fdovecot%2Fcore.git Added dict_transaction_commit_async(). --HG-- branch : HEAD --- diff --git a/src/lib-dict/dict-client.c b/src/lib-dict/dict-client.c index fb5fd0099e..d1738e042b 100644 --- a/src/lib-dict/dict-client.c +++ b/src/lib-dict/dict-client.c @@ -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(struct client_dict *dict) 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 *_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_commit(struct dict_transaction_context *_ctx) 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 --git a/src/lib-dict/dict-db.c b/src/lib-dict/dict-db.c index 983d84c6d0..ad1aaafe17 100644 --- a/src/lib-dict/dict-db.c +++ b/src/lib-dict/dict-db.c @@ -371,7 +371,8 @@ db_dict_transaction_init(struct dict *_dict) 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 --git a/src/lib-dict/dict-private.h b/src/lib-dict/dict-private.h index 79e29f6244..e4df211f68 100644 --- a/src/lib-dict/dict-private.h +++ b/src/lib-dict/dict-private.h @@ -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 --git a/src/lib-dict/dict-sql.c b/src/lib-dict/dict-sql.c index f520f2b39f..94b7f9f4c5 100644 --- a/src/lib-dict/dict-sql.c +++ b/src/lib-dict/dict-sql.c @@ -462,7 +462,8 @@ sql_dict_transaction_init(struct dict *_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 --git a/src/lib-dict/dict.c b/src/lib-dict/dict.c index 1ca692c41b..13939ba8b9 100644 --- a/src/lib-dict/dict.c +++ b/src/lib-dict/dict.c @@ -141,7 +141,15 @@ int dict_transaction_commit(struct dict_transaction_context **_ctx) 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 --git a/src/lib-dict/dict.h b/src/lib-dict/dict.h index 34c9019e5b..cb91e09828 100644 --- a/src/lib-dict/dict.h +++ b/src/lib-dict/dict.h @@ -52,6 +52,8 @@ void dict_iterate_deinit(struct dict_iterate_context **ctx); 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);