bool index_mailbox_sync_next(struct mailbox_sync_context *_ctx, struct mailbox_sync_rec *sync_rec_r) { struct index_mailbox_sync_context *ctx = (struct index_mailbox_sync_context *)_ctx; const struct seq_range *range; unsigned int count; if (ctx->failed) return FALSE; range = array_get(&ctx->flag_updates, &count); if (ctx->flag_update_idx < count) { sync_rec_r->type = MAILBOX_SYNC_TYPE_FLAGS; sync_rec_r->seq1 = range[ctx->flag_update_idx].seq1; sync_rec_r->seq2 = range[ctx->flag_update_idx].seq2; ctx->flag_update_idx++; return TRUE; } if ((_ctx->box->enabled_features & MAILBOX_FEATURE_CONDSTORE) != 0) { /* hidden flag changes' MODSEQs still need to be returned */ range = array_get(&ctx->hidden_updates, &count); if (ctx->hidden_update_idx < count) { sync_rec_r->type = MAILBOX_SYNC_TYPE_MODSEQ; sync_rec_r->seq1 = range[ctx->hidden_update_idx].seq1; sync_rec_r->seq2 = range[ctx->hidden_update_idx].seq2; ctx->hidden_update_idx++; return TRUE; } } return index_mailbox_sync_next_expunge(ctx, sync_rec_r); }
int index_mailbox_sync_deinit(struct mailbox_sync_context *_ctx, struct mailbox_sync_status *status_r) { struct index_mailbox_sync_context *ctx = (struct index_mailbox_sync_context *)_ctx; struct mailbox_sync_rec sync_rec; bool delayed_expunges = FALSE; int ret = ctx->failed ? -1 : 0; /* finish handling expunges, so we don't break when updating recent flags */ while (index_mailbox_sync_next_expunge(ctx, &sync_rec) > 0) ; /* convert sequences to uids before syncing view */ index_sync_search_results_uidify(ctx); if (ctx->sync_ctx != NULL) { if (mail_index_view_sync_commit(&ctx->sync_ctx, &delayed_expunges) < 0) { mailbox_set_index_error(_ctx->box); ret = -1; } } index_mailbox_expunge_unseen_recent(ctx); if ((_ctx->box->flags & MAILBOX_FLAG_DROP_RECENT) == 0 && _ctx->box->opened) { /* mailbox syncing didn't necessarily update our recent state */ index_sync_update_recent_count(_ctx->box); } if (status_r != NULL) status_r->sync_delayed_expunges = delayed_expunges; /* update search results after private index is updated */ index_sync_search_results_update(ctx); if (array_is_created(&ctx->flag_updates)) array_free(&ctx->flag_updates); if (array_is_created(&ctx->hidden_updates)) array_free(&ctx->hidden_updates); if (array_is_created(&ctx->all_flag_update_uids)) array_free(&ctx->all_flag_update_uids); /* update vsize header if wanted */ if (ret == 0) index_mailbox_vsize_update_appends(_ctx->box); i_free(ctx); return ret; }