mail-index-view-sync.c revision fd3f33bdb57170d63aea66ecacc8bea0f0145d6a
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher/* Copyright (C) 2003-2004 Timo Sirainen */
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher enum mail_transaction_type visible_sync_mask;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher struct mail_index_sync_map_ctx sync_map_ctx;
ee359fe1384507fed6c2274e7bfe81d288de4542Stephen Gallagher const struct mail_transaction_header *hdr;
33396dc46ea52c18f47db1b5d590880806521005Sumit Bose const void *data;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallaghermail_transaction_log_sort_expunges(ARRAY_TYPE(seq_range) *expunges,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher const struct seq_range *src, size_t src_size)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher /* Note that all the sequences are actually still UIDs at this point */
1183d29d87c5c7439cf2364b7d7324d4a13b6e35Stephen Gallagher dest = array_get_modifiable(expunges, &dest_count);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher array_append(expunges, src, src_size / sizeof(*src));
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher src_end = CONST_PTR_OFFSET(src, src_size);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher /* src[] must be sorted. */
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher i_assert(src+1 == src_end || src->seq2 < src[1].seq1);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher for (; i < dest_count; i++) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher while (i < dest_count && src->seq2 >= dest[i].seq1-1) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher /* we can/must merge with next record */
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (first > 0 && new_exp.seq1 <= dest[first-1].seq2+1) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher /* continue previous record */
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher } else if (i == first) {
d921c1eba437662437847279f251a0a5d8f70127Maxim /* use next record */
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher dest = array_get_modifiable(expunges, &dest_count);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherstatic int view_sync_set_log_view_range(struct mail_index_view *view,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher const struct mail_index_header *hdr = view->index->hdr;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = mail_transaction_log_view_set(view->log_view,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher /* FIXME: use the new index to get needed changes */
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher "Transaction log got desynced for index %s",
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherview_sync_get_expunges(struct mail_index_view *view,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher const struct mail_transaction_header *hdr;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (view_sync_set_log_view_range(view, MAIL_TRANSACTION_EXPUNGE) < 0)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher while ((ret = mail_transaction_log_view_next(view->log_view,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher i_assert((hdr->type & MAIL_TRANSACTION_EXPUNGE) != 0);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher mail_transaction_log_sort_expunges(expunges_r, data, hdr->size);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher /* convert UIDs to sequences */
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher src = dest = array_get_modifiable(expunges_r, &count);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ret = mail_index_lookup_uid_range(view, src->seq1,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher array_delete(expunges_r, count, array_count(expunges_r) - count);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagherstatic void mail_index_view_hdr_update(struct mail_index_view *view,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher /* Keep message count the same. */
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher map->hdr.messages_count = view->hdr.messages_count;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher /* Keep the old message flag counts also, although they may be
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher somewhat stale already. We just don't want them to be more than
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher our old messages_count. */
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher map->hdr.recent_messages_count = view->hdr.recent_messages_count;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher map->hdr.seen_messages_count = view->hdr.seen_messages_count;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher map->hdr.deleted_messages_count = view->hdr.deleted_messages_count;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher /* Keep log position so we know where to continue syncing */
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher map->hdr.log_file_seq = view->hdr.log_file_seq;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher map->hdr.log_file_int_offset = view->hdr.log_file_int_offset;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher map->hdr.log_file_ext_offset = view->hdr.log_file_ext_offset;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher buffer_write(map->hdr_copy_buf, 0, &map->hdr, sizeof(map->hdr));
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher#define MAIL_INDEX_VIEW_VISIBLE_FLAGS_MASK \
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher MAIL_INDEX_SYNC_TYPE_KEYWORD_ADD | MAIL_INDEX_SYNC_TYPE_KEYWORD_REMOVE)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher#define MAIL_TRANSACTION_VISIBLE_SYNC_MASK \
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher (MAIL_TRANSACTION_EXPUNGE | MAIL_TRANSACTION_APPEND | \
96c73559adfbdac96720008fc022cb1d540b53c3Jakub Hrozek MAIL_TRANSACTION_FLAG_UPDATE | MAIL_TRANSACTION_KEYWORD_UPDATE | \
del++;
recent++;
seen++;
#ifdef DEBUG
unsigned int i, count;
return FALSE;
for (i = 0; i < count; i++) {
return TRUE;
return FALSE;
int ret;
bool skipped;
if (skipped) {
if (ret <= 0) {
if (ret < 0)
offset);
MAIL_TRANSACTION_EXPUNGE) == 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;
unsigned int i, count;
for (i = 0; i < count; i++) {
#ifdef DEBUG