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