fts-storage.c revision 3fb1c1f0375ec0a2b00be90b5d61fbc8374e9b90
2793e3bd31d212d6506686aa70773e13d9d98195Timo Sirainen/* Copyright (C) 2006 Timo Sirainen */
2793e3bd31d212d6506686aa70773e13d9d98195Timo Sirainen *((void **)array_idx_modifiable(&(obj)->module_contexts, \
85a4ae7e8df7ea45a7665828e5edf48a5fc85730Timo Sirainenstatic unsigned int fts_storage_module_id = 0;
85a4ae7e8df7ea45a7665828e5edf48a5fc85730Timo Sirainenstatic int fts_mailbox_close(struct mailbox *box)
2793e3bd31d212d6506686aa70773e13d9d98195Timo Sirainenstatic int uid_range_to_seq(struct mailbox *box,
94f90df2cfb7587bb5af432b2ba065d1c364e1f7Timo 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,
2793e3bd31d212d6506686aa70773e13d9d98195Timo Sirainenstatic int fts_build_mail_header(struct fts_storage_build_context *ctx,
2793e3bd31d212d6506686aa70773e13d9d98195Timo Sirainen const struct message_header_line *hdr = block->hdr;
2793e3bd31d212d6506686aa70773e13d9d98195Timo 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);
0f55802e8fdd95ae4290da6da077819209b71f70Timo Sirainen if (strcasecmp(hdr->name, "Content-Type") == 0) {
0f55802e8fdd95ae4290da6da077819209b71f70Timo Sirainen /* we'll index only text/xxx and message/rfc822 parts
0f55802e8fdd95ae4290da6da077819209b71f70Timo Sirainen if (fts_backend_build_more(ctx->build, ctx->uid, str_data(ctx->headers),
0f55802e8fdd95ae4290da6da077819209b71f70Timo Sirainenfts_build_mail(struct fts_storage_build_context *ctx, struct mail *mail)
2793e3bd31d212d6506686aa70773e13d9d98195Timo Sirainen parser = message_parser_init(pool_datastack_create(), input);
2793e3bd31d212d6506686aa70773e13d9d98195Timo Sirainen ret = message_parser_parse_next_block(parser, &raw_block);
2793e3bd31d212d6506686aa70773e13d9d98195Timo Sirainen if (!message_decoder_decode_next_block(decoder, &raw_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 ctx.build = fts_backend_build_init(fbox->backend, &last_uid);
2793e3bd31d212d6506686aa70773e13d9d98195Timo Sirainen if (mailbox_get_uids(t->box, last_uid+1, (uint32_t)-1,
0f55802e8fdd95ae4290da6da077819209b71f70Timo 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) {
c06cd6539a3dbd68eb546464076187be6bc4290fTimo Sirainenfts_mailbox_search_init(struct mailbox_transaction_context *t,
2793e3bd31d212d6506686aa70773e13d9d98195Timo Sirainen const char *charset, struct mail_search_arg *args,
c06cd6539a3dbd68eb546464076187be6bc4290fTimo Sirainen struct fts_mailbox *fbox = FTS_CONTEXT(t->box);
2793e3bd31d212d6506686aa70773e13d9d98195Timo Sirainen ctx = fbox->super.search_init(t, charset, args, sort_program);
c06cd6539a3dbd68eb546464076187be6bc4290fTimo Sirainen array_idx_set(&ctx->module_contexts, fts_storage_module_id, &fctx);
c06cd6539a3dbd68eb546464076187be6bc4290fTimo Sirainen /* FIXME: handle AND/OR. Maybe also header lookups? */
c06cd6539a3dbd68eb546464076187be6bc4290fTimo Sirainen if (fts_backend_lookup(fbox->backend, args->value.str,
c06cd6539a3dbd68eb546464076187be6bc4290fTimo Sirainen /* failed, fallback to reading everything */
2793e3bd31d212d6506686aa70773e13d9d98195Timo Sirainen /* failed, but we already have limited
2793e3bd31d212d6506686aa70773e13d9d98195Timo Sirainen the search, so just ignore this */
2793e3bd31d212d6506686aa70773e13d9d98195Timo Sirainenstatic int fts_mailbox_search_next_update_seq(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);
2793e3bd31d212d6506686aa70773e13d9d98195Timo Sirainen unsigned int count;
2793e3bd31d212d6506686aa70773e13d9d98195Timo Sirainen range = array_get_modifiable(&fctx->result, &count);
3d4450c252790b03bb5ce054987ac91110f1ff62Timo Sirainen return fbox->super.search_next_update_seq(ctx);
3d4450c252790b03bb5ce054987ac91110f1ff62Timo 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);
2793e3bd31d212d6506686aa70773e13d9d98195Timo Sirainen path = mail_storage_get_mailbox_index_dir(box->storage, box->name);
2793e3bd31d212d6506686aa70773e13d9d98195Timo Sirainen path = t_strconcat(path, "/" FTS_INDEX_NAME, NULL);
2793e3bd31d212d6506686aa70773e13d9d98195Timo Sirainen box->v.search_next_update_seq = fts_mailbox_search_next_update_seq;
2793e3bd31d212d6506686aa70773e13d9d98195Timo Sirainen box->v.search_deinit = fts_mailbox_search_deinit;
2793e3bd31d212d6506686aa70773e13d9d98195Timo Sirainen fts_storage_module_id = mail_storage_module_id++;