fts-storage.c revision 0211537cbf53ad17348408103fdb0c06de56ed5e
5f5870385cff47efd2f58e7892f251cf13761528Timo Sirainen/* Copyright (c) 2006-2015 Dovecot authors, see the included COPYING file */
c33d3f93abf8392fdc60e12bea41ffd12cc85a8dTimo Sirainen#define INDEXER_HANDSHAKE "VERSION\tindexer\t1\t0\n"
c33d3f93abf8392fdc60e12bea41ffd12cc85a8dTimo Sirainen struct fts_backend_update_context *update_ctx;
c33d3f93abf8392fdc60e12bea41ffd12cc85a8dTimo Sirainen struct fts_backend_update_context *sync_update_ctx;
c33d3f93abf8392fdc60e12bea41ffd12cc85a8dTimo Sirainen union mailbox_transaction_module_context module_ctx;
c33d3f93abf8392fdc60e12bea41ffd12cc85a8dTimo Sirainenstatic MODULE_CONTEXT_DEFINE_INIT(fts_storage_module,
c33d3f93abf8392fdc60e12bea41ffd12cc85a8dTimo Sirainenstatic MODULE_CONTEXT_DEFINE_INIT(fts_mail_module, &mail_module_register);
c33d3f93abf8392fdc60e12bea41ffd12cc85a8dTimo Sirainenstatic MODULE_CONTEXT_DEFINE_INIT(fts_mailbox_list_module,
c33d3f93abf8392fdc60e12bea41ffd12cc85a8dTimo Sirainenstatic int fts_mailbox_get_last_cached_seq(struct mailbox *box, uint32_t *seq_r)
c33d3f93abf8392fdc60e12bea41ffd12cc85a8dTimo Sirainen struct fts_mailbox_list *flist = FTS_LIST_CONTEXT(box->list);
c33d3f93abf8392fdc60e12bea41ffd12cc85a8dTimo Sirainen if (fts_backend_get_last_uid(flist->backend, box, &last_uid) < 0)
c33d3f93abf8392fdc60e12bea41ffd12cc85a8dTimo Sirainen mailbox_get_seq_range(box, 1, last_uid, &seq1, &seq2);
c33d3f93abf8392fdc60e12bea41ffd12cc85a8dTimo Sirainenfts_mailbox_get_status(struct mailbox *box, enum mailbox_status_items items,
c33d3f93abf8392fdc60e12bea41ffd12cc85a8dTimo Sirainen if (fbox->module_ctx.super.get_status(box, items, status_r) < 0)
c33d3f93abf8392fdc60e12bea41ffd12cc85a8dTimo Sirainen if (fts_mailbox_get_last_cached_seq(box, &seq) < 0)
c33d3f93abf8392fdc60e12bea41ffd12cc85a8dTimo Sirainen /* use whichever is smaller */
c33d3f93abf8392fdc60e12bea41ffd12cc85a8dTimo Sirainenstatic void fts_scores_unref(struct fts_scores **_scores)
c33d3f93abf8392fdc60e12bea41ffd12cc85a8dTimo Sirainenstatic void fts_try_build_init(struct mail_search_context *ctx,
c33d3f93abf8392fdc60e12bea41ffd12cc85a8dTimo Sirainen i_assert(!fts_backend_is_updating(fctx->backend));
c33d3f93abf8392fdc60e12bea41ffd12cc85a8dTimo Sirainen ret = fts_indexer_init(fctx->backend, ctx->transaction->box,
c33d3f93abf8392fdc60e12bea41ffd12cc85a8dTimo Sirainen if ((fctx->backend->flags & FTS_BACKEND_FLAG_TOKENIZED_INPUT) != 0) {
c33d3f93abf8392fdc60e12bea41ffd12cc85a8dTimo Sirainen if (fts_search_args_expand(fctx->backend, fctx->args) < 0)
c33d3f93abf8392fdc60e12bea41ffd12cc85a8dTimo Sirainen /* the index was up to date */
c33d3f93abf8392fdc60e12bea41ffd12cc85a8dTimo Sirainen /* hide "searching" notifications while building index */
c33d3f93abf8392fdc60e12bea41ffd12cc85a8dTimo Sirainenstatic bool fts_want_build_args(const struct mail_search_arg *args)
c33d3f93abf8392fdc60e12bea41ffd12cc85a8dTimo Sirainen /* we want to update index only when searching from message body.
c33d3f93abf8392fdc60e12bea41ffd12cc85a8dTimo Sirainen it's not worth the wait for searching only from headers, which
c33d3f93abf8392fdc60e12bea41ffd12cc85a8dTimo Sirainen could be in cache file already */
c33d3f93abf8392fdc60e12bea41ffd12cc85a8dTimo Sirainenstatic bool fts_args_have_fuzzy(const struct mail_search_arg *args)
c33d3f93abf8392fdc60e12bea41ffd12cc85a8dTimo Sirainenfts_mailbox_search_init(struct mailbox_transaction_context *t,
c33d3f93abf8392fdc60e12bea41ffd12cc85a8dTimo Sirainen struct mailbox_header_lookup_ctx *wanted_headers)
c33d3f93abf8392fdc60e12bea41ffd12cc85a8dTimo Sirainen struct fts_transaction_context *ft = FTS_CONTEXT(t);
c33d3f93abf8392fdc60e12bea41ffd12cc85a8dTimo Sirainen struct fts_mailbox *fbox = FTS_CONTEXT(t->box);
c33d3f93abf8392fdc60e12bea41ffd12cc85a8dTimo Sirainen struct fts_mailbox_list *flist = FTS_LIST_CONTEXT(t->box->list);
return ctx;
fctx->t = t;
return ctx;
int ret;
if (ret == 0)
return FALSE;
if (ret > 0)
if (ret < 0) {
return TRUE;
return FALSE;
return FALSE;
return FALSE;
unsigned int idx;
return FALSE;
return FALSE;
return TRUE;
idx = 0;
return TRUE;
int ret = 0;
return ret;
const char **value_r)
int ret = 0;
return ret;
} else T_BEGIN {
} T_END;
static struct mailbox_transaction_context *
struct mailbox_transaction_context *t;
return ret;
(void)fts_transaction_end(t);
unsigned int max_recent_msgs;
int fd;
max_recent_msgs = 0;
bool autoindex;
int ret = 0;
if (fts_transaction_end(t) < 0) {
if (ret < 0)
if (autoindex)
bool optimize;
int ret = 0;
MAILBOX_SYNC_FLAG_OPTIMIZE)) != 0;
if (optimize) {
return ret;
const char *name;