Mercurial > dovecot > core-2.2
changeset 8387:fbd90ad20593 HEAD
fts: If we haven't indexed all messages, search the rest using non-indexed search.
Typically this happens with header searches which don't force an index update.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Wed, 05 Nov 2008 14:37:35 +0200 |
parents | 7b21f9546aa7 |
children | 4a608f96609b |
files | src/plugins/fts/fts-storage.c src/plugins/fts/fts-storage.h |
diffstat | 2 files changed, 17 insertions(+), 5 deletions(-) [+] |
line wrap: on
line diff
--- a/src/plugins/fts/fts-storage.c Wed Nov 05 14:23:22 2008 +0200 +++ b/src/plugins/fts/fts-storage.c Wed Nov 05 14:37:35 2008 +0200 @@ -183,10 +183,12 @@ return -1; mailbox_get_seq_range(t->box, last_uid+1, (uint32_t)-1, &seq1, &seq2); + fctx->first_nonindexed_seq = seq1; if (seq1 == 0) { /* no new messages */ return 0; } + if (fctx->best_arg->type == SEARCH_HEADER || fctx->best_arg->type == SEARCH_HEADER_COMPRESS_LWSP) { /* we're not updating the index just for header lookups */ @@ -202,6 +204,7 @@ last_uid = last_uid_locked; mailbox_get_seq_range(t->box, last_uid+1, (uint32_t)-1, &seq1, &seq2); + fctx->first_nonindexed_seq = seq1; if (seq1 == 0) { /* no new messages */ (void)fts_backend_build_deinit(&build); @@ -389,9 +392,12 @@ } /* finished / error */ - fts_build_deinit(&fctx->build_ctx); - if (ret > 0) + if (fts_build_deinit(&fctx->build_ctx) < 0) + ret = -1; + if (ret > 0) { + fctx->first_nonindexed_seq = 0; fts_search_lookup(fctx); + } } /* if we're here, the indexes are either built or they're not used */ @@ -449,8 +455,13 @@ /* use whichever is lower of definite/maybe */ if (fctx->definite_idx == def_count) { if (fctx->maybe_idx == maybe_count) { - /* we're finished */ - return 0; + /* look for the non-indexed mails */ + if (fctx->first_nonindexed_seq == 0) + return 0; + fctx->seqs_set = FALSE; + ctx->seq = fctx->first_nonindexed_seq - 1; + return fbox->module_ctx.super. + search_next_update_seq(ctx); } use_maybe = TRUE; } else if (fctx->maybe_idx == maybe_count) { @@ -505,7 +516,7 @@ if (fctx->build_ctx != NULL) { /* the search was cancelled */ - fts_build_deinit(&fctx->build_ctx); + (void)fts_build_deinit(&fctx->build_ctx); } if (array_is_created(&fctx->definite_seqs))
--- a/src/plugins/fts/fts-storage.h Wed Nov 05 14:23:22 2008 +0200 +++ b/src/plugins/fts/fts-storage.h Wed Nov 05 14:37:35 2008 +0200 @@ -22,6 +22,7 @@ ARRAY_TYPE(seq_range) definite_seqs, maybe_seqs; ARRAY_TYPE(fts_score_map) score_map; unsigned int definite_idx, maybe_idx; + uint32_t first_nonindexed_seq; struct fts_backend *build_backend; struct fts_storage_build_context *build_ctx;