fts-storage.c revision 3d4450c252790b03bb5ce054987ac91110f1ff62
2793e3bd31d212d6506686aa70773e13d9d98195Timo Sirainen/* Copyright (C) 2006 Timo Sirainen */
2793e3bd31d212d6506686aa70773e13d9d98195Timo Sirainen *((void **)array_idx_modifiable(&(obj)->module_contexts, \
94f90df2cfb7587bb5af432b2ba065d1c364e1f7Timo Sirainenstatic unsigned int fts_storage_module_id = 0;
2793e3bd31d212d6506686aa70773e13d9d98195Timo Sirainenstatic int fts_mailbox_close(struct mailbox *box)
2793e3bd31d212d6506686aa70773e13d9d98195Timo Sirainenstatic int uid_range_to_seq(struct mailbox *box,
2793e3bd31d212d6506686aa70773e13d9d98195Timo Sirainen unsigned int i, count;
2793e3bd31d212d6506686aa70773e13d9d98195Timo Sirainen for (i = 0; i < count; i++) {
2793e3bd31d212d6506686aa70773e13d9d98195Timo Sirainen if (mailbox_get_uids(box, range[i].seq1, range[i].seq2,
0f55802e8fdd95ae4290da6da077819209b71f70Timo Sirainenstatic int fts_build_mail_flush(struct fts_storage_build_context *ctx)
0f55802e8fdd95ae4290da6da077819209b71f70Timo Sirainen if (fts_backend_build_more(ctx->build, ctx->uid, str_data(ctx->headers),
0f55802e8fdd95ae4290da6da077819209b71f70Timo Sirainenstatic bool fts_build_update_save_part(struct fts_storage_build_context *ctx,
2793e3bd31d212d6506686aa70773e13d9d98195Timo Sirainen /* we'll index only text/xxx and message/rfc822 parts for now */
2793e3bd31d212d6506686aa70773e13d9d98195Timo Sirainenstatic int fts_build_mail_header(struct fts_storage_build_context *ctx,
2793e3bd31d212d6506686aa70773e13d9d98195Timo Sirainen const struct message_header_line *hdr = block->hdr;
0f55802e8fdd95ae4290da6da077819209b71f70Timo Sirainen /* hdr->full_value is always set because we get the block from
2793e3bd31d212d6506686aa70773e13d9d98195Timo Sirainen message_decoder */
2793e3bd31d212d6506686aa70773e13d9d98195Timo Sirainen str_append_n(ctx->headers, hdr->middle, hdr->middle_len);
2793e3bd31d212d6506686aa70773e13d9d98195Timo Sirainen str_append_n(ctx->headers, hdr->full_value, hdr->full_value_len);
2793e3bd31d212d6506686aa70773e13d9d98195Timo Sirainen if (strcasecmp(hdr->name, "Content-Type") == 0) {
2793e3bd31d212d6506686aa70773e13d9d98195Timo Sirainenfts_build_mail(struct fts_storage_build_context *ctx, struct mail *mail)
0f55802e8fdd95ae4290da6da077819209b71f70Timo Sirainen parser = message_parser_init(pool_datastack_create(), input);
2793e3bd31d212d6506686aa70773e13d9d98195Timo Sirainen ret = message_parser_parse_next_block(parser, &raw_block);
0f55802e8fdd95ae4290da6da077819209b71f70Timo Sirainen if (!message_decoder_decode_next_block(decoder, &raw_block,
2793e3bd31d212d6506686aa70773e13d9d98195Timo Sirainen /* end of headers */
2793e3bd31d212d6506686aa70773e13d9d98195Timo Sirainen if (fts_build_update_save_part(ctx, &block)) {
2793e3bd31d212d6506686aa70773e13d9d98195Timo Sirainen if (fts_backend_build_more(ctx->build, mail->uid,
2793e3bd31d212d6506686aa70773e13d9d98195Timo Sirainenstatic int fts_build_new(struct mailbox_transaction_context *t)
2793e3bd31d212d6506686aa70773e13d9d98195Timo Sirainen struct fts_mailbox *fbox = FTS_CONTEXT(t->box);
2793e3bd31d212d6506686aa70773e13d9d98195Timo Sirainen if (fts_backend_get_last_uid(fbox->backend, &last_uid) < 0)
2793e3bd31d212d6506686aa70773e13d9d98195Timo Sirainen if (mailbox_get_uids(t->box, last_uid+1, (uint32_t)-1,
2793e3bd31d212d6506686aa70773e13d9d98195Timo Sirainen /* no new messages */
2793e3bd31d212d6506686aa70773e13d9d98195Timo Sirainen ctx.build = fts_backend_build_init(fbox->backend, &last_uid_locked);
2793e3bd31d212d6506686aa70773e13d9d98195Timo Sirainen /* changed, need to get again the sequences */
2793e3bd31d212d6506686aa70773e13d9d98195Timo Sirainen if (mailbox_get_uids(t->box, last_uid+1, (uint32_t)-1,
2793e3bd31d212d6506686aa70773e13d9d98195Timo Sirainen /* no new messages */
2793e3bd31d212d6506686aa70773e13d9d98195Timo Sirainen search_ctx = mailbox_search_init(t, NULL, &search_arg, NULL);
2793e3bd31d212d6506686aa70773e13d9d98195Timo Sirainen while (mailbox_search_next(search_ctx, mail) > 0) {
2793e3bd31d212d6506686aa70773e13d9d98195Timo Sirainenfts_mailbox_search_init(struct mailbox_transaction_context *t,
2793e3bd31d212d6506686aa70773e13d9d98195Timo Sirainen const char *charset, struct mail_search_arg *args,
2793e3bd31d212d6506686aa70773e13d9d98195Timo Sirainen struct fts_mailbox *fbox = FTS_CONTEXT(t->box);
2793e3bd31d212d6506686aa70773e13d9d98195Timo Sirainen ctx = fbox->super.search_init(t, charset, args, sort_program);
2793e3bd31d212d6506686aa70773e13d9d98195Timo Sirainen array_idx_set(&ctx->module_contexts, fts_storage_module_id, &fctx);
94f90df2cfb7587bb5af432b2ba065d1c364e1f7Timo Sirainen /* FIXME: handle AND/OR. Maybe also header lookups? */
2793e3bd31d212d6506686aa70773e13d9d98195Timo Sirainen if (fts_backend_lookup(fbox->backend, args->value.str,
2793e3bd31d212d6506686aa70773e13d9d98195Timo Sirainen /* failed, fallback to reading everything */
2793e3bd31d212d6506686aa70773e13d9d98195Timo Sirainen /* failed, but we already have limited
2793e3bd31d212d6506686aa70773e13d9d98195Timo Sirainen the search, so just ignore this */
4bffa20ff6fc61ba7b47375722e38be7f87dfe64Timo Sirainenstatic int fts_mailbox_search_next_update_seq(struct mail_search_context *ctx)
94f90df2cfb7587bb5af432b2ba065d1c364e1f7Timo Sirainen struct fts_mailbox *fbox = FTS_CONTEXT(ctx->transaction->box);
94f90df2cfb7587bb5af432b2ba065d1c364e1f7Timo Sirainen struct fts_search_context *fctx = FTS_CONTEXT(ctx);
94f90df2cfb7587bb5af432b2ba065d1c364e1f7Timo Sirainen unsigned int count;
2793e3bd31d212d6506686aa70773e13d9d98195Timo Sirainen return fbox->super.search_next_update_seq(ctx);
2793e3bd31d212d6506686aa70773e13d9d98195Timo Sirainen range = array_get_modifiable(&fctx->result, &count);
c63544d7d2580c680b07f9569e87e9cebee383d5Timo Sirainen ret = fbox->super.search_next_update_seq(ctx);
2793e3bd31d212d6506686aa70773e13d9d98195Timo Sirainenstatic int fts_mailbox_search_deinit(struct mail_search_context *ctx)
2793e3bd31d212d6506686aa70773e13d9d98195Timo Sirainen struct fts_mailbox *fbox = FTS_CONTEXT(ctx->transaction->box);
2793e3bd31d212d6506686aa70773e13d9d98195Timo Sirainen struct fts_search_context *fctx = FTS_CONTEXT(ctx);
static struct mail *
return _mail;
static struct mailbox_transaction_context *
struct mailbox_transaction_context *t;
int ret;
return ret;
const char *env;
if (!fts_storage_module_id_set) {