changeset 9649:47356e8dda45 HEAD

mailbox_transaction_commit_get_uids() changed to _get_changes() with more generic API. Saved UIDs are no longer necessarily in a simple x:y range.
author Timo Sirainen <tss@iki.fi>
date Fri, 24 Jul 2009 14:40:40 -0400
parents 028878f7063a
children 6b6d6e094674
files 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
diffstat 19 files changed, 107 insertions(+), 141 deletions(-) [+]
line wrap: on
line diff
--- a/src/imap/cmd-append.c	Tue Jul 21 17:14:41 2009 -0400
+++ b/src/imap/cmd-append.c	Fri Jul 24 14:40:40 2009 -0400
@@ -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 @@
 		/* 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 @@
 			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);
+		i_assert(ctx->count == seq_range_count(&changes.saved_uids));
 
-		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);
-		}
+		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 @@
 		}
 
 		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,
--- a/src/imap/cmd-copy.c	Tue Jul 21 17:14:41 2009 -0400
+++ b/src/imap/cmd-copy.c	Fri Jul 24 14:40:40 2009 -0400
@@ -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 @@
 	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 @@
 	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);
+		i_assert(copy_count == seq_range_count(&changes.saved_uids));
 
-		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);
-		}
+		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 @@
 	}
 
 	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,
--- a/src/lib-lda/mail-deliver.c	Tue Jul 21 17:14:41 2009 -0400
+++ b/src/lib-lda/mail-deliver.c	Fri Jul 24 14:40:40 2009 -0400
@@ -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 @@
 	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 @@
 
 	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));
--- a/src/lib-storage/index/cydir/cydir-save.c	Tue Jul 21 17:14:41 2009 -0400
+++ b/src/lib-storage/index/cydir/cydir-save.c	Fri Jul 24 14:40:40 2009 -0400
@@ -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 @@
 
 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 @@
 	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,
--- a/src/lib-storage/index/dbox/dbox-save.c	Tue Jul 21 17:14:41 2009 -0400
+++ b/src/lib-storage/index/dbox/dbox-save.c	Fri Jul 24 14:40:40 2009 -0400
@@ -308,9 +308,9 @@
 
 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 @@
 	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;
 }
 
--- a/src/lib-storage/index/index-storage.h	Tue Jul 21 17:14:41 2009 -0400
+++ b/src/lib-storage/index/index-storage.h	Fri Jul 24 14:40:40 2009 -0400
@@ -72,9 +72,6 @@
 	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 @@
 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);
 
--- a/src/lib-storage/index/index-transaction.c	Tue Jul 21 17:14:41 2009 -0400
+++ b/src/lib-storage/index/index-transaction.c	Fri Jul 24 14:40:40 2009 -0400
@@ -90,20 +90,16 @@
 }
 
 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);
 }
--- a/src/lib-storage/index/maildir/maildir-save.c	Tue Jul 21 17:14:41 2009 -0400
+++ b/src/lib-storage/index/maildir/maildir-save.c	Fri Jul 24 14:40:40 2009 -0400
@@ -628,6 +628,7 @@
 	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 @@
 	}
 
 	/* 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 @@
 			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) {
--- a/src/lib-storage/index/mbox/mbox-save.c	Tue Jul 21 17:14:41 2009 -0400
+++ b/src/lib-storage/index/mbox/mbox-save.c	Fri Jul 24 14:40:40 2009 -0400
@@ -710,9 +710,9 @@
 
 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 @@
 	}
 
 	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),
--- a/src/lib-storage/mail-storage-private.h	Tue Jul 21 17:14:41 2009 -0400
+++ b/src/lib-storage/mail-storage-private.h	Fri Jul 24 14:40:40 2009 -0400
@@ -138,9 +138,7 @@
 		(*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 *box;
 	enum mailbox_transaction_flags flags;
 
+	struct mail_transaction_commit_changes *changes;
 	ARRAY_DEFINE(module_contexts,
 		     union mailbox_transaction_module_context *);
 };
--- a/src/lib-storage/mail-storage.c	Tue Jul 21 17:14:41 2009 -0400
+++ b/src/lib-storage/mail-storage.c	Fri Jul 24 14:40:40 2009 -0400
@@ -868,27 +868,26 @@
 
 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)
--- a/src/lib-storage/mail-storage.h	Tue Jul 21 17:14:41 2009 -0400
+++ b/src/lib-storage/mail-storage.h	Fri Jul 24 14:40:40 2009 -0400
@@ -199,6 +199,16 @@
 	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 @@
 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;
--- a/src/lib-storage/test-mailbox.c	Tue Jul 21 17:14:41 2009 -0400
+++ b/src/lib-storage/test-mailbox.c	Fri Jul 24 14:40:40 2009 -0400
@@ -115,12 +115,9 @@
 
 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;
 }
--- a/src/plugins/acl/acl-mailbox.c	Tue Jul 21 17:14:41 2009 -0400
+++ b/src/plugins/acl/acl-mailbox.c	Fri Jul 24 14:40:40 2009 -0400
@@ -350,8 +350,7 @@
 
 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 @@
 		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
--- a/src/plugins/expire/expire-plugin.c	Tue Jul 21 17:14:41 2009 -0400
+++ b/src/plugins/expire/expire-plugin.c	Fri Jul 24 14:40:40 2009 -0400
@@ -99,9 +99,7 @@
 
 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 @@
 		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;
 	}
--- a/src/plugins/fts/fts-storage.c	Tue Jul 21 17:14:41 2009 -0400
+++ b/src/plugins/fts/fts-storage.c	Fri Jul 24 14:40:40 2009 -0400
@@ -998,10 +998,9 @@
 	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 @@
 	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;
 }
--- a/src/plugins/lazy-expunge/lazy-expunge-plugin.c	Tue Jul 21 17:14:41 2009 -0400
+++ b/src/plugins/lazy-expunge/lazy-expunge-plugin.c	Fri Jul 24 14:40:40 2009 -0400
@@ -184,9 +184,7 @@
 
 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 @@
 		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;
--- a/src/plugins/mail-log/mail-log-plugin.c	Tue Jul 21 17:14:41 2009 -0400
+++ b/src/plugins/mail-log/mail-log-plugin.c	Fri Jul 24 14:40:40 2009 -0400
@@ -515,9 +515,7 @@
 
 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_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
--- a/src/plugins/quota/quota-storage.c	Tue Jul 21 17:14:41 2009 -0400
+++ b/src/plugins/quota/quota-storage.c	Fri Jul 24 14:40:40 2009 -0400
@@ -84,9 +84,7 @@
 
 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 @@
 	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 {