# HG changeset patch # User Timo Sirainen # Date 1251760500 14400 # Node ID 4e031f3d908333de4763bcd0b15a40d24d8f7803 # Parent a5d530edfafe8b3ac2b6d8fc5f6596a489de7558 mail_storage_get_expunged_uids(): Support v2.0 expunge-guid records. 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 @@ } } +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 @@ } /* 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; } }