mail-index-view-sync.c revision bbe90c4805e7032fdcefde3df125df0ca8be1bef
e59faf65ce864fe95dc00f5d52b8323cdbd0608aTimo Sirainen/* Copyright (C) 2003-2004 Timo Sirainen */
79977d368df2efc3f3dc0bbb260748b076538103Timo Sirainenmail_transaction_log_sort_expunges(ARRAY_TYPE(seq_range) *expunges,
277c0eea825eec176cddc029af68f5a4d942e16eTimo Sirainen /* Note that all the sequences are actually still UIDs at this point */
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen /* @UNSAFE */
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen dest = array_get_modifiable(expunges, &dest_count);
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen array_append(expunges, src, src_size / sizeof(*src));
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen /* src[] must be sorted. */
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen (src+1 != src_end && src->seq2 >= src[1].seq1))
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen for (; i < dest_count; i++) {
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen while (i < dest_count && src->seq2 >= dest[i].seq1-1) {
277c0eea825eec176cddc029af68f5a4d942e16eTimo Sirainen /* we can/must merge with next record */
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen if (first > 0 && new_exp.seq1 <= dest[first-1].seq2+1) {
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen /* continue previous record */
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen } else if (i == first) {
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen dest = array_get_modifiable(expunges, &dest_count);
7bafda1813454621e03615e83d55bccfa7cc56bdTimo Sirainen /* use next record */
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen dest = array_get_modifiable(expunges, &dest_count);
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainenstatic int view_sync_set_log_view_range(struct mail_index_view *view)
f059a046515f4b2b15a6c2a10a6f12f6166e39a5Timo Sirainen const struct mail_index_header *hdr = view->index->hdr;
7ceee001c11865a88a311c50c4430867b2d32ce6Timo Sirainen /* the view begins from the first non-synced transaction */
7ceee001c11865a88a311c50c4430867b2d32ce6Timo Sirainen ret = mail_transaction_log_view_set(view->log_view,
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen /* FIXME: use the new index to get needed changes */
b215a8a123623782554a83f3025ef4e771bd8f01Timo Sirainen "Transaction log got desynced for index %s",
02a0492affdff138f43903c19ca366363923044dTimo Sirainenview_sync_get_expunges(struct mail_index_view *view,
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen unsigned int count;
97db4761382024093f441e4bc78ba8b6a056504dTimo Sirainen /* get a list of expunge transactions. there may be some that we have
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen already synced, but it doesn't matter because they'll get dropped
b215a8a123623782554a83f3025ef4e771bd8f01Timo Sirainen out when converting to sequences */
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen while ((ret = mail_transaction_log_view_next(view->log_view,
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen if ((hdr->type & MAIL_TRANSACTION_EXPUNGE) == 0)
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen if ((hdr->type & MAIL_TRANSACTION_EXTERNAL) == 0) {
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen /* this is simply a request for expunge */
b215a8a123623782554a83f3025ef4e771bd8f01Timo Sirainen if (mail_transaction_log_sort_expunges(expunges_r, data,
b215a8a123623782554a83f3025ef4e771bd8f01Timo Sirainen mail_transaction_log_view_set_corrupted(view->log_view,
b215a8a123623782554a83f3025ef4e771bd8f01Timo Sirainen "Corrupted expunge record");
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen /* convert UIDs to sequences */
b215a8a123623782554a83f3025ef4e771bd8f01Timo Sirainen src = dest = array_get_modifiable(expunges_r, &count);
ed4cdfe5847a6063d5a4684a6a47b17e943922b5Timo Sirainen ret = mail_index_lookup_uid_range(view, src->seq1,
ed4cdfe5847a6063d5a4684a6a47b17e943922b5Timo Sirainen array_delete(expunges_r, count, array_count(expunges_r) - count);
ed4cdfe5847a6063d5a4684a6a47b17e943922b5Timo Sirainenstatic void mail_index_view_hdr_update(struct mail_index_view *view,
ed4cdfe5847a6063d5a4684a6a47b17e943922b5Timo Sirainen /* Keep message count the same. */
ed4cdfe5847a6063d5a4684a6a47b17e943922b5Timo Sirainen map->hdr.messages_count = view->hdr.messages_count;
5d03d9f439e41c90215a3c938ffebe4c2a8ae257Timo Sirainen /* Keep the old message flag counts also, although they may be
97db4761382024093f441e4bc78ba8b6a056504dTimo Sirainen somewhat stale already. We just don't want them to be more than
f059a046515f4b2b15a6c2a10a6f12f6166e39a5Timo Sirainen our old messages_count. */
71b5ad1df203c906d46960b0400564609b97a6c8Timo Sirainen map->hdr.recent_messages_count = view->hdr.recent_messages_count;
f059a046515f4b2b15a6c2a10a6f12f6166e39a5Timo Sirainen map->hdr.seen_messages_count = view->hdr.seen_messages_count;
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen map->hdr.deleted_messages_count = view->hdr.deleted_messages_count;
b215a8a123623782554a83f3025ef4e771bd8f01Timo Sirainen /* Keep log position so we know where to continue syncing */
5d03d9f439e41c90215a3c938ffebe4c2a8ae257Timo Sirainen map->hdr.log_file_seq = view->hdr.log_file_seq;
f059a046515f4b2b15a6c2a10a6f12f6166e39a5Timo Sirainen buffer_write(map->hdr_copy_buf, 0, &map->hdr, sizeof(map->hdr));
97db4761382024093f441e4bc78ba8b6a056504dTimo Sirainenstatic void mail_index_view_check(struct mail_index_view *view)
97db4761382024093f441e4bc78ba8b6a056504dTimo Sirainen unsigned int i, del = 0, recent = 0, seen = 0;
5d03d9f439e41c90215a3c938ffebe4c2a8ae257Timo Sirainen for (i = 0; i < view->map->records_count; i++) {
5d03d9f439e41c90215a3c938ffebe4c2a8ae257Timo Sirainen i_assert(rec->uid >= view->hdr.first_deleted_uid_lowwater);
f059a046515f4b2b15a6c2a10a6f12f6166e39a5Timo Sirainen i_assert(rec->uid >= view->hdr.first_recent_uid_lowwater);
f059a046515f4b2b15a6c2a10a6f12f6166e39a5Timo Sirainen i_assert(rec->uid >= view->hdr.first_unseen_uid_lowwater);
ed4cdfe5847a6063d5a4684a6a47b17e943922b5Timo Sirainen i_assert(del == view->hdr.deleted_messages_count);
ed4cdfe5847a6063d5a4684a6a47b17e943922b5Timo Sirainen i_assert(recent == view->hdr.recent_messages_count);
f059a046515f4b2b15a6c2a10a6f12f6166e39a5Timo Sirainen i_assert(seen == view->hdr.seen_messages_count);
5d03d9f439e41c90215a3c938ffebe4c2a8ae257Timo Sirainen MAIL_INDEX_SYNC_TYPE_KEYWORD_ADD | MAIL_INDEX_SYNC_TYPE_KEYWORD_REMOVE)
#define MAIL_TRANSACTION_VISIBLE_SYNC_MASK \
switch (sync_type) {
#ifdef DEBUG
unsigned int i, count;
return FALSE;
for (i = 0; i < count; i++) {
return TRUE;
return FALSE;
return FALSE;
return FALSE;
return FALSE;
return TRUE;
int ret;
bool synced_to_map;
if (ret <= 0) {
if (ret < 0)
store +flags.silent command) */
#define FLAG_UPDATE_IS_INTERNAL(u) \
case MAIL_TRANSACTION_APPEND: {
case MAIL_TRANSACTION_EXPUNGE: {
case MAIL_TRANSACTION_FLAG_UPDATE: {
case MAIL_TRANSACTION_KEYWORD_UPDATE: {
case MAIL_TRANSACTION_KEYWORD_RESET: {
i_unreached();
int ret;
if (ret <= 0)
return ret;
bool fast_clean)
unsigned int i, count;
for (i = 0; i < count; i++) {
#ifdef DEBUG
unsigned int length)