changeset 5572:896845fbc4ed HEAD

Added mailbox_transaction_commit_get_uids() which returns the UID range for saved/copied messages.
author Timo Sirainen <tss@iki.fi>
date Tue, 17 Apr 2007 19:40:55 +0300
parents 00aaa3ba21c0
children 9805becea644
files 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/plugins/expire/expire-plugin.c src/plugins/fts/fts-storage.c src/plugins/lazy-expunge/lazy-expunge-plugin.c src/plugins/quota/quota-storage.c
diffstat 13 files changed, 91 insertions(+), 17 deletions(-) [+]
line wrap: on
line diff
--- a/src/lib-storage/index/cydir/cydir-save.c	Tue Apr 17 19:04:15 2007 +0300
+++ b/src/lib-storage/index/cydir/cydir-save.c	Tue Apr 17 19:40:55 2007 +0300
@@ -166,6 +166,8 @@
 
 int cydir_transaction_save_commit_pre(struct cydir_save_context *ctx)
 {
+	struct cydir_transaction_context *t =
+		(struct cydir_transaction_context *)ctx->ctx.transaction;
 	const struct mail_index_header *hdr;
 	uint32_t i, uid, next_uid;
 	const char *dir;
@@ -184,6 +186,9 @@
 	uid = hdr->next_uid;
 	mail_index_append_assign_uids(ctx->trans, uid, &next_uid);
 
+	t->ictx.first_saved_uid = uid;
+	t->ictx.last_saved_uid = next_uid - 1;
+
 	dir = mailbox_list_get_path(ctx->mbox->storage->storage.list,
 				    ctx->mbox->ibox.box.name,
 				    MAILBOX_LIST_PATH_TYPE_MAILBOX);
--- a/src/lib-storage/index/dbox/dbox-save.c	Tue Apr 17 19:04:15 2007 +0300
+++ b/src/lib-storage/index/dbox/dbox-save.c	Tue Apr 17 19:40:55 2007 +0300
@@ -346,6 +346,9 @@
 	}
 	mail_index_append_assign_uids(ctx->trans, uid, &next_uid);
 
+	t->ictx.first_saved_uid = uid;
+	t->ictx.last_saved_uid = next_uid - 1;
+
 	/* update UIDs */
 	for (seq = t->first_saved_mail_seq; seq <= ctx->seq; seq++, uid++) {
 		ret = dbox_mail_lookup_offset(&t->ictx, seq,
--- a/src/lib-storage/index/index-storage.h	Tue Apr 17 19:04:15 2007 +0300
+++ b/src/lib-storage/index/index-storage.h	Tue Apr 17 19:40:55 2007 +0300
@@ -82,6 +82,8 @@
 	struct mail_cache_view *cache_view;
 	struct mail_cache_transaction_ctx *cache_trans;
 
+	uint32_t first_saved_uid, last_saved_uid;
+
 	unsigned int cache_trans_failed:1;
 };
 
@@ -170,7 +172,9 @@
 index_transaction_begin(struct mailbox *box,
 			enum mailbox_transaction_flags flags);
 int index_transaction_commit(struct mailbox_transaction_context *t,
-			     enum mailbox_sync_flags flags);
+			     enum mailbox_sync_flags flags,
+			     uint32_t *first_saved_uid_r,
+			     uint32_t *last_saved_uid_r);
 void index_transaction_rollback(struct mailbox_transaction_context *t);
 
 bool index_keyword_array_cmp(const ARRAY_TYPE(keyword_indexes) *k1,
--- a/src/lib-storage/index/index-transaction.c	Tue Apr 17 19:04:15 2007 +0300
+++ b/src/lib-storage/index/index-transaction.c	Tue Apr 17 19:40:55 2007 +0300
@@ -77,8 +77,11 @@
 	it->flags = flags;
 	return &it->mailbox_ctx;
 }
+
 int index_transaction_commit(struct mailbox_transaction_context *_t,
-			     enum mailbox_sync_flags flags)
+			     enum mailbox_sync_flags flags,
+			     uint32_t *first_saved_uid_r,
+			     uint32_t *last_saved_uid_r)
 {
 	struct index_transaction_context *t =
 		(struct index_transaction_context *)_t;
@@ -87,7 +90,14 @@
 	uoff_t offset;
 
 	t->commit_flags = flags;
-	return mail_index_transaction_commit(&itrans, &seq, &offset);
+	if (mail_index_transaction_commit(&itrans, &seq, &offset) < 0)
+		return -1;
+
+	if (t->first_saved_uid <= t->last_saved_uid) {
+		*first_saved_uid_r = t->first_saved_uid;
+		*last_saved_uid_r = t->last_saved_uid;
+	}
+	return 0;
 }
 
 void index_transaction_rollback(struct mailbox_transaction_context *_t)
--- a/src/lib-storage/index/maildir/maildir-save.c	Tue Apr 17 19:04:15 2007 +0300
+++ b/src/lib-storage/index/maildir/maildir-save.c	Tue Apr 17 19:40:55 2007 +0300
@@ -128,7 +128,8 @@
 	   synced state. in that case it's cheap to update index file.
 	   this can't be completely trusted because uidlist isn't locked,
 	   but if there are some changes we can deal with it. */
-	ctx->want_mails = maildir_sync_is_synced(mbox);
+	ctx->want_mails = maildir_sync_is_synced(mbox) ||
+		(t->ictx.flags & MAILBOX_TRANSACTION_FLAG_ASSIGN_UIDS) != 0;
 
 	ctx->keywords_buffer = buffer_create_const_data(pool, NULL, 0);
 	array_create_from_buffer(&ctx->keywords_array, ctx->keywords_buffer,
@@ -515,6 +516,8 @@
 
 int maildir_transaction_save_commit_pre(struct maildir_save_context *ctx)
 {
+	struct maildir_transaction_context *t =
+		(struct maildir_transaction_context *)ctx->ctx.transaction;
 	struct maildir_filename *mf;
 	uint32_t first_uid, next_uid;
 	enum maildir_uidlist_rec_flag flags;
@@ -552,6 +555,9 @@
 		first_uid = maildir_uidlist_get_next_uid(ctx->mbox->uidlist);
 		i_assert(first_uid != 0);
 		mail_index_append_assign_uids(ctx->trans, first_uid, &next_uid);
+
+		t->ictx.first_saved_uid = first_uid;
+		t->ictx.last_saved_uid = next_uid - 1;
 	}
 
 	flags = MAILDIR_UIDLIST_REC_FLAG_NEW_DIR |
--- a/src/lib-storage/index/mbox/mbox-save.c	Tue Apr 17 19:04:15 2007 +0300
+++ b/src/lib-storage/index/mbox/mbox-save.c	Tue Apr 17 19:40:55 2007 +0300
@@ -198,7 +198,9 @@
 	ctx->next_uid = hdr->next_uid;
 	ctx->uid_validity = hdr->uid_validity;
 	ctx->synced = TRUE;
-        t->mbox_modified = TRUE;
+	t->mbox_modified = TRUE;
+
+	t->ictx.first_saved_uid = ctx->next_uid;
 
 	mail_index_view_close(&view);
 }
@@ -272,6 +274,9 @@
 		return -1;
 	}
 
+	if ((t->ictx.flags & MAILBOX_TRANSACTION_FLAG_ASSIGN_UIDS) != 0)
+		want_mail = TRUE;
+
 	if (ctx->append_offset == (uoff_t)-1) {
 		/* first appended mail in this transaction */
 		if (mbox->mbox_lock_type != F_WRLCK) {
@@ -618,6 +623,8 @@
 
 int mbox_transaction_save_commit(struct mbox_save_context *ctx)
 {
+	struct mbox_transaction_context *t =
+		(struct mbox_transaction_context *)ctx->ctx.transaction;
 	struct stat st;
 	int ret = 0;
 
@@ -642,6 +649,8 @@
 				offsetof(struct mail_index_header, sync_size),
 				&sync_size, sizeof(sync_size), TRUE);
 		}
+
+		t->ictx.last_saved_uid = ctx->next_uid - 1;
 	}
 
 	if (!ctx->synced && ctx->mbox->mbox_fd != -1 &&
--- a/src/lib-storage/mail-storage-private.h	Tue Apr 17 19:04:15 2007 +0300
+++ b/src/lib-storage/mail-storage-private.h	Tue Apr 17 19:40:55 2007 +0300
@@ -103,7 +103,9 @@
 		(*transaction_begin)(struct mailbox *box,
 				     enum mailbox_transaction_flags flags);
 	int (*transaction_commit)(struct mailbox_transaction_context *t,
-				  enum mailbox_sync_flags flags);
+				  enum mailbox_sync_flags flags,
+				  uint32_t *first_saved_uid_r,
+				  uint32_t *last_saved_uid_r);
 	void (*transaction_rollback)(struct mailbox_transaction_context *t);
 
 	struct mail_keywords *
--- a/src/lib-storage/mail-storage.c	Tue Apr 17 19:04:15 2007 +0300
+++ b/src/lib-storage/mail-storage.c	Tue Apr 17 19:40:55 2007 +0300
@@ -595,15 +595,26 @@
 	return box->v.transaction_begin(box, flags);
 }
 
-int mailbox_transaction_commit(struct mailbox_transaction_context **_t,
+int mailbox_transaction_commit(struct mailbox_transaction_context **t,
 			       enum mailbox_sync_flags flags)
 {
+	uint32_t tmp;
+
+	return mailbox_transaction_commit_get_uids(t, flags, &tmp, &tmp);
+}
+
+int mailbox_transaction_commit_get_uids(struct mailbox_transaction_context **_t,
+					enum mailbox_sync_flags flags,
+					uint32_t *first_saved_uid_r,
+					uint32_t *last_saved_uid_r)
+{
 	struct mailbox_transaction_context *t = *_t;
 
 	t->box->transaction_count--;
 
 	*_t = NULL;
-	return t->box->v.transaction_commit(t, flags);
+	return t->box->v.transaction_commit(t, flags, first_saved_uid_r,
+					    last_saved_uid_r);
 }
 
 void mailbox_transaction_rollback(struct mailbox_transaction_context **_t)
--- a/src/lib-storage/mail-storage.h	Tue Apr 17 19:04:15 2007 +0300
+++ b/src/lib-storage/mail-storage.h	Tue Apr 17 19:40:55 2007 +0300
@@ -107,7 +107,11 @@
 	MAILBOX_TRANSACTION_FLAG_HIDE		= 0x01,
 	/* External transaction. Should be used for copying and appends,
 	   but nothing else. */
-	MAILBOX_TRANSACTION_FLAG_EXTERNAL	= 0x02
+	MAILBOX_TRANSACTION_FLAG_EXTERNAL	= 0x02,
+	/* Always assign UIDs to messages when saving/copying. Normally this
+	   is done only if the mailbox is synced, or if dest_mail parameter
+	   was non-NULL to mailbox_save_init() or mailbox_copy() */
+	MAILBOX_TRANSACTION_FLAG_ASSIGN_UIDS	= 0x04
 };
 
 enum mailbox_sync_flags {
@@ -303,6 +307,11 @@
 			  enum mailbox_transaction_flags flags);
 int mailbox_transaction_commit(struct mailbox_transaction_context **t,
 			       enum mailbox_sync_flags flags);
+/* 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 *first_saved_uid_r,
+					uint32_t *last_saved_uid_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(struct mailbox *box);
--- a/src/plugins/expire/expire-plugin.c	Tue Apr 17 19:04:15 2007 +0300
+++ b/src/plugins/expire/expire-plugin.c	Tue Apr 17 19:40:55 2007 +0300
@@ -100,7 +100,9 @@
 
 static int
 expire_mailbox_transaction_commit(struct mailbox_transaction_context *t,
-				  enum mailbox_sync_flags flags)
+				  enum mailbox_sync_flags flags,
+				  uint32_t *first_saved_uid_r,
+				  uint32_t *last_saved_uid_r)
 {
 	struct expire_mailbox *xpr_box = EXPIRE_CONTEXT(t->box);
 	struct expire_transaction_context *xt = EXPIRE_CONTEXT(t);
@@ -128,7 +130,9 @@
 	mail_free(&xt->mail);
 	i_free(xt);
 
-	if (xpr_box->module_ctx.super.transaction_commit(t, flags) < 0) {
+	if (xpr_box->module_ctx.super.
+			transaction_commit(t, flags, first_saved_uid_r,
+					   last_saved_uid_r) < 0) {
 		t_pop();
 		return -1;
 	}
--- a/src/plugins/fts/fts-storage.c	Tue Apr 17 19:04:15 2007 +0300
+++ b/src/plugins/fts/fts-storage.c	Tue Apr 17 19:40:55 2007 +0300
@@ -806,14 +806,18 @@
 }
 
 static int fts_transaction_commit(struct mailbox_transaction_context *t,
-				  enum mailbox_sync_flags flags)
+				  enum mailbox_sync_flags flags,
+				  uint32_t *first_saved_uid_r,
+				  uint32_t *last_saved_uid_r)
 {
 	struct mailbox *box = t->box;
 	struct fts_mailbox *fbox = FTS_CONTEXT(box);
 	struct fts_transaction_context *ft = FTS_CONTEXT(t);
 	int ret;
 
-	ret = fbox->module_ctx.super.transaction_commit(t, flags);
+	ret = fbox->module_ctx.super.transaction_commit(t, flags,
+							first_saved_uid_r,
+							last_saved_uid_r);
 	fts_transaction_finish(box, ft, ret == 0);
 	return ret;
 }
--- a/src/plugins/lazy-expunge/lazy-expunge-plugin.c	Tue Apr 17 19:04:15 2007 +0300
+++ b/src/plugins/lazy-expunge/lazy-expunge-plugin.c	Tue Apr 17 19:40:55 2007 +0300
@@ -210,14 +210,17 @@
 
 static int
 lazy_expunge_transaction_commit(struct mailbox_transaction_context *ctx,
-				enum mailbox_sync_flags flags)
+				  enum mailbox_sync_flags flags,
+				  uint32_t *first_saved_uid_r,
+				  uint32_t *last_saved_uid_r)
 {
 	union mailbox_module_context *mbox = LAZY_EXPUNGE_CONTEXT(ctx->box);
 	struct lazy_expunge_transaction *lt = LAZY_EXPUNGE_CONTEXT(ctx);
 	struct mailbox *srcbox = ctx->box;
 	int ret;
 
-	ret = mbox->super.transaction_commit(ctx, flags);
+	ret = mbox->super.transaction_commit(ctx, flags, first_saved_uid_r,
+					     last_saved_uid_r);
 
 	if (ret == 0 && array_is_created(&lt->expunge_seqs))
 		ret = lazy_expunge_move_expunges(srcbox, lt);
--- a/src/plugins/quota/quota-storage.c	Tue Apr 17 19:04:15 2007 +0300
+++ b/src/plugins/quota/quota-storage.c	Tue Apr 17 19:40:55 2007 +0300
@@ -86,12 +86,16 @@
 
 static int
 quota_mailbox_transaction_commit(struct mailbox_transaction_context *ctx,
-				 enum mailbox_sync_flags flags)
+				 enum mailbox_sync_flags flags,
+				 uint32_t *first_saved_uid_r,
+				 uint32_t *last_saved_uid_r)
 {
 	struct quota_mailbox *qbox = QUOTA_CONTEXT(ctx->box);
 	struct quota_transaction_context *qt = QUOTA_CONTEXT(ctx);
 
-	if (qbox->module_ctx.super.transaction_commit(ctx, flags) < 0) {
+	if (qbox->module_ctx.super.transaction_commit(ctx, flags,
+						      first_saved_uid_r,
+						      last_saved_uid_r) < 0) {
 		quota_transaction_rollback(&qt);
 		return -1;
 	} else {