dovecot: mailbox_transaction_commit_get_uids() now returns also ...

dovecot at dovecot.org dovecot at dovecot.org
Sun Aug 12 15:10:44 EEST 2007


details:   http://hg.dovecot.org/dovecot/rev/3a1eed408cad
changeset: 6267:3a1eed408cad
user:      Timo Sirainen <tss at iki.fi>
date:      Sun Aug 12 15:10:35 2007 +0300
description:
mailbox_transaction_commit_get_uids() now returns also UIDVALIDITY. It's the
only usable way to get it returned correctly. Removed maildir-specific
mailbox_get_status() handling, it's supposed to return the current state of
the mailbox, not the latest state. It was useful only for returning non-zero
UIDVALIDITY for newly created mailboxes, and that's no longer needed.

diffstat:

13 files changed, 37 insertions(+), 47 deletions(-)
src/imap/cmd-append.c                           |   13 ++++-------
src/imap/cmd-copy.c                             |   18 ++++++---------
src/lib-storage/index/cydir/cydir-save.c        |    1 
src/lib-storage/index/cydir/cydir-sync.c        |    5 +++-
src/lib-storage/index/cydir/cydir-sync.h        |    1 
src/lib-storage/index/index-storage.h           |    2 +
src/lib-storage/index/index-transaction.c       |    3 ++
src/lib-storage/index/maildir/maildir-save.c    |    6 +++++
src/lib-storage/index/maildir/maildir-storage.c |   26 -----------------------
src/lib-storage/index/mbox/mbox-save.c          |    1 
src/lib-storage/mail-storage-private.h          |    1 
src/lib-storage/mail-storage.c                  |    6 +++--
src/lib-storage/mail-storage.h                  |    1 

diffs (296 lines):

diff -r 3fabc189d17c -r 3a1eed408cad src/imap/cmd-append.c
--- a/src/imap/cmd-append.c	Sun Aug 12 15:05:13 2007 +0300
+++ b/src/imap/cmd-append.c	Sun Aug 12 15:10:35 2007 +0300
@@ -235,8 +235,7 @@ static bool cmd_append_continue_parsing(
 	if (args->type == IMAP_ARG_EOL) {
 		/* last message */
 		enum mailbox_sync_flags sync_flags;
-		struct mailbox_status status;
-		uint32_t uid1, uid2;
+		uint32_t uid_validity, uid1, uid2;
 		const char *msg;
 
 		/* eat away the trailing CRLF */
@@ -249,6 +248,7 @@ static bool cmd_append_continue_parsing(
 		}
 
 		ret = mailbox_transaction_commit_get_uids(&ctx->t, 0,
+							  &uid_validity,
 							  &uid1, &uid2);
 		if (ret < 0) {
 			client_send_storage_error(cmd, ctx->storage);
@@ -257,17 +257,14 @@ static bool cmd_append_continue_parsing(
 		}
 		i_assert(ctx->count == uid2 - uid1 + 1);
 
-		if (mailbox_get_status(ctx->box, STATUS_UIDVALIDITY,
-				       &status) < 0)
-			msg = "OK Append completed.";
-		else if (uid1 == uid2) {
+		if (uid1 == uid2) {
 			msg = t_strdup_printf("OK [APPENDUID %u %u] "
 					      "Append completed.",
-					      status.uidvalidity, uid1);
+					      uid_validity, uid1);
 		} else {
 			msg = t_strdup_printf("OK [APPENDUID %u %u:%u] "
 					      "Append completed.",
-					      status.uidvalidity, uid1, uid2);
+					      uid_validity, uid1, uid2);
 		}
 
 		sync_flags = ctx->box == cmd->client->mailbox ?
diff -r 3fabc189d17c -r 3a1eed408cad src/imap/cmd-copy.c
--- a/src/imap/cmd-copy.c	Sun Aug 12 15:05:13 2007 +0300
+++ b/src/imap/cmd-copy.c	Sun Aug 12 15:10:35 2007 +0300
@@ -91,11 +91,10 @@ bool cmd_copy(struct client_command_cont
 	struct mailbox *destbox;
 	struct mailbox_transaction_context *t;
         struct mail_search_arg *search_arg;
-	struct mailbox_status status;
 	const char *messageset, *mailbox, *src_uidset, *msg = NULL;
         enum mailbox_sync_flags sync_flags = 0;
 	unsigned int copy_count;
-	uint32_t uid1, uid2;
+	uint32_t uid_validity, uid1, uid2;
 	int ret;
 
 	/* <message set> <mailbox> */
@@ -137,24 +136,21 @@ bool cmd_copy(struct client_command_cont
 
 	if (ret <= 0)
 		mailbox_transaction_rollback(&t);
-	else if (mailbox_transaction_commit_get_uids(&t, 0, &uid1, &uid2) < 0)
+	else if (mailbox_transaction_commit_get_uids(&t, 0, &uid_validity,
+						     &uid1, &uid2) < 0)
 		ret = -1;
 	else {
 		i_assert(copy_count == uid2 - uid1 + 1);
 
-		if (mailbox_get_status(destbox, STATUS_UIDVALIDITY,
-				       &status) < 0) {
-			msg = "OK Copy completed.";
-		} else if (uid1 == uid2) {
+		if (uid1 == uid2) {
 			msg = t_strdup_printf("OK [COPYUID %u %s %u] "
 					      "Copy completed.",
-					      status.uidvalidity,
-					      src_uidset, uid1);
+					      uid_validity, src_uidset, uid1);
 		} else {
 			msg = t_strdup_printf("OK [COPYUID %u %s %u:%u] "
 					      "Copy completed.",
-					      status.uidvalidity,
-					      src_uidset, uid1, uid2);
+					      uid_validity, src_uidset,
+					      uid1, uid2);
 		}
 	}
 
diff -r 3fabc189d17c -r 3a1eed408cad src/lib-storage/index/cydir/cydir-save.c
--- a/src/lib-storage/index/cydir/cydir-save.c	Sun Aug 12 15:05:13 2007 +0300
+++ b/src/lib-storage/index/cydir/cydir-save.c	Sun Aug 12 15:10:35 2007 +0300
@@ -249,6 +249,7 @@ 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;
 
diff -r 3fabc189d17c -r 3a1eed408cad src/lib-storage/index/cydir/cydir-sync.c
--- a/src/lib-storage/index/cydir/cydir-sync.c	Sun Aug 12 15:05:13 2007 +0300
+++ b/src/lib-storage/index/cydir/cydir-sync.c	Sun Aug 12 15:10:35 2007 +0300
@@ -13,6 +13,7 @@ static int cydir_sync_set_uidvalidity(st
 	mail_index_update_header(ctx->trans,
 		offsetof(struct mail_index_header, uid_validity),
 		&uid_validity, sizeof(uid_validity), TRUE);
+	ctx->uid_validity = uid_validity;
 	return 0;
 }
 
@@ -72,7 +73,9 @@ static int cydir_sync_index(struct cydir
 	int ret = 1;
 
 	hdr = mail_index_get_header(ctx->sync_view);
-	if (hdr->uid_validity == 0) {
+	if (hdr->uid_validity != 0)
+		ctx->uid_validity = hdr->uid_validity;
+	else {
 		if (cydir_sync_set_uidvalidity(ctx) < 0)
 			return -1;
 	}
diff -r 3fabc189d17c -r 3a1eed408cad src/lib-storage/index/cydir/cydir-sync.h
--- a/src/lib-storage/index/cydir/cydir-sync.h	Sun Aug 12 15:05:13 2007 +0300
+++ b/src/lib-storage/index/cydir/cydir-sync.h	Sun Aug 12 15:10:35 2007 +0300
@@ -12,6 +12,7 @@ struct cydir_sync_context {
 
 	string_t *path;
 	unsigned int path_dir_prefix_len;
+	uint32_t uid_validity;
 };
 
 int cydir_sync_begin(struct cydir_mailbox *mbox,
diff -r 3fabc189d17c -r 3a1eed408cad src/lib-storage/index/index-storage.h
--- a/src/lib-storage/index/index-storage.h	Sun Aug 12 15:05:13 2007 +0300
+++ b/src/lib-storage/index/index-storage.h	Sun Aug 12 15:10:35 2007 +0300
@@ -80,6 +80,7 @@ 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;
@@ -173,6 +174,7 @@ index_transaction_begin(struct mailbox *
 			enum mailbox_transaction_flags flags);
 int index_transaction_commit(struct mailbox_transaction_context *t,
 			     enum mailbox_sync_flags flags,
+			     uint32_t *uid_validity_r,
 			     uint32_t *first_saved_uid_r,
 			     uint32_t *last_saved_uid_r);
 void index_transaction_rollback(struct mailbox_transaction_context *t);
diff -r 3fabc189d17c -r 3a1eed408cad src/lib-storage/index/index-transaction.c
--- a/src/lib-storage/index/index-transaction.c	Sun Aug 12 15:05:13 2007 +0300
+++ b/src/lib-storage/index/index-transaction.c	Sun Aug 12 15:10:35 2007 +0300
@@ -83,6 +83,7 @@ index_transaction_begin(struct mailbox *
 
 int index_transaction_commit(struct mailbox_transaction_context *_t,
 			     enum mailbox_sync_flags flags,
+			     uint32_t *uid_validity_r,
 			     uint32_t *first_saved_uid_r,
 			     uint32_t *last_saved_uid_r)
 {
@@ -92,9 +93,11 @@ int index_transaction_commit(struct mail
 	uint32_t seq;
 	uoff_t offset;
 
+	*uid_validity_r = 0;
 	*first_saved_uid_r = *last_saved_uid_r = 0;
 
 	t->commit_flags = flags;
+	t->saved_uid_validity = uid_validity_r;
 	t->first_saved_uid = first_saved_uid_r;
 	t->last_saved_uid = last_saved_uid_r;
 
diff -r 3fabc189d17c -r 3a1eed408cad src/lib-storage/index/maildir/maildir-save.c
--- a/src/lib-storage/index/maildir/maildir-save.c	Sun Aug 12 15:05:13 2007 +0300
+++ b/src/lib-storage/index/maildir/maildir-save.c	Sun Aug 12 15:10:35 2007 +0300
@@ -697,8 +697,14 @@ int maildir_transaction_save_commit_pre(
 
 void maildir_transaction_save_commit_post(struct maildir_save_context *ctx)
 {
+	struct maildir_transaction_context *t =
+		(struct maildir_transaction_context *)ctx->ctx.transaction;
+
 	if (ctx->locked)
 		maildir_uidlist_unlock(ctx->mbox->uidlist);
+
+	*t->ictx.saved_uid_validity =
+		maildir_uidlist_get_uid_validity(ctx->mbox->uidlist);
 
 	if (ctx->mail != NULL)
 		index_mail_free(ctx->mail);
diff -r 3fabc189d17c -r 3a1eed408cad src/lib-storage/index/maildir/maildir-storage.c
--- a/src/lib-storage/index/maildir/maildir-storage.c	Sun Aug 12 15:05:13 2007 +0300
+++ b/src/lib-storage/index/maildir/maildir-storage.c	Sun Aug 12 15:10:35 2007 +0300
@@ -848,30 +848,6 @@ static int maildir_storage_mailbox_close
 	maildir_keywords_deinit(mbox->keywords);
 	maildir_uidlist_deinit(mbox->uidlist);
 	return index_storage_mailbox_close(box);
-}
-
-static int maildir_storage_get_status(struct mailbox *box,
-				      enum mailbox_status_items items,
-				      struct mailbox_status *status_r)
-{
-	struct maildir_mailbox *mbox = (struct maildir_mailbox *)box;
-	uint32_t uid_validity, next_uid;
-
-	if (index_storage_get_status(box, items, status_r) < 0)
-		return -1;
-
-	/* if index isn't up-to-date, get the values from uidlist */
-	if (maildir_uidlist_refresh(mbox->uidlist) < 0)
-		return -1;
-
-	uid_validity = maildir_uidlist_get_uid_validity(mbox->uidlist);
-	if (uid_validity != 0)
-		status_r->uidvalidity = uid_validity;
-
-	next_uid = maildir_uidlist_get_next_uid(mbox->uidlist);
-	if (status_r->uidnext < next_uid)
-		status_r->uidnext = next_uid;
-	return 0;
 }
 
 static void maildir_notify_changes(struct mailbox *box)
@@ -1059,7 +1035,7 @@ struct mailbox maildir_mailbox = {
 		index_storage_is_readonly,
 		index_storage_allow_new_keywords,
 		maildir_storage_mailbox_close,
-		maildir_storage_get_status,
+		index_storage_get_status,
 		maildir_list_index_has_changed,
 		maildir_list_index_update_sync,
 		maildir_storage_sync_init,
diff -r 3fabc189d17c -r 3a1eed408cad src/lib-storage/index/mbox/mbox-save.c
--- a/src/lib-storage/index/mbox/mbox-save.c	Sun Aug 12 15:05:13 2007 +0300
+++ b/src/lib-storage/index/mbox/mbox-save.c	Sun Aug 12 15:10:35 2007 +0300
@@ -664,6 +664,7 @@ int mbox_transaction_save_commit(struct 
 	}
 
 	if (ctx->synced) {
+		*t->ictx.saved_uid_validity = ctx->uid_validity;
 		*t->ictx.first_saved_uid = ctx->first_saved_uid;
 
 		mail_index_update_header(ctx->trans,
diff -r 3fabc189d17c -r 3a1eed408cad src/lib-storage/mail-storage-private.h
--- a/src/lib-storage/mail-storage-private.h	Sun Aug 12 15:05:13 2007 +0300
+++ b/src/lib-storage/mail-storage-private.h	Sun Aug 12 15:10:35 2007 +0300
@@ -111,6 +111,7 @@ struct mailbox_vfuncs {
 				     enum mailbox_transaction_flags flags);
 	int (*transaction_commit)(struct mailbox_transaction_context *t,
 				  enum mailbox_sync_flags flags,
+				  uint32_t *uid_validity_r,
 				  uint32_t *first_saved_uid_r,
 				  uint32_t *last_saved_uid_r);
 	void (*transaction_rollback)(struct mailbox_transaction_context *t);
diff -r 3fabc189d17c -r 3a1eed408cad src/lib-storage/mail-storage.c
--- a/src/lib-storage/mail-storage.c	Sun Aug 12 15:05:13 2007 +0300
+++ b/src/lib-storage/mail-storage.c	Sun Aug 12 15:10:35 2007 +0300
@@ -617,11 +617,12 @@ int mailbox_transaction_commit(struct ma
 {
 	uint32_t tmp;
 
-	return mailbox_transaction_commit_get_uids(t, flags, &tmp, &tmp);
+	return mailbox_transaction_commit_get_uids(t, flags, &tmp, &tmp, &tmp);
 }
 
 int mailbox_transaction_commit_get_uids(struct mailbox_transaction_context **_t,
 					enum mailbox_sync_flags flags,
+					uint32_t *uid_validity_r,
 					uint32_t *first_saved_uid_r,
 					uint32_t *last_saved_uid_r)
 {
@@ -630,7 +631,8 @@ int mailbox_transaction_commit_get_uids(
 	t->box->transaction_count--;
 
 	*_t = NULL;
-	return t->box->v.transaction_commit(t, flags, first_saved_uid_r,
+	return t->box->v.transaction_commit(t, flags, uid_validity_r,
+					    first_saved_uid_r,
 					    last_saved_uid_r);
 }
 
diff -r 3fabc189d17c -r 3a1eed408cad src/lib-storage/mail-storage.h
--- a/src/lib-storage/mail-storage.h	Sun Aug 12 15:05:13 2007 +0300
+++ b/src/lib-storage/mail-storage.h	Sun Aug 12 15:10:35 2007 +0300
@@ -314,6 +314,7 @@ int mailbox_transaction_commit(struct ma
 /* If no messages were saved/copied, first/last_saved_uid_r are 0. */
 int mailbox_transaction_commit_get_uids(struct mailbox_transaction_context **t,
 					enum mailbox_sync_flags flags,
+					uint32_t *uid_validity_r,
 					uint32_t *first_saved_uid_r,
 					uint32_t *last_saved_uid_r);
 void mailbox_transaction_rollback(struct mailbox_transaction_context **t);


More information about the dovecot-cvs mailing list