]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
virtual plugin: Fixed saving/copying messages to virtual mailbox.
authorTimo Sirainen <tss@iki.fi>
Sun, 31 Mar 2013 14:25:10 +0000 (17:25 +0300)
committerTimo Sirainen <tss@iki.fi>
Sun, 31 Mar 2013 14:25:10 +0000 (17:25 +0300)
src/lib-storage/mail-storage.c
src/plugins/virtual/virtual-save.c

index 560720648113eecdfbeb32fe1079e5cefd69bd23..ebae25cf2513333a388ab7cbb4f640879f2504f7 100644 (file)
@@ -1813,7 +1813,6 @@ int mailbox_transaction_commit_get_changes(
 {
        struct mailbox_transaction_context *t = *_t;
        unsigned int save_count = t->save_count;
-       bool assign_uids = (t->flags & MAILBOX_TRANSACTION_FLAG_ASSIGN_UIDS) != 0;
        int ret;
 
        t->box->transaction_count--;
@@ -1823,9 +1822,11 @@ int mailbox_transaction_commit_get_changes(
        T_BEGIN {
                ret = t->box->v.transaction_commit(t, changes_r);
        } T_END;
-       i_assert(ret < 0 ||
-                seq_range_count(&changes_r->saved_uids) == save_count ||
-                (array_count(&changes_r->saved_uids) == 0 && !assign_uids));
+       /* either all the saved messages get UIDs or none, because a) we
+          failed, b) MAILBOX_TRANSACTION_FLAG_ASSIGN_UIDS not set,
+          c) backend doesn't support it (e.g. virtual plugin) */
+       i_assert(seq_range_count(&changes_r->saved_uids) == save_count ||
+                array_count(&changes_r->saved_uids) == 0);
        if (ret < 0 && changes_r->pool != NULL)
                pool_unref(&changes_r->pool);
        return ret;
index 764e647b19f3223538611274b6bf495bf30ad36f..b2d2d408c67642fc14204d64752ede09ca331f4d 100644 (file)
@@ -113,7 +113,10 @@ int virtual_save_finish(struct mail_save_context *_ctx)
 {
        struct virtual_save_context *ctx = (struct virtual_save_context *)_ctx;
 
-       return mailbox_save_finish(&ctx->backend_save_ctx);
+       if (mailbox_save_finish(&ctx->backend_save_ctx) < 0)
+               return -1;
+       _ctx->unfinished = FALSE;
+       return 0;
 }
 
 void virtual_save_cancel(struct mail_save_context *_ctx)
@@ -122,6 +125,7 @@ void virtual_save_cancel(struct mail_save_context *_ctx)
 
        if (ctx->backend_save_ctx != NULL)
                mailbox_save_cancel(&ctx->backend_save_ctx);
+       _ctx->unfinished = FALSE;
 }
 
 void virtual_save_free(struct mail_save_context *_ctx)