dovecot-1.2: mail_storage_get_expunged_uids(): Support v2.0 expu...

dovecot at dovecot.org dovecot at dovecot.org
Tue Sep 1 02:15:45 EEST 2009


details:   http://hg.dovecot.org/dovecot-1.2/rev/4e031f3d9083
changeset: 9350:4e031f3d9083
user:      Timo Sirainen <tss at iki.fi>
date:      Mon Aug 31 19:15:00 2009 -0400
description:
mail_storage_get_expunged_uids(): Support v2.0 expunge-guid records.

diffstat:

1 file changed, 37 insertions(+), 19 deletions(-)
src/lib-storage/index/index-fetch.c |   56 +++++++++++++++++++++++------------

diffs (83 lines):

diff -r a5d530edfafe -r 4e031f3d9083 src/lib-storage/index/index-fetch.c
--- a/src/lib-storage/index/index-fetch.c	Mon Aug 31 19:13:54 2009 -0400
+++ b/src/lib-storage/index/index-fetch.c	Mon Aug 31 19:15:00 2009 -0400
@@ -39,19 +39,40 @@ void index_storage_get_uid_range(struct 
 	}
 }
 
+static void
+add_expunges(ARRAY_TYPE(seq_range) *expunged_uids,
+	     const struct mail_transaction_expunge *src, size_t src_size)
+{
+	const struct mail_transaction_expunge *end;
+
+	end = src + src_size / sizeof(*src);
+	for (; src != end; src++)
+		seq_range_array_add_range(expunged_uids, src->uid1, src->uid2);
+}
+
+static void
+add_guid_expunges(ARRAY_TYPE(seq_range) *expunged_uids,
+		  const struct mail_transaction_expunge_guid *src,
+		  size_t src_size, const ARRAY_TYPE(seq_range) *uids_filter)
+{
+	const struct mail_transaction_expunge_guid *end;
+
+	end = src + src_size / sizeof(*src);
+	for (; src != end; src++) {
+		if (seq_range_exists(uids_filter, src->uid))
+			seq_range_array_add(expunged_uids, 0, src->uid);
+	}
+}
+
 bool index_storage_get_expunged_uids(struct mailbox *box, uint64_t modseq,
 				     const ARRAY_TYPE(seq_range) *uids,
 				     ARRAY_TYPE(seq_range) *expunged_uids)
 {
-#define EXPUNGE_MASK (MAIL_TRANSACTION_EXPUNGE | MAIL_TRANSACTION_EXTERNAL)
 	struct index_mailbox *ibox = (struct index_mailbox *)box;
 	struct mail_transaction_log_view *log_view;
 	const struct mail_transaction_header *thdr;
-	const struct mail_transaction_expunge *rec, *end;
-	const struct seq_range *uid_range;
-	unsigned int count;
 	const void *tdata;
-	uint32_t log_seq, min_uid, max_uid;
+	uint32_t log_seq;
 	uoff_t log_offset;
 	bool reset;
 
@@ -75,22 +96,19 @@ bool index_storage_get_expunged_uids(str
 	}
 
 	/* do only minimal range checks while adding the UIDs. */
-	uid_range = array_get(uids, &count);
-	i_assert(count > 0);
-	min_uid = uid_range[0].seq1;
-	max_uid = uid_range[count-1].seq2;
-
 	while (mail_transaction_log_view_next(log_view, &thdr, &tdata) > 0) {
-		if ((thdr->type & EXPUNGE_MASK) != EXPUNGE_MASK)
+		if ((thdr->type & MAIL_TRANSACTION_EXTERNAL) == 0) {
+			/* skip expunge requests */
 			continue;
-
-		rec = tdata;
-		end = rec + thdr->size / sizeof(*rec);
-		for (; rec != end; rec++) {
-			if (!(rec->uid1 > max_uid || rec->uid2 < min_uid)) {
-				seq_range_array_add_range(expunged_uids,
-							  rec->uid1, rec->uid2);
-			}
+		}
+		switch (thdr->type & MAIL_TRANSACTION_TYPE_MASK) {
+		case MAIL_TRANSACTION_EXPUNGE:
+			add_expunges(expunged_uids, tdata, thdr->size);
+			break;
+		case MAIL_TRANSACTION_EXPUNGE_GUID:
+			add_guid_expunges(expunged_uids, tdata, thdr->size,
+					  uids);
+			break;
 		}
 	}
 


More information about the dovecot-cvs mailing list