]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
Added dict_transaction_commit_async().
authorTimo Sirainen <tss@iki.fi>
Mon, 19 Jan 2009 21:03:25 +0000 (16:03 -0500)
committerTimo Sirainen <tss@iki.fi>
Mon, 19 Jan 2009 21:03:25 +0000 (16:03 -0500)
--HG--
branch : HEAD

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

index fb5fd0099e36c74738e01dfcf1fbc2013e3ca305..d1738e042bf95f700e8e9062d069311ba32bc47c 100644 (file)
@@ -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)
index 983d84c6d0c7ac8bf08e1841da951e52447675ec..ad1aaafe17d50cc2491cfd058a237b12ec774dd4 100644 (file)
@@ -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;
index 79e29f62440305c4cb62071e810720441c21870c..e4df211f68bc3df9dc243345d397323a813bffb9 100644 (file)
@@ -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,
index f520f2b39f493aae48d1b03e42667d3cd89248e6..94b7f9f4c54148b2749b3bf4d349409c986b9baf 100644 (file)
@@ -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;
index 1ca692c41b202dfdcf02cc24e1b59bfe3a9db91d..13939ba8b94d9551db683a15d8087b6dc4a4aa96 100644 (file)
@@ -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)
index 34c9019e5b7f5726896e0a687dd507875c4e47f0..cb91e09828dd6ba74206e8700e4df5b00d328c98 100644 (file)
@@ -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);