static void fts_mailbox_sync_notify(struct mailbox *box, uint32_t uid, enum mailbox_sync_type sync_type) { struct fts_mailbox_list *flist = FTS_LIST_CONTEXT(box->list); struct fts_mailbox *fbox = FTS_CONTEXT(box); if (fbox->module_ctx.super.sync_notify != NULL) fbox->module_ctx.super.sync_notify(box, uid, sync_type); if (sync_type != MAILBOX_SYNC_TYPE_EXPUNGE) { if (uid == 0 && fbox->sync_update_ctx != NULL) { /* this sync is finished */ (void)fts_backend_update_deinit(&fbox->sync_update_ctx); } return; } if (fbox->sync_update_ctx == NULL) { if (fts_backend_is_updating(flist->backend)) { /* FIXME: maildir workaround - we could get here because we're building an index, which doesn't find some mail and starts syncing the mailbox.. */ return; } fbox->sync_update_ctx = fts_backend_update_init(flist->backend); fts_backend_update_set_mailbox(fbox->sync_update_ctx, box); } fts_backend_update_expunge(fbox->sync_update_ctx, uid); }
static int fts_transaction_end(struct mailbox_transaction_context *t, const char **error_r) { struct fts_transaction_context *ft = FTS_CONTEXT(t); struct fts_mailbox_list *flist = FTS_LIST_CONTEXT(t->box->list); int ret = ft->failed ? -1 : 0; if (ft->failed) *error_r = "transaction context"; if (ft->precached) { i_assert(flist->update_ctx_refcount > 0); if (--flist->update_ctx_refcount == 0) { if (fts_backend_update_deinit(&flist->update_ctx) < 0) { ret = -1; *error_r = "backend deinit"; } } } else if (ft->highest_virtual_uid > 0) { if (fts_index_set_last_uid(t->box, ft->highest_virtual_uid) < 0) { ret = -1; *error_r = "index last uid setting"; } } if (ft->scores != NULL) fts_scores_unref(&ft->scores); i_free(ft); return ret; }