Mercurial > dovecot > original-hg > dovecot-1.2
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);