]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
mailbox_transaction_commit_get_uids() changed to _get_changes() with more generic...
authorTimo Sirainen <tss@iki.fi>
Fri, 24 Jul 2009 18:40:40 +0000 (14:40 -0400)
committerTimo Sirainen <tss@iki.fi>
Fri, 24 Jul 2009 18:40:40 +0000 (14:40 -0400)
Saved UIDs are no longer necessarily in a simple x:y range.

--HG--
branch : HEAD

19 files changed:
src/imap/cmd-append.c
src/imap/cmd-copy.c
src/lib-lda/mail-deliver.c
src/lib-storage/index/cydir/cydir-save.c
src/lib-storage/index/dbox/dbox-save.c
src/lib-storage/index/index-storage.h
src/lib-storage/index/index-transaction.c
src/lib-storage/index/maildir/maildir-save.c
src/lib-storage/index/mbox/mbox-save.c
src/lib-storage/mail-storage-private.h
src/lib-storage/mail-storage.c
src/lib-storage/mail-storage.h
src/lib-storage/test-mailbox.c
src/plugins/acl/acl-mailbox.c
src/plugins/expire/expire-plugin.c
src/plugins/fts/fts-storage.c
src/plugins/lazy-expunge/lazy-expunge-plugin.c
src/plugins/mail-log/mail-log-plugin.c
src/plugins/quota/quota-storage.c

index cec4ee9e1b24708953feb32b694f5521513a4b0b..f879cd366a3725781bde2090165d219e3da830f1 100644 (file)
@@ -5,9 +5,10 @@
 #include "istream.h"
 #include "ostream.h"
 #include "str.h"
-#include "imap-commands.h"
 #include "imap-parser.h"
 #include "imap-date.h"
+#include "imap-util.h"
+#include "imap-commands.h"
 
 #include <sys/time.h>
 
@@ -243,8 +244,8 @@ static bool cmd_append_continue_parsing(struct client_command_context *cmd)
                /* last message */
                enum mailbox_sync_flags sync_flags;
                enum imap_sync_flags imap_flags;
-               uint32_t uid_validity, uid1, uid2;
-               const char *msg;
+               struct mail_transaction_commit_changes changes;
+               string_t *msg;
 
                /* eat away the trailing CRLF */
                client->input_skip_line = TRUE;
@@ -260,27 +261,19 @@ static bool cmd_append_continue_parsing(struct client_command_context *cmd)
                        return TRUE;
                }
 
-               ret = mailbox_transaction_commit_get_uids(&ctx->t,
-                                                         &uid_validity,
-                                                         &uid1, &uid2);
+               ret = mailbox_transaction_commit_get_changes(&ctx->t, &changes);
                if (ret < 0) {
                        client_send_storage_error(cmd, ctx->storage);
                        cmd_append_finish(ctx);
                        return TRUE;
                }
-               i_assert(ctx->count == uid2 - uid1 + 1);
-
-               if (uid1 == 0)
-                       msg = "OK Append completed.";
-               else if (uid1 == uid2) {
-                       msg = t_strdup_printf("OK [APPENDUID %u %u] "
-                                             "Append completed.",
-                                             uid_validity, uid1);
-               } else {
-                       msg = t_strdup_printf("OK [APPENDUID %u %u:%u] "
-                                             "Append completed.",
-                                             uid_validity, uid1, uid2);
-               }
+               i_assert(ctx->count == seq_range_count(&changes.saved_uids));
+
+               msg = t_str_new(256);
+               str_printfa(msg, "OK [APPENDUID %u ", changes.uid_validity);
+               imap_write_seq_range(msg, &changes.saved_uids);
+               str_append(msg, "] Append completed.");
+               pool_unref(&changes.pool);
 
                if (ctx->box == cmd->client->mailbox) {
                        sync_flags = 0;
@@ -291,7 +284,7 @@ static bool cmd_append_continue_parsing(struct client_command_context *cmd)
                }
 
                cmd_append_finish(ctx);
-               return cmd_sync(cmd, sync_flags, imap_flags, msg);
+               return cmd_sync(cmd, sync_flags, imap_flags, str_c(msg));
        }
 
        if (!validate_args(args, &flags_list, &internal_date_str,
index ff18a00e9f000d21019b5f86351ea0053be15459..7c606482876cca22948756cd285068162128a3e7 100644 (file)
@@ -4,6 +4,7 @@
 #include "str.h"
 #include "ostream.h"
 #include "imap-resp-code.h"
+#include "imap-util.h"
 #include "imap-commands.h"
 #include "imap-search-args.h"
 
@@ -90,11 +91,12 @@ bool cmd_copy(struct client_command_context *cmd)
        struct mailbox *destbox;
        struct mailbox_transaction_context *t;
         struct mail_search_args *search_args;
-       const char *messageset, *mailbox, *src_uidset, *msg = NULL;
+       const char *messageset, *mailbox, *src_uidset;
        enum mailbox_sync_flags sync_flags = 0;
        enum imap_sync_flags imap_flags = 0;
+       struct mail_transaction_commit_changes changes;
        unsigned int copy_count;
-       uint32_t uid_validity, uid1, uid2;
+       string_t *msg;
        int ret;
 
        /* <message set> <mailbox> */
@@ -139,28 +141,21 @@ bool cmd_copy(struct client_command_context *cmd)
        ret = fetch_and_copy(client, t, search_args, &src_uidset, &copy_count);
        mail_search_args_unref(&search_args);
 
+       msg = t_str_new(256);
        if (ret <= 0)
                mailbox_transaction_rollback(&t);
-       else if (mailbox_transaction_commit_get_uids(&t, &uid_validity,
-                                                    &uid1, &uid2) < 0)
+       else if (mailbox_transaction_commit_get_changes(&t, &changes) < 0)
                ret = -1;
        else if (copy_count == 0)
-               msg = "OK No messages copied.";
+               str_append(msg, "OK No messages copied.");
        else {
-               i_assert(copy_count == uid2 - uid1 + 1);
-
-               if (uid1 == 0)
-                       msg = "OK Copy completed.";
-               if (uid1 == uid2) {
-                       msg = t_strdup_printf("OK [COPYUID %u %s %u] "
-                                             "Copy completed.",
-                                             uid_validity, src_uidset, uid1);
-               } else {
-                       msg = t_strdup_printf("OK [COPYUID %u %s %u:%u] "
-                                             "Copy completed.",
-                                             uid_validity, src_uidset,
-                                             uid1, uid2);
-               }
+               i_assert(copy_count == seq_range_count(&changes.saved_uids));
+
+               str_printfa(msg, "OK [COPYUID %u %s ", changes.uid_validity,
+                           src_uidset);
+               imap_write_seq_range(msg, &changes.saved_uids);
+               str_append(msg, "] Copy completed.");
+               pool_unref(&changes.pool);
        }
 
        dest_storage = mailbox_get_storage(destbox);
@@ -171,7 +166,7 @@ bool cmd_copy(struct client_command_context *cmd)
        }
 
        if (ret > 0)
-               return cmd_sync(cmd, sync_flags, imap_flags, msg);
+               return cmd_sync(cmd, sync_flags, imap_flags, str_c(msg));
        else if (ret == 0) {
                /* some messages were expunged, sync them */
                return cmd_sync(cmd, 0, 0,
index 6e454e47f9a360ff0d231f55cffecf0abf8e4bd2..58d427a68b07da173031311ad5e348b5942c80a3 100644 (file)
@@ -2,6 +2,7 @@
 
 #include "lib.h"
 #include "ioloop.h"
+#include "array.h"
 #include "str.h"
 #include "str-sanitize.h"
 #include "var-expand.h"
@@ -145,7 +146,8 @@ int mail_deliver_save(struct mail_deliver_context *ctx, const char *mailbox,
        struct mail_keywords *kw;
        enum mail_error error;
        const char *mailbox_name, *errstr;
-       uint32_t uid_validity, uid1 = 0, uid2 = 0;
+       struct mail_transaction_commit_changes changes;
+       const struct seq_range *range;
        bool default_save;
        int ret = 0;
 
@@ -188,26 +190,26 @@ int mail_deliver_save(struct mail_deliver_context *ctx, const char *mailbox,
 
        if (ret < 0)
                mailbox_transaction_rollback(&t);
-       else {
-               ret = mailbox_transaction_commit_get_uids(&t, &uid_validity,
-                                                         &uid1, &uid2);
-       }
+       else
+               ret = mailbox_transaction_commit_get_changes(&t, &changes);
 
        if (ret == 0) {
                ctx->saved_mail = TRUE;
                mail_deliver_log(ctx, "saved mail to %s", mailbox_name);
 
                if (ctx->save_dest_mail && mailbox_sync(box, 0, 0, NULL) == 0) {
-                       i_assert(uid1 == uid2);
+                       range = array_idx(&changes.saved_uids, 0);
+                       i_assert(range[0].seq1 == range[0].seq2);
 
                        t = mailbox_transaction_begin(box, 0);
                        ctx->dest_mail = mail_alloc(t, MAIL_FETCH_STREAM_BODY,
                                                    NULL);
-                       if (mail_set_uid(ctx->dest_mail, uid1) < 0) {
+                       if (mail_set_uid(ctx->dest_mail, range[0].seq1) < 0) {
                                mail_free(&ctx->dest_mail);
                                mailbox_transaction_rollback(&t);
                        }
                }
+               pool_unref(&changes.pool);
        } else {
                mail_deliver_log(ctx, "save failed to %s: %s", mailbox_name,
                        mail_storage_get_last_error(*storage_r, &error));
index 4826dafc2949f2c3e15e1206891645b6d626a612..5aa42c7ac8a27ca1a8b39a9c2ad58ec5bbffc42d 100644 (file)
@@ -1,6 +1,7 @@
 /* Copyright (c) 2007-2009 Dovecot authors, see the included COPYING file */
 
 #include "lib.h"
+#include "array.h"
 #include "hostpid.h"
 #include "istream.h"
 #include "istream-crlf.h"
@@ -229,9 +230,9 @@ void cydir_save_cancel(struct mail_save_context *_ctx)
 
 int cydir_transaction_save_commit_pre(struct cydir_save_context *ctx)
 {
-       struct cydir_transaction_context *t =
-               (struct cydir_transaction_context *)ctx->ctx.transaction;
+       struct mailbox_transaction_context *_t = ctx->ctx.transaction;
        const struct mail_index_header *hdr;
+       struct seq_range *range;
        uint32_t i, uid, next_uid;
        const char *dir;
        string_t *src_path, *dest_path;
@@ -249,9 +250,10 @@ int cydir_transaction_save_commit_pre(struct cydir_save_context *ctx)
        uid = hdr->next_uid;
        mail_index_append_assign_uids(ctx->trans, uid, &next_uid);
 
-       *t->ictx.saved_uid_validity = ctx->sync_ctx->uid_validity;
-       *t->ictx.first_saved_uid = uid;
-       *t->ictx.last_saved_uid = next_uid - 1;
+       _t->changes->uid_validity = ctx->sync_ctx->uid_validity;
+       range = array_append_space(&_t->changes->saved_uids);
+       range->seq1 = uid;
+       range->seq2 = next_uid - 1;
 
        dir = mailbox_list_get_path(ctx->mbox->ibox.box.list,
                                    ctx->mbox->ibox.box.name,
index cd47ef3b187907402505ba4f71b4259b157d959b..c1498c5fbc23eed86839a2cd4e258ed5068a869a 100644 (file)
@@ -308,9 +308,9 @@ void dbox_save_cancel(struct mail_save_context *_ctx)
 
 int dbox_transaction_save_commit_pre(struct dbox_save_context *ctx)
 {
-       struct dbox_transaction_context *t =
-               (struct dbox_transaction_context *)ctx->ctx.transaction;
+       struct mailbox_transaction_context *_t = ctx->ctx.transaction;
        const struct mail_index_header *hdr;
+       struct seq_range *range;
        uint32_t uid, first_map_uid, last_map_uid, next_uid;
 
        i_assert(ctx->finished);
@@ -387,9 +387,10 @@ int dbox_transaction_save_commit_pre(struct dbox_save_context *ctx)
        if (ctx->mail != NULL)
                mail_free(&ctx->mail);
 
-       *t->ictx.saved_uid_validity = hdr->uid_validity;
-       *t->ictx.first_saved_uid = uid;
-       *t->ictx.last_saved_uid = next_uid - 1;
+       _t->changes->uid_validity = hdr->uid_validity;
+       range = array_append_space(&_t->changes->saved_uids);
+       range->seq1 = uid;
+       range->seq2 = next_uid - 1;
        return 0;
 }
 
index ec06599ee42cc59fc4c046f5294b56e9ab40f2c9..5dd939cad4639fd68a9a25909776f1f65f7cf61c 100644 (file)
@@ -72,9 +72,6 @@ struct index_transaction_context {
        struct mail_cache_view *cache_view;
        struct mail_cache_transaction_ctx *cache_trans;
 
-       uint32_t *saved_uid_validity;
-       uint32_t *first_saved_uid, *last_saved_uid;
-
        unsigned int cache_trans_failed:1;
 };
 
@@ -179,9 +176,7 @@ struct mailbox_transaction_context *
 index_transaction_begin(struct mailbox *box,
                        enum mailbox_transaction_flags flags);
 int index_transaction_commit(struct mailbox_transaction_context *t,
-                            uint32_t *uid_validity_r,
-                            uint32_t *first_saved_uid_r,
-                            uint32_t *last_saved_uid_r);
+                            struct mail_transaction_commit_changes *changes_r);
 void index_transaction_rollback(struct mailbox_transaction_context *t);
 void index_save_context_free(struct mail_save_context *ctx);
 
index dbba99f6bc073449511f9c01d9dc417383ea5a0f..ea8e96a2d6dc028cd81ccaa408667074e3abe04d 100644 (file)
@@ -90,20 +90,16 @@ index_transaction_begin(struct mailbox *box,
 }
 
 int index_transaction_commit(struct mailbox_transaction_context *_t,
-                            uint32_t *uid_validity_r,
-                            uint32_t *first_saved_uid_r,
-                            uint32_t *last_saved_uid_r)
+                            struct mail_transaction_commit_changes *changes_r)
 {
        struct index_transaction_context *t =
                (struct index_transaction_context *)_t;
        struct mail_index_transaction *itrans = t->trans;
 
-       *uid_validity_r = 0;
-       *first_saved_uid_r = *last_saved_uid_r = 0;
-
-       t->saved_uid_validity = uid_validity_r;
-       t->first_saved_uid = first_saved_uid_r;
-       t->last_saved_uid = last_saved_uid_r;
+       memset(changes_r, 0, sizeof(*changes_r));
+       changes_r->pool = pool_alloconly_create("transaction changes", 1024);
+       p_array_init(&changes_r->saved_uids, changes_r->pool, 32);
+       _t->changes = changes_r;
 
        return mail_index_transaction_commit(&itrans);
 }
index 3b65cac4f74f488e0f0f5b1ae0ccb2ab189cafb4..ec10926fcf7919aa0c4168444187501c9705f246 100644 (file)
@@ -628,6 +628,7 @@ maildir_save_sync_index(struct maildir_save_context *ctx)
        struct maildir_transaction_context *t =
                (struct maildir_transaction_context *)ctx->ctx.transaction;
        struct maildir_mailbox *mbox = ctx->mbox;
+       struct seq_range *range;
        uint32_t uid, first_uid, next_uid;
        int ret;
 
@@ -673,8 +674,9 @@ maildir_save_sync_index(struct maildir_save_context *ctx)
        }
 
        /* this will work even if index isn't updated */
-       *t->ictx.first_saved_uid = first_uid;
-       *t->ictx.last_saved_uid = next_uid - 1;
+       range = array_append_space(&t->ictx.mailbox_ctx.changes->saved_uids);
+       range->seq1 = first_uid;
+       range->seq2 = next_uid - 1;
        return 0;
 }
 
@@ -797,7 +799,7 @@ int maildir_transaction_save_commit_pre(struct maildir_save_context *ctx)
                        ret = -1;
        }
 
-       *t->ictx.saved_uid_validity =
+       t->ictx.mailbox_ctx.changes->uid_validity =
                maildir_uidlist_get_uid_validity(ctx->mbox->uidlist);
 
        if (ctx->mail != NULL) {
index b3bf7eaada9b173aab86f863484a5e52e0fdb4c6..c59684df96a66a4cf5330128851a5d7ad5db4e23 100644 (file)
@@ -710,9 +710,9 @@ static void mbox_transaction_save_deinit(struct mbox_save_context *ctx)
 
 int mbox_transaction_save_commit(struct mbox_save_context *ctx)
 {
-       struct mbox_transaction_context *t =
-               (struct mbox_transaction_context *)ctx->ctx.transaction;
+       struct mailbox_transaction_context *_t = ctx->ctx.transaction;
        struct mbox_mailbox *mbox = ctx->mbox;
+       struct seq_range *range;
        struct stat st;
        int ret = 0;
 
@@ -724,9 +724,10 @@ int mbox_transaction_save_commit(struct mbox_save_context *ctx)
        }
 
        if (ctx->synced) {
-               *t->ictx.saved_uid_validity = ctx->uid_validity;
-               *t->ictx.first_saved_uid = ctx->first_saved_uid;
-               *t->ictx.last_saved_uid = ctx->next_uid - 1;
+               _t->changes->uid_validity = ctx->uid_validity;
+               range = array_append_space(&_t->changes->saved_uids);
+               range->seq1 = ctx->first_saved_uid;
+               range->seq2 = ctx->next_uid - 1;
 
                mail_index_update_header(ctx->trans,
                        offsetof(struct mail_index_header, next_uid),
index 28442c35d7bfd14b33c6fa12edc5615c5f821d93..4756af21f7a495c23f332c3e7bc44346f7632e26 100644 (file)
@@ -138,9 +138,7 @@ struct mailbox_vfuncs {
                (*transaction_begin)(struct mailbox *box,
                                     enum mailbox_transaction_flags flags);
        int (*transaction_commit)(struct mailbox_transaction_context *t,
-                                 uint32_t *uid_validity_r,
-                                 uint32_t *first_saved_uid_r,
-                                 uint32_t *last_saved_uid_r);
+                                 struct mail_transaction_commit_changes *changes_r);
        void (*transaction_rollback)(struct mailbox_transaction_context *t);
        void (*transaction_set_max_modseq)(struct mailbox_transaction_context *t,
                                           uint64_t max_modseq,
@@ -349,6 +347,7 @@ struct mailbox_transaction_context {
        struct mailbox *box;
        enum mailbox_transaction_flags flags;
 
+       struct mail_transaction_commit_changes *changes;
        ARRAY_DEFINE(module_contexts,
                     union mailbox_transaction_module_context *);
 };
index cf10e9b5ac2adb09cb0491daa7f630ac3e4db517..07958eebc4d82bbb27e4ac2fe289aa5d9e7dfd2d 100644 (file)
@@ -868,27 +868,26 @@ mailbox_transaction_begin(struct mailbox *box,
 
 int mailbox_transaction_commit(struct mailbox_transaction_context **t)
 {
-       uint32_t uidvalidity, uid1, uid2;
+       struct mail_transaction_commit_changes changes;
+       int ret;
 
-       /* Store the return values to separate temporary variables so that
-          plugins overriding transaction_commit() can look at them. */
-       return mailbox_transaction_commit_get_uids(t, &uidvalidity,
-                                                  &uid1, &uid2);
+       /* Store changes temporarily so that plugins overriding
+          transaction_commit() can look at them. */
+       ret = mailbox_transaction_commit_get_changes(t, &changes);
+       pool_unref(&changes.pool);
+       return ret;
 }
 
-int mailbox_transaction_commit_get_uids(struct mailbox_transaction_context **_t,
-                                       uint32_t *uid_validity_r,
-                                       uint32_t *first_saved_uid_r,
-                                       uint32_t *last_saved_uid_r)
+int mailbox_transaction_commit_get_changes(
+       struct mailbox_transaction_context **_t,
+       struct mail_transaction_commit_changes *changes_r)
 {
        struct mailbox_transaction_context *t = *_t;
 
        t->box->transaction_count--;
 
        *_t = NULL;
-       return t->box->v.transaction_commit(t, uid_validity_r,
-                                           first_saved_uid_r,
-                                           last_saved_uid_r);
+       return t->box->v.transaction_commit(t, changes_r);
 }
 
 void mailbox_transaction_rollback(struct mailbox_transaction_context **_t)
index d2ae5c3ee6ec32455de57079cbeed26d4362374b..ce85c89147c27d84f5f984b42f26c7952ad359e3 100644 (file)
@@ -199,6 +199,16 @@ struct mailbox_update {
        uint64_t min_highest_modseq;
 };
 
+struct mail_transaction_commit_changes {
+       /* Unreference the pool to free memory used by these changes. */
+       pool_t pool;
+
+       /* UIDVALIDITY for assigned UIDs. */
+       uint32_t uid_validity;
+       /* UIDs assigned to saved messages. Not necessarily ascending. */
+       ARRAY_TYPE(seq_range) saved_uids;
+};
+
 struct mailbox_sync_rec {
        uint32_t seq1, seq2;
        enum mailbox_sync_type type;
@@ -388,11 +398,9 @@ struct mailbox_transaction_context *
 mailbox_transaction_begin(struct mailbox *box,
                          enum mailbox_transaction_flags flags);
 int mailbox_transaction_commit(struct mailbox_transaction_context **t);
-/* If no messages were saved/copied, first/last_saved_uid_r are 0. */
-int mailbox_transaction_commit_get_uids(struct mailbox_transaction_context **t,
-                                       uint32_t *uid_validity_r,
-                                       uint32_t *first_saved_uid_r,
-                                       uint32_t *last_saved_uid_r);
+int mailbox_transaction_commit_get_changes(
+       struct mailbox_transaction_context **t,
+       struct mail_transaction_commit_changes *changes_r);
 void mailbox_transaction_rollback(struct mailbox_transaction_context **t);
 /* Return the number of active transactions for the mailbox. */
 unsigned int mailbox_transaction_get_count(const struct mailbox *box) ATTR_PURE;
index 53ba8cc7a6622d9843f8bb1991709c6066751925..e037d7241906cbc371cb8522d8d9e0f7e1359add 100644 (file)
@@ -115,12 +115,9 @@ test_mailbox_transaction_rollback(struct mailbox_transaction_context *t)
 
 static int
 test_mailbox_transaction_commit(struct mailbox_transaction_context *t,
-                               uint32_t *uid_validity_r,
-                               uint32_t *first_saved_uid_r,
-                               uint32_t *last_saved_uid_r)
+                               struct mail_transaction_commit_changes *changes_r)
 {
-       *uid_validity_r = TEST_UID_VALIDITY;
-       *first_saved_uid_r = *last_saved_uid_r = 0;
+       changes_r->uid_validity = TEST_UID_VALIDITY;
        test_mailbox_transaction_rollback(t);
        return 0;
 }
index 42fcf413d3300ced1e127142a7444cd9c8b11632..787d4facc09173a5f18b19da522eae2c2f818a3a 100644 (file)
@@ -350,8 +350,7 @@ acl_copy(struct mail_save_context *ctx, struct mail *mail)
 
 static int
 acl_transaction_commit(struct mailbox_transaction_context *ctx,
-                      uint32_t *uid_validity_r,
-                      uint32_t *first_saved_uid_r, uint32_t *last_saved_uid_r)
+                      struct mail_transaction_commit_changes *changes_r)
 {
        struct acl_mailbox *abox = ACL_CONTEXT(ctx->box);
        void *at = ACL_CONTEXT(ctx);
@@ -361,9 +360,7 @@ acl_transaction_commit(struct mailbox_transaction_context *ctx,
                return -1;
        }
 
-       return abox->module_ctx.super.
-               transaction_commit(ctx, uid_validity_r,
-                                  first_saved_uid_r, last_saved_uid_r);
+       return abox->module_ctx.super.transaction_commit(ctx, changes_r);
 }
 
 static int
index 2540db6b668ac941f14d30761b6209a254666210..54ca3027a190fa871aaa8fcb061d6d3a80459970 100644 (file)
@@ -99,9 +99,7 @@ static void first_nonexpunged_timestamp(struct mailbox_transaction_context *_t,
 
 static int
 expire_mailbox_transaction_commit(struct mailbox_transaction_context *t,
-                                 uint32_t *uid_validity_r,
-                                 uint32_t *first_saved_uid_r,
-                                 uint32_t *last_saved_uid_r)
+                                 struct mail_transaction_commit_changes *changes_r)
 {
        struct expire_mail_user *euser =
                EXPIRE_USER_CONTEXT(t->box->storage->user);
@@ -120,9 +118,7 @@ expire_mailbox_transaction_commit(struct mailbox_transaction_context *t,
                update_dict = TRUE;
        }
 
-       if (xpr_box->module_ctx.super.
-               transaction_commit(t, uid_validity_r,
-                                  first_saved_uid_r, last_saved_uid_r) < 0) {
+       if (xpr_box->module_ctx.super.transaction_commit(t, changes_r) < 0) {
                i_free(xt);
                return -1;
        }
index 096de45e4efcee477ad5dfcfb4cf3f2e6e0f369d..c5d67bf8cdb70326b3a311bc296f86dfe2ad5a17 100644 (file)
@@ -998,10 +998,9 @@ static void fts_transaction_rollback(struct mailbox_transaction_context *t)
        fts_transaction_finish(box, ft, FALSE);
 }
 
-static int fts_transaction_commit(struct mailbox_transaction_context *t,
-                                 uint32_t *uid_validity_r,
-                                 uint32_t *first_saved_uid_r,
-                                 uint32_t *last_saved_uid_r)
+static int
+fts_transaction_commit(struct mailbox_transaction_context *t,
+                      struct mail_transaction_commit_changes *changes_r)
 {
        struct mailbox *box = t->box;
        struct fts_mailbox *fbox = FTS_CONTEXT(box);
@@ -1015,10 +1014,7 @@ static int fts_transaction_commit(struct mailbox_transaction_context *t,
        if (ft->free_mail)
                mail_free(&ft->mail);
 
-       ret = fbox->module_ctx.super.transaction_commit(t,
-                                                       uid_validity_r,
-                                                       first_saved_uid_r,
-                                                       last_saved_uid_r);
+       ret = fbox->module_ctx.super.transaction_commit(t, changes_r);
        fts_transaction_finish(box, ft, ret == 0);
        return ret;
 }
index 45d4e5150749d8b2617157babcd4553b0bfa15e9..fd414ddf1b58c13d9b3dc3be2f23cb9fe5e76766 100644 (file)
@@ -184,9 +184,7 @@ static void lazy_expunge_transaction_free(struct lazy_expunge_transaction *lt)
 
 static int
 lazy_expunge_transaction_commit(struct mailbox_transaction_context *ctx,
-                               uint32_t *uid_validity_r,
-                               uint32_t *first_saved_uid_r,
-                               uint32_t *last_saved_uid_r)
+                               struct mail_transaction_commit_changes *changes_r)
 {
        union mailbox_module_context *mbox = LAZY_EXPUNGE_CONTEXT(ctx->box);
        struct lazy_expunge_transaction *lt = LAZY_EXPUNGE_CONTEXT(ctx);
@@ -201,9 +199,7 @@ lazy_expunge_transaction_commit(struct mailbox_transaction_context *ctx,
                mbox->super.transaction_rollback(ctx);
                ret = -1;
        } else {
-               ret = mbox->super.transaction_commit(ctx, uid_validity_r,
-                                                    first_saved_uid_r,
-                                                    last_saved_uid_r);
+               ret = mbox->super.transaction_commit(ctx, changes_r);
        }
        lazy_expunge_transaction_free(lt);
        return ret;
index 0c2a0f27518bd6edba047e0af978374cc405cfd9..7db27b5d1e19b21ee26bf559f9a628cd4c635d0e 100644 (file)
@@ -515,9 +515,7 @@ mail_log_transaction_begin(struct mailbox *box,
 
 static int
 mail_log_transaction_commit(struct mailbox_transaction_context *t,
-                           uint32_t *uid_validity_r,
-                           uint32_t *first_saved_uid_r,
-                           uint32_t *last_saved_uid_r)
+                           struct mail_transaction_commit_changes *changes_r)
 {
        struct mail_log_transaction_context *lt = MAIL_LOG_CONTEXT(t);
        union mailbox_module_context *lbox = MAIL_LOG_CONTEXT(t->box);
@@ -530,9 +528,7 @@ mail_log_transaction_commit(struct mailbox_transaction_context *t,
                mail_free(&lt->tmp_mail);
        pool_unref(&lt->pool);
 
-       return lbox->super.transaction_commit(t, uid_validity_r,
-                                             first_saved_uid_r,
-                                             last_saved_uid_r);
+       return lbox->super.transaction_commit(t, changes_r);
 }
 
 static void
index 3bfd2fd2a2e78f71f7b06ccbddf2b8dc55870d02..ba5ef926d894e0220c447e476255f2b4d9358228 100644 (file)
@@ -84,9 +84,7 @@ quota_mailbox_transaction_begin(struct mailbox *box,
 
 static int
 quota_mailbox_transaction_commit(struct mailbox_transaction_context *ctx,
-                                uint32_t *uid_validity_r,
-                                uint32_t *first_saved_uid_r,
-                                uint32_t *last_saved_uid_r)
+                                struct mail_transaction_commit_changes *changes_r)
 {
        struct quota_mailbox *qbox = QUOTA_CONTEXT(ctx->box);
        struct quota_transaction_context *qt = QUOTA_CONTEXT(ctx);
@@ -94,10 +92,7 @@ quota_mailbox_transaction_commit(struct mailbox_transaction_context *ctx,
        if (qt->tmp_mail != NULL)
                mail_free(&qt->tmp_mail);
 
-       if (qbox->module_ctx.super.transaction_commit(ctx,
-                                                     uid_validity_r,
-                                                     first_saved_uid_r,
-                                                     last_saved_uid_r) < 0) {
+       if (qbox->module_ctx.super.transaction_commit(ctx, changes_r) < 0) {
                quota_transaction_rollback(&qt);
                return -1;
        } else {