virtual-search.c revision 03010dbaa74ec70f062994dfe3cd39bedc99a28b
5e0ce63bb65db34d7f48b34bbb5545fa791781c4Timo Sirainen/* Copyright (c) 2008-2013 Dovecot authors, see the included COPYING file */
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainenstatic int virtual_search_record_cmp(const struct virtual_search_record *r1,
c0435c854a0e7246373b9752d163095cc4fbe985Timo Sirainenstatic int mail_search_get_result(struct mail_search_context *ctx)
01af88dfbb7a022ddb3ab9fb4159f2a4a204ead3Timo Sirainen for (arg = ctx->args->args; arg != NULL; arg = arg->next) {
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainenstatic void virtual_search_get_records(struct mail_search_context *ctx,
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen (struct virtual_mailbox *)ctx->transaction->box;
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen while (index_storage_search_next_update_seq(ctx)) {
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen /* full match, no need to check this any further */
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen /* possible match, save and check later */
c0435c854a0e7246373b9752d163095cc4fbe985Timo Sirainen mail_index_lookup_ext(mbox->box.view, ctx->seq,
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen mail_search_args_reset(ctx->args->args, FALSE);
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen array_sort(&vctx->records, virtual_search_record_cmp);
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen ctx->progress_max = array_count(&vctx->records);
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainenvirtual_search_init(struct mailbox_transaction_context *t,
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen struct mailbox_header_lookup_ctx *wanted_headers)
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen ctx = index_storage_search_init(t, args, sort_program,
1060afdc2fcdf647dbb3bc11647401f1b44a3a8aTimo Sirainen vctx = i_new(struct virtual_search_context, 1);
1060afdc2fcdf647dbb3bc11647401f1b44a3a8aTimo Sirainen vctx->search_state = VIRTUAL_SEARCH_STATE_BUILD;
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen MODULE_CONTEXT_SET(ctx, virtual_storage_module, vctx);
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen seq_range_array_iter_init(&vctx->result_iter, &vctx->result);
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainenint virtual_search_deinit(struct mail_search_context *ctx)
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen struct virtual_search_context *vctx = VIRTUAL_CONTEXT(ctx);
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainenbool virtual_search_next_nonblock(struct mail_search_context *ctx,
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen struct virtual_search_context *vctx = VIRTUAL_CONTEXT(ctx);
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen struct index_search_context *ictx = (struct index_search_context *)ctx;
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen vctx->search_state = VIRTUAL_SEARCH_STATE_SORT;
2767104d81e97a109f0aa9758792bfa1da325a97Timo Sirainen vctx->search_state = VIRTUAL_SEARCH_STATE_RETURN;
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen return virtual_search_next_nonblock(ctx, mail_r, tryagain_r);
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen return index_storage_search_next_nonblock(ctx, mail_r, tryagain_r);
1060afdc2fcdf647dbb3bc11647401f1b44a3a8aTimo Sirainen /* the messages won't be returned sorted, so we'll have to
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen do it ourself */
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen while (index_storage_search_next_nonblock(ctx, mail_r, tryagain_r))
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen seq_range_array_add(&vctx->result, (*mail_r)->seq);
143cb2e0744e647f8fc637bbdea1106c1587a4bfTimo Sirainen vctx->search_state = VIRTUAL_SEARCH_STATE_SORT_DONE;
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen /* fall through */
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainen if (!seq_range_array_iter_nth(&vctx->result_iter,
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainenstatic void search_args_set_full_match(struct mail_search_arg *args)
dd62b77c932d1b518f2a3e4bf80e36542becc256Timo Sirainenbool virtual_search_next_update_seq(struct mail_search_context *ctx)
c0435c854a0e7246373b9752d163095cc4fbe985Timo Sirainen struct virtual_search_context *vctx = VIRTUAL_CONTEXT(ctx);
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen unsigned int count;
c0435c854a0e7246373b9752d163095cc4fbe985Timo Sirainen /* go through potential results first */
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen ctx->seq = recs[vctx->next_record_idx++].virtual_seq - 1;
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen if (!index_storage_search_next_update_seq(ctx))
ecc81625167ed96c04c02aa190a1ea5baa65b474Timo Sirainen /* this is known to match fully */