dovecot-2.0: mailbox_transaction_commit_get_uids() changed to _g...

dovecot at dovecot.org dovecot at dovecot.org
Fri Jul 24 21:46:31 EEST 2009


details:   http://hg.dovecot.org/dovecot-2.0/rev/47356e8dda45
changeset: 9649:47356e8dda45
user:      Timo Sirainen <tss at iki.fi>
date:      Fri Jul 24 14:40:40 2009 -0400
description:
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.

diffstat:

19 files changed, 112 insertions(+), 146 deletions(-)
src/imap/cmd-append.c                          |   33 +++++++++---------------
src/imap/cmd-copy.c                            |   33 ++++++++++--------------
src/lib-lda/mail-deliver.c                     |   16 ++++++-----
src/lib-storage/index/cydir/cydir-save.c       |   12 +++++---
src/lib-storage/index/dbox/dbox-save.c         |   11 ++++----
src/lib-storage/index/index-storage.h          |    7 -----
src/lib-storage/index/index-transaction.c      |   14 +++-------
src/lib-storage/index/maildir/maildir-save.c   |    8 +++--
src/lib-storage/index/mbox/mbox-save.c         |   11 ++++----
src/lib-storage/mail-storage-private.h         |    5 +--
src/lib-storage/mail-storage.c                 |   29 ++++++++++-----------
src/lib-storage/mail-storage.h                 |   18 +++++++++----
src/lib-storage/test-mailbox.c                 |    9 ++----
src/plugins/acl/acl-mailbox.c                  |    7 +----
src/plugins/expire/expire-plugin.c             |    8 +----
src/plugins/fts/fts-storage.c                  |   12 ++------
src/plugins/lazy-expunge/lazy-expunge-plugin.c |    8 +----
src/plugins/mail-log/mail-log-plugin.c         |    8 +----
src/plugins/quota/quota-storage.c              |    9 +-----

diffs (truncated from 653 to 300 lines):

diff -r 028878f7063a -r 47356e8dda45 src/imap/cmd-append.c
--- 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 @@ static bool cmd_append_continue_parsing(
 		/* 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(
 			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(
 		}
 
 		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,
diff -r 028878f7063a -r 47356e8dda45 src/imap/cmd-copy.c
--- 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 @@ bool cmd_copy(struct client_command_cont
 	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_cont
 	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 @@ bool cmd_copy(struct client_command_cont
 	}
 
 	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,
diff -r 028878f7063a -r 47356e8dda45 src/lib-lda/mail-deliver.c
--- 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 @@ int mail_deliver_save(struct mail_delive
 	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_delive
 
 	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));
diff -r 028878f7063a -r 47356e8dda45 src/lib-storage/index/cydir/cydir-save.c
--- 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 @@ void cydir_save_cancel(struct mail_save_
 
 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(st
 	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,
diff -r 028878f7063a -r 47356e8dda45 src/lib-storage/index/dbox/dbox-save.c
--- 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 @@ void dbox_save_cancel(struct mail_save_c
 
 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(str
 	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;
 }
 
diff -r 028878f7063a -r 47356e8dda45 src/lib-storage/index/index-storage.h
--- 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
@@ -71,9 +71,6 @@ struct index_transaction_context {
 	struct mail_index_view *trans_view;
 	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 *
 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);
 
diff -r 028878f7063a -r 47356e8dda45 src/lib-storage/index/index-transaction.c
--- 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 @@ index_transaction_begin(struct mailbox *
 }
 
 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)
 {


More information about the dovecot-cvs mailing list