static int index_storage_mailbox_update_pvt(struct mailbox *box, const struct mailbox_update *update) { struct mail_index_transaction *trans; struct mail_index_view *view; int ret; if ((ret = mailbox_open_index_pvt(box)) <= 0) return ret; mail_index_refresh(box->index_pvt); view = mail_index_view_open(box->index_pvt); trans = mail_index_transaction_begin(view, MAIL_INDEX_TRANSACTION_FLAG_EXTERNAL); if (update->min_highest_modseq != 0 && mail_index_modseq_get_highest(view) < update->min_highest_pvt_modseq) { mail_index_modseq_enable(box->index_pvt); mail_index_update_highest_modseq(trans, update->min_highest_pvt_modseq); } if ((ret = mail_index_transaction_commit(&trans)) < 0) mailbox_set_index_error(box); mail_index_view_close(&view); return ret; }
int index_storage_mailbox_enable(struct mailbox *box, enum mailbox_feature feature) { if ((feature & MAILBOX_FEATURE_CONDSTORE) != 0) { box->enabled_features |= MAILBOX_FEATURE_CONDSTORE; if (box->opened) mail_index_modseq_enable(box->index); } return 0; }
uint64_t index_mail_get_modseq(struct mail *_mail) { struct index_mail *mail = (struct index_mail *)_mail; if (mail->data.modseq != 0) return mail->data.modseq; mail_index_modseq_enable(_mail->box->index); mail->data.modseq = mail_index_modseq_lookup(_mail->transaction->view, _mail->seq); return mail->data.modseq; }
static void search_init_arg(struct mail_search_arg *arg, struct index_search_context *ctx) { uint8_t guid[MAIL_GUID_128_SIZE]; bool match; switch (arg->type) { case SEARCH_SEQSET: ctx->have_seqsets = TRUE; break; case SEARCH_UIDSET: case SEARCH_INTHREAD: case SEARCH_FLAGS: case SEARCH_KEYWORDS: case SEARCH_MODSEQ: if (arg->type == SEARCH_MODSEQ) mail_index_modseq_enable(ctx->box->index); ctx->have_index_args = TRUE; break; case SEARCH_MAILBOX_GUID: if (mailbox_get_guid(ctx->box, guid) < 0) { /* result will be unknown */ break; } match = strcmp(mail_guid_128_to_string(guid), arg->value.str) == 0; if (match != arg->not) arg->match_always = TRUE; else arg->nonmatch_always = TRUE; break; case SEARCH_MAILBOX: case SEARCH_MAILBOX_GLOB: ctx->have_mailbox_args = TRUE; break; case SEARCH_ALL: if (!arg->not) arg->match_always = TRUE; else arg->nonmatch_always = TRUE; break; default: break; } }
int index_storage_mailbox_open(struct mailbox *box, bool move_to_memory) { struct index_mailbox_context *ibox = INDEX_STORAGE_CONTEXT(box); enum mail_index_open_flags index_flags; int ret; i_assert(!box->opened); index_flags = ibox->index_flags; if (move_to_memory) ibox->index_flags &= ~MAIL_INDEX_OPEN_FLAG_CREATE; if (index_storage_mailbox_alloc_index(box) < 0) return -1; /* make sure mail_index_set_permissions() has been called */ (void)mailbox_get_permissions(box); ret = mail_index_open(box->index, index_flags); if (ret <= 0 || move_to_memory) { if ((index_flags & MAIL_INDEX_OPEN_FLAG_NEVER_IN_MEMORY) != 0) { i_assert(ret <= 0); mailbox_set_index_error(box); return -1; } if (mail_index_move_to_memory(box->index) < 0) { /* try opening once more. it should be created directly into memory now. */ if (mail_index_open_or_create(box->index, index_flags) < 0) i_panic("in-memory index creation failed"); } } if ((index_flags & MAIL_INDEX_OPEN_FLAG_NEVER_IN_MEMORY) != 0) { if (mail_index_is_in_memory(box->index)) { mail_storage_set_critical(box->storage, "Couldn't create index file"); mail_index_close(box->index); return -1; } } if ((box->flags & MAILBOX_FLAG_OPEN_DELETED) == 0) { if (mail_index_is_deleted(box->index)) { mailbox_set_deleted(box); mail_index_close(box->index); return -1; } } box->cache = mail_index_get_cache(box->index); index_cache_register_defaults(box); box->view = mail_index_view_open(box->index); ibox->keyword_names = mail_index_get_keywords(box->index); ibox->vsize_hdr_ext_id = mail_index_ext_register(box->index, "hdr-vsize", sizeof(struct index_vsize_header), 0, sizeof(uint64_t)); box->opened = TRUE; if ((box->enabled_features & MAILBOX_FEATURE_CONDSTORE) != 0) mail_index_modseq_enable(box->index); index_thread_mailbox_opened(box); hook_mailbox_opened(box); return 0; }