annotate src/plugins/fts/fts-storage.c @ 9575:0a00dcc4f0ea HEAD

lib-storage: Allow shared namespace prefix to use %variable modifiers.
author Timo Sirainen <tss@iki.fi>
date Wed, 26 May 2010 17:07:51 +0100
parents 00cd9aacd03c
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
9532
00cd9aacd03c Updated copyright notices to include year 2010.
Timo Sirainen <tss@iki.fi>
parents: 9311
diff changeset
1 /* Copyright (c) 2006-2010 Dovecot authors, see the included COPYING file */
4609
48a16f1254b5 Added full text search plugin framework. Still missing support for handling
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2
48a16f1254b5 Added full text search plugin framework. Still missing support for handling
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
3 #include "lib.h"
4950
16dd9aa9d275 If indexing takes over 10 seconds, start giving estimates about when it's
Timo Sirainen <tss@iki.fi>
parents: 4948
diff changeset
4 #include "ioloop.h"
4609
48a16f1254b5 Added full text search plugin framework. Still missing support for handling
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
5 #include "array.h"
48a16f1254b5 Added full text search plugin framework. Still missing support for handling
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
6 #include "str.h"
48a16f1254b5 Added full text search plugin framework. Still missing support for handling
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
7 #include "istream.h"
9311
d48640a2ab4a Use timeval_diff_*() more.
Timo Sirainen <tss@iki.fi>
parents: 9292
diff changeset
8 #include "time-util.h"
4609
48a16f1254b5 Added full text search plugin framework. Still missing support for handling
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
9 #include "message-parser.h"
48a16f1254b5 Added full text search plugin framework. Still missing support for handling
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
10 #include "message-decoder.h"
8499
252b29ac5f43 fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents: 8496
diff changeset
11 #include "mail-namespace.h"
7642
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7619
diff changeset
12 #include "mail-search-build.h"
4609
48a16f1254b5 Added full text search plugin framework. Still missing support for handling
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
13 #include "mail-storage-private.h"
48a16f1254b5 Added full text search plugin framework. Still missing support for handling
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
14 #include "fts-api-private.h"
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
15 #include "fts-storage.h"
4609
48a16f1254b5 Added full text search plugin framework. Still missing support for handling
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
16 #include "fts-plugin.h"
48a16f1254b5 Added full text search plugin framework. Still missing support for handling
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
17
48a16f1254b5 Added full text search plugin framework. Still missing support for handling
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
18 #include <stdlib.h>
48a16f1254b5 Added full text search plugin framework. Still missing support for handling
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
19
48a16f1254b5 Added full text search plugin framework. Still missing support for handling
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
20 #define FTS_CONTEXT(obj) \
5450
7a6db5ec047d Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents: 5413
diff changeset
21 MODULE_CONTEXT(obj, fts_storage_module)
7a6db5ec047d Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents: 5413
diff changeset
22 #define FTS_MAIL_CONTEXT(obj) \
7a6db5ec047d Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents: 5413
diff changeset
23 MODULE_CONTEXT(obj, fts_mail_module)
4609
48a16f1254b5 Added full text search plugin framework. Still missing support for handling
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
24
8509
2eede4287841 Increased search_nonblock() to go through 50 messages at a time.
Timo Sirainen <tss@iki.fi>
parents: 8508
diff changeset
25 #define FTS_SEARCH_NONBLOCK_COUNT 50
4950
16dd9aa9d275 If indexing takes over 10 seconds, start giving estimates about when it's
Timo Sirainen <tss@iki.fi>
parents: 4948
diff changeset
26 #define FTS_BUILD_NOTIFY_INTERVAL_SECS 10
4946
460d589403d0 Make indexing non-blocking. Optimize also header searches.
Timo Sirainen <tss@iki.fi>
parents: 4942
diff changeset
27
8006
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7990
diff changeset
28 struct fts_mail {
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7990
diff changeset
29 union mail_module_context module_ctx;
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7990
diff changeset
30 char score[30];
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7990
diff changeset
31 };
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7990
diff changeset
32
4946
460d589403d0 Make indexing non-blocking. Optimize also header searches.
Timo Sirainen <tss@iki.fi>
parents: 4942
diff changeset
33 struct fts_storage_build_context {
460d589403d0 Make indexing non-blocking. Optimize also header searches.
Timo Sirainen <tss@iki.fi>
parents: 4942
diff changeset
34 struct mail_search_context *search_ctx;
7642
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7619
diff changeset
35 struct mail_search_args *search_args;
4946
460d589403d0 Make indexing non-blocking. Optimize also header searches.
Timo Sirainen <tss@iki.fi>
parents: 4942
diff changeset
36 struct mail *mail;
460d589403d0 Make indexing non-blocking. Optimize also header searches.
Timo Sirainen <tss@iki.fi>
parents: 4942
diff changeset
37 struct fts_backend_build_context *build;
460d589403d0 Make indexing non-blocking. Optimize also header searches.
Timo Sirainen <tss@iki.fi>
parents: 4942
diff changeset
38
4950
16dd9aa9d275 If indexing takes over 10 seconds, start giving estimates about when it's
Timo Sirainen <tss@iki.fi>
parents: 4948
diff changeset
39 struct timeval search_start_time, last_notify;
16dd9aa9d275 If indexing takes over 10 seconds, start giving estimates about when it's
Timo Sirainen <tss@iki.fi>
parents: 4948
diff changeset
40
4946
460d589403d0 Make indexing non-blocking. Optimize also header searches.
Timo Sirainen <tss@iki.fi>
parents: 4942
diff changeset
41 uint32_t uid;
460d589403d0 Make indexing non-blocking. Optimize also header searches.
Timo Sirainen <tss@iki.fi>
parents: 4942
diff changeset
42 string_t *headers;
460d589403d0 Make indexing non-blocking. Optimize also header searches.
Timo Sirainen <tss@iki.fi>
parents: 4942
diff changeset
43 };
460d589403d0 Make indexing non-blocking. Optimize also header searches.
Timo Sirainen <tss@iki.fi>
parents: 4942
diff changeset
44
4854
09b9b1e8f73d Added fts_backend_expunge_finish() virtual backend function.
Timo Sirainen <tss@iki.fi>
parents: 4714
diff changeset
45 struct fts_transaction_context {
5450
7a6db5ec047d Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents: 5413
diff changeset
46 union mailbox_transaction_module_context module_ctx;
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
47
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
48 struct fts_storage_build_context *build_ctx;
8006
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7990
diff changeset
49 ARRAY_TYPE(fts_score_map) *score_map;
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
50 struct mail *mail;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
51
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
52 uint32_t last_uid;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
53
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
54 unsigned int free_mail:1;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
55 unsigned int expunges:1;
4854
09b9b1e8f73d Added fts_backend_expunge_finish() virtual backend function.
Timo Sirainen <tss@iki.fi>
parents: 4714
diff changeset
56 };
09b9b1e8f73d Added fts_backend_expunge_finish() virtual backend function.
Timo Sirainen <tss@iki.fi>
parents: 4714
diff changeset
57
5450
7a6db5ec047d Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents: 5413
diff changeset
58 static MODULE_CONTEXT_DEFINE_INIT(fts_storage_module,
7a6db5ec047d Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents: 5413
diff changeset
59 &mail_storage_module_register);
7a6db5ec047d Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents: 5413
diff changeset
60 static MODULE_CONTEXT_DEFINE_INIT(fts_mail_module, &mail_module_register);
4609
48a16f1254b5 Added full text search plugin framework. Still missing support for handling
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
61
48a16f1254b5 Added full text search plugin framework. Still missing support for handling
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
62 static int fts_mailbox_close(struct mailbox *box)
48a16f1254b5 Added full text search plugin framework. Still missing support for handling
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
63 {
48a16f1254b5 Added full text search plugin framework. Still missing support for handling
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
64 struct fts_mailbox *fbox = FTS_CONTEXT(box);
4618
a1621235f405 API updates and some fixes
Timo Sirainen <tss@iki.fi>
parents: 4610
diff changeset
65 int ret;
4609
48a16f1254b5 Added full text search plugin framework. Still missing support for handling
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
66
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
67 if (fbox->backend_substr != NULL)
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
68 fts_backend_deinit(&fbox->backend_substr);
4942
b382b21409b5 Added support for X-BODY-FAST and X-TEXT-FAST SEARCH arguments. FTS plugin
Timo Sirainen <tss@iki.fi>
parents: 4884
diff changeset
69 if (fbox->backend_fast != NULL)
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
70 fts_backend_deinit(&fbox->backend_fast);
4618
a1621235f405 API updates and some fixes
Timo Sirainen <tss@iki.fi>
parents: 4610
diff changeset
71
5450
7a6db5ec047d Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents: 5413
diff changeset
72 ret = fbox->module_ctx.super.close(box);
4609
48a16f1254b5 Added full text search plugin framework. Still missing support for handling
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
73 i_free(fbox);
4618
a1621235f405 API updates and some fixes
Timo Sirainen <tss@iki.fi>
parents: 4610
diff changeset
74 return ret;
4609
48a16f1254b5 Added full text search plugin framework. Still missing support for handling
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
75 }
48a16f1254b5 Added full text search plugin framework. Still missing support for handling
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
76
6914
9c3f0e180751 Index message's all headers (including MIME headers) after the body.
Timo Sirainen <tss@iki.fi>
parents: 6911
diff changeset
77 static int fts_build_mail_flush_headers(struct fts_storage_build_context *ctx)
4619
3111cf26ecac Fixes to indexing
Timo Sirainen <tss@iki.fi>
parents: 4618
diff changeset
78 {
3111cf26ecac Fixes to indexing
Timo Sirainen <tss@iki.fi>
parents: 4618
diff changeset
79 if (str_len(ctx->headers) == 0)
6901
92e197fa699e We only want to skip non-text message bodies, never any headers and
Timo Sirainen <tss@iki.fi>
parents: 6898
diff changeset
80 return 0;
4619
3111cf26ecac Fixes to indexing
Timo Sirainen <tss@iki.fi>
parents: 4618
diff changeset
81
3111cf26ecac Fixes to indexing
Timo Sirainen <tss@iki.fi>
parents: 4618
diff changeset
82 if (fts_backend_build_more(ctx->build, ctx->uid, str_data(ctx->headers),
6914
9c3f0e180751 Index message's all headers (including MIME headers) after the body.
Timo Sirainen <tss@iki.fi>
parents: 6911
diff changeset
83 str_len(ctx->headers), TRUE) < 0)
4619
3111cf26ecac Fixes to indexing
Timo Sirainen <tss@iki.fi>
parents: 4618
diff changeset
84 return -1;
3111cf26ecac Fixes to indexing
Timo Sirainen <tss@iki.fi>
parents: 4618
diff changeset
85
3111cf26ecac Fixes to indexing
Timo Sirainen <tss@iki.fi>
parents: 4618
diff changeset
86 str_truncate(ctx->headers, 0);
6901
92e197fa699e We only want to skip non-text message bodies, never any headers and
Timo Sirainen <tss@iki.fi>
parents: 6898
diff changeset
87 return 0;
4619
3111cf26ecac Fixes to indexing
Timo Sirainen <tss@iki.fi>
parents: 4618
diff changeset
88 }
3111cf26ecac Fixes to indexing
Timo Sirainen <tss@iki.fi>
parents: 4618
diff changeset
89
6901
92e197fa699e We only want to skip non-text message bodies, never any headers and
Timo Sirainen <tss@iki.fi>
parents: 6898
diff changeset
90 static bool fts_build_want_index_part(const struct message_block *block)
4619
3111cf26ecac Fixes to indexing
Timo Sirainen <tss@iki.fi>
parents: 4618
diff changeset
91 {
3111cf26ecac Fixes to indexing
Timo Sirainen <tss@iki.fi>
parents: 4618
diff changeset
92 /* we'll index only text/xxx and message/rfc822 parts for now */
6901
92e197fa699e We only want to skip non-text message bodies, never any headers and
Timo Sirainen <tss@iki.fi>
parents: 6898
diff changeset
93 return (block->part->flags &
92e197fa699e We only want to skip non-text message bodies, never any headers and
Timo Sirainen <tss@iki.fi>
parents: 6898
diff changeset
94 (MESSAGE_PART_FLAG_TEXT |
92e197fa699e We only want to skip non-text message bodies, never any headers and
Timo Sirainen <tss@iki.fi>
parents: 6898
diff changeset
95 MESSAGE_PART_FLAG_MESSAGE_RFC822)) != 0;
4619
3111cf26ecac Fixes to indexing
Timo Sirainen <tss@iki.fi>
parents: 4618
diff changeset
96 }
3111cf26ecac Fixes to indexing
Timo Sirainen <tss@iki.fi>
parents: 4618
diff changeset
97
6901
92e197fa699e We only want to skip non-text message bodies, never any headers and
Timo Sirainen <tss@iki.fi>
parents: 6898
diff changeset
98 static void fts_build_mail_header(struct fts_storage_build_context *ctx,
92e197fa699e We only want to skip non-text message bodies, never any headers and
Timo Sirainen <tss@iki.fi>
parents: 6898
diff changeset
99 const struct message_block *block)
4609
48a16f1254b5 Added full text search plugin framework. Still missing support for handling
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
100 {
48a16f1254b5 Added full text search plugin framework. Still missing support for handling
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
101 const struct message_header_line *hdr = block->hdr;
48a16f1254b5 Added full text search plugin framework. Still missing support for handling
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
102
48a16f1254b5 Added full text search plugin framework. Still missing support for handling
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
103 /* hdr->full_value is always set because we get the block from
48a16f1254b5 Added full text search plugin framework. Still missing support for handling
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
104 message_decoder */
48a16f1254b5 Added full text search plugin framework. Still missing support for handling
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
105 str_append(ctx->headers, hdr->name);
48a16f1254b5 Added full text search plugin framework. Still missing support for handling
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
106 str_append_n(ctx->headers, hdr->middle, hdr->middle_len);
48a16f1254b5 Added full text search plugin framework. Still missing support for handling
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
107 str_append_n(ctx->headers, hdr->full_value, hdr->full_value_len);
48a16f1254b5 Added full text search plugin framework. Still missing support for handling
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
108 if (!hdr->no_newline)
48a16f1254b5 Added full text search plugin framework. Still missing support for handling
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
109 str_append_c(ctx->headers, '\n');
48a16f1254b5 Added full text search plugin framework. Still missing support for handling
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
110 }
48a16f1254b5 Added full text search plugin framework. Still missing support for handling
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
111
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
112 static int fts_build_mail(struct fts_storage_build_context *ctx, uint32_t uid)
4609
48a16f1254b5 Added full text search plugin framework. Still missing support for handling
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
113 {
48a16f1254b5 Added full text search plugin framework. Still missing support for handling
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
114 struct istream *input;
48a16f1254b5 Added full text search plugin framework. Still missing support for handling
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
115 struct message_parser_ctx *parser;
48a16f1254b5 Added full text search plugin framework. Still missing support for handling
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
116 struct message_decoder_context *decoder;
48a16f1254b5 Added full text search plugin framework. Still missing support for handling
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
117 struct message_block raw_block, block;
7243
289765861d66 Changed message_parser_deinit() to return -1 if the parser was using
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
118 struct message_part *prev_part, *parts;
4609
48a16f1254b5 Added full text search plugin framework. Still missing support for handling
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
119 int ret;
48a16f1254b5 Added full text search plugin framework. Still missing support for handling
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
120
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
121 ctx->uid = uid;
4609
48a16f1254b5 Added full text search plugin framework. Still missing support for handling
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
122
6280
eb7c9d8ece54 mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents: 6277
diff changeset
123 if (mail_get_stream(ctx->mail, NULL, NULL, &input) < 0)
4609
48a16f1254b5 Added full text search plugin framework. Still missing support for handling
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
124 return -1;
48a16f1254b5 Added full text search plugin framework. Still missing support for handling
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
125
6901
92e197fa699e We only want to skip non-text message bodies, never any headers and
Timo Sirainen <tss@iki.fi>
parents: 6898
diff changeset
126 prev_part = NULL;
5522
5dee807e53cf Header parser has now flags parameter to tell it how to handle linefeeds.
Timo Sirainen <tss@iki.fi>
parents: 5511
diff changeset
127 parser = message_parser_init(pool_datastack_create(), input,
5dee807e53cf Header parser has now flags parameter to tell it how to handle linefeeds.
Timo Sirainen <tss@iki.fi>
parents: 5511
diff changeset
128 MESSAGE_HEADER_PARSER_FLAG_CLEAN_ONELINE,
5dee807e53cf Header parser has now flags parameter to tell it how to handle linefeeds.
Timo Sirainen <tss@iki.fi>
parents: 5511
diff changeset
129 0);
9058
44548a7fb10d message-decoder now supports optionally returning non-text bodyparts as-is.
Timo Sirainen <tss@iki.fi>
parents: 8950
diff changeset
130 decoder = message_decoder_init(MESSAGE_DECODER_FLAG_DTCASE);
4609
48a16f1254b5 Added full text search plugin framework. Still missing support for handling
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
131 for (;;) {
48a16f1254b5 Added full text search plugin framework. Still missing support for handling
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
132 ret = message_parser_parse_next_block(parser, &raw_block);
48a16f1254b5 Added full text search plugin framework. Still missing support for handling
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
133 i_assert(ret != 0);
48a16f1254b5 Added full text search plugin framework. Still missing support for handling
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
134 if (ret < 0) {
48a16f1254b5 Added full text search plugin framework. Still missing support for handling
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
135 if (input->stream_errno == 0)
48a16f1254b5 Added full text search plugin framework. Still missing support for handling
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
136 ret = 0;
48a16f1254b5 Added full text search plugin framework. Still missing support for handling
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
137 break;
48a16f1254b5 Added full text search plugin framework. Still missing support for handling
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
138 }
6901
92e197fa699e We only want to skip non-text message bodies, never any headers and
Timo Sirainen <tss@iki.fi>
parents: 6898
diff changeset
139 if (raw_block.hdr == NULL && raw_block.size != 0 &&
92e197fa699e We only want to skip non-text message bodies, never any headers and
Timo Sirainen <tss@iki.fi>
parents: 6898
diff changeset
140 !fts_build_want_index_part(&raw_block)) {
92e197fa699e We only want to skip non-text message bodies, never any headers and
Timo Sirainen <tss@iki.fi>
parents: 6898
diff changeset
141 /* skipping this body */
4609
48a16f1254b5 Added full text search plugin framework. Still missing support for handling
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
142 continue;
6901
92e197fa699e We only want to skip non-text message bodies, never any headers and
Timo Sirainen <tss@iki.fi>
parents: 6898
diff changeset
143 }
4609
48a16f1254b5 Added full text search plugin framework. Still missing support for handling
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
144
48a16f1254b5 Added full text search plugin framework. Still missing support for handling
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
145 if (!message_decoder_decode_next_block(decoder, &raw_block,
48a16f1254b5 Added full text search plugin framework. Still missing support for handling
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
146 &block))
48a16f1254b5 Added full text search plugin framework. Still missing support for handling
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
147 continue;
48a16f1254b5 Added full text search plugin framework. Still missing support for handling
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
148
6901
92e197fa699e We only want to skip non-text message bodies, never any headers and
Timo Sirainen <tss@iki.fi>
parents: 6898
diff changeset
149 if (block.hdr != NULL)
92e197fa699e We only want to skip non-text message bodies, never any headers and
Timo Sirainen <tss@iki.fi>
parents: 6898
diff changeset
150 fts_build_mail_header(ctx, &block);
92e197fa699e We only want to skip non-text message bodies, never any headers and
Timo Sirainen <tss@iki.fi>
parents: 6898
diff changeset
151 else if (block.size == 0) {
92e197fa699e We only want to skip non-text message bodies, never any headers and
Timo Sirainen <tss@iki.fi>
parents: 6898
diff changeset
152 /* end of headers */
6914
9c3f0e180751 Index message's all headers (including MIME headers) after the body.
Timo Sirainen <tss@iki.fi>
parents: 6911
diff changeset
153 str_append_c(ctx->headers, '\n');
4619
3111cf26ecac Fixes to indexing
Timo Sirainen <tss@iki.fi>
parents: 4618
diff changeset
154 } else {
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
155 if (fts_backend_build_more(ctx->build, ctx->uid,
5341
acd4ed841b01 Separate headers and body in building and searching. Added support for
Timo Sirainen <tss@iki.fi>
parents: 4950
diff changeset
156 block.data, block.size,
acd4ed841b01 Separate headers and body in building and searching. Added support for
Timo Sirainen <tss@iki.fi>
parents: 4950
diff changeset
157 FALSE) < 0) {
4609
48a16f1254b5 Added full text search plugin framework. Still missing support for handling
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
158 ret = -1;
48a16f1254b5 Added full text search plugin framework. Still missing support for handling
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
159 break;
48a16f1254b5 Added full text search plugin framework. Still missing support for handling
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
160 }
48a16f1254b5 Added full text search plugin framework. Still missing support for handling
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
161 }
48a16f1254b5 Added full text search plugin framework. Still missing support for handling
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
162 }
7243
289765861d66 Changed message_parser_deinit() to return -1 if the parser was using
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
163 if (message_parser_deinit(&parser, &parts) < 0)
289765861d66 Changed message_parser_deinit() to return -1 if the parser was using
Timo Sirainen <tss@iki.fi>
parents: 7226
diff changeset
164 mail_set_cache_corrupted(ctx->mail, MAIL_FETCH_MESSAGE_PARTS);
4609
48a16f1254b5 Added full text search plugin framework. Still missing support for handling
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
165 message_decoder_deinit(&decoder);
6914
9c3f0e180751 Index message's all headers (including MIME headers) after the body.
Timo Sirainen <tss@iki.fi>
parents: 6911
diff changeset
166
9c3f0e180751 Index message's all headers (including MIME headers) after the body.
Timo Sirainen <tss@iki.fi>
parents: 6911
diff changeset
167 if (ret == 0) {
9c3f0e180751 Index message's all headers (including MIME headers) after the body.
Timo Sirainen <tss@iki.fi>
parents: 6911
diff changeset
168 /* Index all headers at the end. This is required for Squat,
9c3f0e180751 Index message's all headers (including MIME headers) after the body.
Timo Sirainen <tss@iki.fi>
parents: 6911
diff changeset
169 because it can handle only incremental UIDs. */
9c3f0e180751 Index message's all headers (including MIME headers) after the body.
Timo Sirainen <tss@iki.fi>
parents: 6911
diff changeset
170 ret = fts_build_mail_flush_headers(ctx);
9c3f0e180751 Index message's all headers (including MIME headers) after the body.
Timo Sirainen <tss@iki.fi>
parents: 6911
diff changeset
171 }
4609
48a16f1254b5 Added full text search plugin framework. Still missing support for handling
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
172 return ret;
48a16f1254b5 Added full text search plugin framework. Still missing support for handling
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
173 }
48a16f1254b5 Added full text search plugin framework. Still missing support for handling
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
174
8495
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
175 static int fts_build_init_seq(struct fts_search_context *fctx,
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
176 struct fts_backend *backend,
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
177 struct mailbox_transaction_context *t,
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
178 uint32_t seq1, uint32_t seq2, uint32_t last_uid)
4609
48a16f1254b5 Added full text search plugin framework. Still missing support for handling
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
179 {
7642
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7619
diff changeset
180 struct mail_search_args *search_args;
4946
460d589403d0 Make indexing non-blocking. Optimize also header searches.
Timo Sirainen <tss@iki.fi>
parents: 4942
diff changeset
181 struct fts_storage_build_context *ctx;
460d589403d0 Make indexing non-blocking. Optimize also header searches.
Timo Sirainen <tss@iki.fi>
parents: 4942
diff changeset
182 struct fts_backend_build_context *build;
8495
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
183 uint32_t last_uid_locked;
8387
fbd90ad20593 fts: If we haven't indexed all messages, search the rest using non-indexed search.
Timo Sirainen <tss@iki.fi>
parents: 8386
diff changeset
184
8386
7b21f9546aa7 fts: Don't force SEARCH_HEADER_COMPRESS_LWSP to update indexes either.
Timo Sirainen <tss@iki.fi>
parents: 8330
diff changeset
185 if (fctx->best_arg->type == SEARCH_HEADER ||
7b21f9546aa7 fts: Don't force SEARCH_HEADER_COMPRESS_LWSP to update indexes either.
Timo Sirainen <tss@iki.fi>
parents: 8330
diff changeset
186 fctx->best_arg->type == SEARCH_HEADER_COMPRESS_LWSP) {
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
187 /* we're not updating the index just for header lookups */
8495
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
188 if (seq1 < fctx->first_nonindexed_seq)
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
189 fctx->first_nonindexed_seq = seq1;
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
190 return 0;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
191 }
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
192
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
193 if (fts_backend_build_init(backend, &last_uid_locked, &build) < 0)
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
194 return -1;
7990
662172573fe1 Initial code to support Apache Solr (Lucene indexing server).
Timo Sirainen <tss@iki.fi>
parents: 7798
diff changeset
195 if (last_uid != last_uid_locked && last_uid_locked != (uint32_t)-1) {
4712
70ca205ce6f1 Added fts_backend_get_last_uid() which is first used to check if
Timo Sirainen <tss@iki.fi>
parents: 4709
diff changeset
196 /* changed, need to get again the sequences */
70ca205ce6f1 Added fts_backend_get_last_uid() which is first used to check if
Timo Sirainen <tss@iki.fi>
parents: 4709
diff changeset
197 last_uid = last_uid_locked;
7653
f8e902acfbae Renamed mailbox_get_uids() to mailbox_get_seq_range().
Timo Sirainen <tss@iki.fi>
parents: 7642
diff changeset
198 mailbox_get_seq_range(t->box, last_uid+1, (uint32_t)-1,
f8e902acfbae Renamed mailbox_get_uids() to mailbox_get_seq_range().
Timo Sirainen <tss@iki.fi>
parents: 7642
diff changeset
199 &seq1, &seq2);
7619
56f55bd35aa5 Moved IMAP messageset handling to lib-imap/ and searching to lib-storage/.
Timo Sirainen <tss@iki.fi>
parents: 7377
diff changeset
200 if (seq1 == 0) {
4712
70ca205ce6f1 Added fts_backend_get_last_uid() which is first used to check if
Timo Sirainen <tss@iki.fi>
parents: 4709
diff changeset
201 /* no new messages */
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
202 (void)fts_backend_build_deinit(&build);
4712
70ca205ce6f1 Added fts_backend_get_last_uid() which is first used to check if
Timo Sirainen <tss@iki.fi>
parents: 4709
diff changeset
203 return 0;
70ca205ce6f1 Added fts_backend_get_last_uid() which is first used to check if
Timo Sirainen <tss@iki.fi>
parents: 4709
diff changeset
204 }
70ca205ce6f1 Added fts_backend_get_last_uid() which is first used to check if
Timo Sirainen <tss@iki.fi>
parents: 4709
diff changeset
205 }
70ca205ce6f1 Added fts_backend_get_last_uid() which is first used to check if
Timo Sirainen <tss@iki.fi>
parents: 4709
diff changeset
206
7642
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7619
diff changeset
207 search_args = mail_search_build_init();
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7619
diff changeset
208 mail_search_build_add_seqset(search_args, seq1, seq2);
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7619
diff changeset
209
4946
460d589403d0 Make indexing non-blocking. Optimize also header searches.
Timo Sirainen <tss@iki.fi>
parents: 4942
diff changeset
210 ctx = i_new(struct fts_storage_build_context, 1);
460d589403d0 Make indexing non-blocking. Optimize also header searches.
Timo Sirainen <tss@iki.fi>
parents: 4942
diff changeset
211 ctx->build = build;
460d589403d0 Make indexing non-blocking. Optimize also header searches.
Timo Sirainen <tss@iki.fi>
parents: 4942
diff changeset
212 ctx->headers = str_new(default_pool, 512);
460d589403d0 Make indexing non-blocking. Optimize also header searches.
Timo Sirainen <tss@iki.fi>
parents: 4942
diff changeset
213 ctx->mail = mail_alloc(t, 0, NULL);
7642
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7619
diff changeset
214 ctx->search_ctx = mailbox_search_init(t, search_args, NULL);
8508
689a63a99363 fts: Hide "Searching .." notify while indexing.
Timo Sirainen <tss@iki.fi>
parents: 8507
diff changeset
215 ctx->search_ctx->progress_hidden = TRUE;
7642
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7619
diff changeset
216 ctx->search_args = search_args;
4946
460d589403d0 Make indexing non-blocking. Optimize also header searches.
Timo Sirainen <tss@iki.fi>
parents: 4942
diff changeset
217
460d589403d0 Make indexing non-blocking. Optimize also header searches.
Timo Sirainen <tss@iki.fi>
parents: 4942
diff changeset
218 fctx->build_ctx = ctx;
8495
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
219 return 1;
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
220 }
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
221
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
222 static struct fts_backend *
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
223 fts_mailbox_get_backend(struct fts_search_context *fctx,
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
224 struct mailbox *box)
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
225 {
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
226 struct fts_mailbox *fbox = FTS_CONTEXT(box);
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
227
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
228 if (fctx->build_backend == fctx->fbox->backend_fast)
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
229 return fbox->backend_fast;
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
230 else {
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
231 i_assert(fctx->build_backend == fctx->fbox->backend_substr);
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
232 return fbox->backend_substr;
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
233 }
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
234 }
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
235
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
236 static int fts_build_init_trans(struct fts_search_context *fctx,
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
237 struct mailbox_transaction_context *t)
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
238 {
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
239 struct fts_backend *backend;
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
240 uint32_t last_uid, seq1, seq2;
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
241 int ret;
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
242
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
243 backend = fts_mailbox_get_backend(fctx, t->box);
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
244 if (fts_backend_get_last_uid(backend, &last_uid) < 0)
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
245 return -1;
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
246
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
247 mailbox_get_seq_range(t->box, last_uid+1, (uint32_t)-1, &seq1, &seq2);
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
248 if (seq1 == 0) {
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
249 /* no new messages */
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
250 return 0;
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
251 }
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
252
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
253 ret = fts_build_init_seq(fctx, backend, t, seq1, seq2, last_uid);
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
254 return ret < 0 ? -1 : 0;
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
255 }
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
256
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
257 static int
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
258 fts_build_init_box(struct fts_search_context *fctx, struct mailbox *box,
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
259 uint32_t last_uid)
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
260 {
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
261 struct fts_backend *backend;
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
262 uint32_t seq1, seq2;
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
263
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
264 mailbox_get_seq_range(box, last_uid + 1, (uint32_t)-1, &seq1, &seq2);
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
265 if (seq1 == 0)
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
266 return 0;
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
267
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
268 backend = fts_mailbox_get_backend(fctx, box);
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
269 fctx->virtual_ctx.trans = mailbox_transaction_begin(box, 0);
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
270 return fts_build_init_seq(fctx, backend, fctx->virtual_ctx.trans,
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
271 seq1, seq2, last_uid);
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
272 }
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
273
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
274 static int mailbox_name_cmp(const void *p1, const void *p2)
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
275 {
8950
ec1ae90af21a fts: Fixes to how virtual mailboxes are searched.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
276 const struct fts_orig_mailboxes *box1 = p1, *box2 = p2;
8500
3efcdc45d111 Added alias_for setting for namespaces. Fixes namespace issues with fts.
Timo Sirainen <tss@iki.fi>
parents: 8499
diff changeset
277 int ret;
8495
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
278
8500
3efcdc45d111 Added alias_for setting for namespaces. Fixes namespace issues with fts.
Timo Sirainen <tss@iki.fi>
parents: 8499
diff changeset
279 T_BEGIN {
3efcdc45d111 Added alias_for setting for namespaces. Fixes namespace issues with fts.
Timo Sirainen <tss@iki.fi>
parents: 8499
diff changeset
280 string_t *tmp1, *tmp2;
3efcdc45d111 Added alias_for setting for namespaces. Fixes namespace issues with fts.
Timo Sirainen <tss@iki.fi>
parents: 8499
diff changeset
281 const char *vname1, *vname2;
3efcdc45d111 Added alias_for setting for namespaces. Fixes namespace issues with fts.
Timo Sirainen <tss@iki.fi>
parents: 8499
diff changeset
282
3efcdc45d111 Added alias_for setting for namespaces. Fixes namespace issues with fts.
Timo Sirainen <tss@iki.fi>
parents: 8499
diff changeset
283 tmp1 = t_str_new(128);
3efcdc45d111 Added alias_for setting for namespaces. Fixes namespace issues with fts.
Timo Sirainen <tss@iki.fi>
parents: 8499
diff changeset
284 tmp2 = t_str_new(128);
8950
ec1ae90af21a fts: Fixes to how virtual mailboxes are searched.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
285 vname1 = mail_namespace_get_vname(box1->ns, tmp1, box1->name);
ec1ae90af21a fts: Fixes to how virtual mailboxes are searched.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
286 vname2 = mail_namespace_get_vname(box2->ns, tmp2, box2->name);
8500
3efcdc45d111 Added alias_for setting for namespaces. Fixes namespace issues with fts.
Timo Sirainen <tss@iki.fi>
parents: 8499
diff changeset
287 ret = strcmp(vname1, vname2);
3efcdc45d111 Added alias_for setting for namespaces. Fixes namespace issues with fts.
Timo Sirainen <tss@iki.fi>
parents: 8499
diff changeset
288 } T_END;
3efcdc45d111 Added alias_for setting for namespaces. Fixes namespace issues with fts.
Timo Sirainen <tss@iki.fi>
parents: 8499
diff changeset
289 return ret;
8495
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
290 }
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
291
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
292 static int fts_backend_uid_map_mailbox_cmp(const void *p1, const void *p2)
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
293 {
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
294 const struct fts_backend_uid_map *map1 = p1, *map2 = p2;
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
295
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
296 return strcmp(map1->mailbox, map2->mailbox);
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
297 }
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
298
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
299 static int fts_build_init_virtual_next(struct fts_search_context *fctx)
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
300 {
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
301 struct fts_search_virtual_context *vctx = &fctx->virtual_ctx;
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
302 struct mailbox_status status;
8950
ec1ae90af21a fts: Fixes to how virtual mailboxes are searched.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
303 const struct fts_orig_mailboxes *boxes;
8495
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
304 const struct fts_backend_uid_map *last_uids;
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
305 unsigned int boxi, uidi, box_count, last_uid_count;
8499
252b29ac5f43 fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents: 8496
diff changeset
306 const char *vname;
252b29ac5f43 fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents: 8496
diff changeset
307 string_t *tmp;
8495
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
308 int ret, vret = 0;
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
309
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
310 if (vctx->pool == NULL)
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
311 return 0;
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
312
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
313 if (fctx->virtual_ctx.trans != NULL)
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
314 (void)mailbox_transaction_commit(&fctx->virtual_ctx.trans);
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
315
8950
ec1ae90af21a fts: Fixes to how virtual mailboxes are searched.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
316 boxes = array_get(&vctx->orig_mailboxes, &box_count);
8495
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
317 last_uids = array_get(&vctx->last_uids, &last_uid_count);
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
318
8499
252b29ac5f43 fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents: 8496
diff changeset
319 tmp = t_str_new(256);
8495
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
320 boxi = vctx->boxi;
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
321 uidi = vctx->uidi;
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
322 while (vret == 0 && boxi < box_count && uidi < last_uid_count) {
8950
ec1ae90af21a fts: Fixes to how virtual mailboxes are searched.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
323 vname = mail_namespace_get_vname(boxes[boxi].ns, tmp,
ec1ae90af21a fts: Fixes to how virtual mailboxes are searched.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
324 boxes[boxi].name);
8499
252b29ac5f43 fts: Added support for handling multiple namespaces.
Timo Sirainen <tss@iki.fi>
parents: 8496
diff changeset
325 ret = strcmp(vname, last_uids[uidi].mailbox);
8495
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
326 if (ret == 0) {
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
327 /* match. check also that uidvalidity matches. */
8950
ec1ae90af21a fts: Fixes to how virtual mailboxes are searched.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
328 mailbox_get_status(boxes[boxi].box, STATUS_UIDVALIDITY,
8495
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
329 &status);
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
330 if (status.uidvalidity != last_uids[uidi].uidvalidity) {
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
331 uidi++;
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
332 continue;
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
333 }
8950
ec1ae90af21a fts: Fixes to how virtual mailboxes are searched.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
334 vret = fts_build_init_box(fctx, boxes[boxi].box,
8495
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
335 last_uids[uidi].uid);
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
336 boxi++;
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
337 uidi++;
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
338 } else if (ret > 0) {
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
339 /* not part of this virtual mailbox */
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
340 uidi++;
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
341 } else {
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
342 /* no messages indexed in the mailbox */
8950
ec1ae90af21a fts: Fixes to how virtual mailboxes are searched.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
343 vret = fts_build_init_box(fctx, boxes[boxi].box, 0);
8495
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
344 boxi++;
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
345 }
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
346 }
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
347 while (vret == 0 && boxi < box_count) {
8950
ec1ae90af21a fts: Fixes to how virtual mailboxes are searched.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
348 vret = fts_build_init_box(fctx, boxes[boxi].box, 0);
8495
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
349 boxi++;
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
350 }
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
351 vctx->boxi = boxi;
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
352 vctx->uidi = uidi;
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
353 return vret;
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
354 }
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
355
8950
ec1ae90af21a fts: Fixes to how virtual mailboxes are searched.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
356 static const char *
ec1ae90af21a fts: Fixes to how virtual mailboxes are searched.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
357 fts_box_get_root(struct mailbox *box, struct mail_namespace **ns_r)
ec1ae90af21a fts: Fixes to how virtual mailboxes are searched.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
358 {
ec1ae90af21a fts: Fixes to how virtual mailboxes are searched.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
359 struct mail_namespace *ns = box->storage->ns;
ec1ae90af21a fts: Fixes to how virtual mailboxes are searched.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
360 const char *name = box->name;
ec1ae90af21a fts: Fixes to how virtual mailboxes are searched.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
361
ec1ae90af21a fts: Fixes to how virtual mailboxes are searched.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
362 while (ns->alias_for != NULL)
ec1ae90af21a fts: Fixes to how virtual mailboxes are searched.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
363 ns = ns->alias_for;
ec1ae90af21a fts: Fixes to how virtual mailboxes are searched.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
364 *ns_r = ns;
ec1ae90af21a fts: Fixes to how virtual mailboxes are searched.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
365
ec1ae90af21a fts: Fixes to how virtual mailboxes are searched.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
366 if (*name == '\0' && ns != box->storage->ns &&
ec1ae90af21a fts: Fixes to how virtual mailboxes are searched.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
367 (ns->flags & NAMESPACE_FLAG_INBOX) != 0) {
ec1ae90af21a fts: Fixes to how virtual mailboxes are searched.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
368 /* ugly workaround to allow selecting INBOX from a Maildir/
ec1ae90af21a fts: Fixes to how virtual mailboxes are searched.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
369 when it's not in the inbox=yes namespace. */
ec1ae90af21a fts: Fixes to how virtual mailboxes are searched.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
370 return "INBOX";
ec1ae90af21a fts: Fixes to how virtual mailboxes are searched.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
371 }
ec1ae90af21a fts: Fixes to how virtual mailboxes are searched.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
372 return name;
ec1ae90af21a fts: Fixes to how virtual mailboxes are searched.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
373 }
ec1ae90af21a fts: Fixes to how virtual mailboxes are searched.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
374
8495
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
375 static int fts_build_init_virtual(struct fts_search_context *fctx)
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
376 {
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
377 struct fts_search_virtual_context *vctx = &fctx->virtual_ctx;
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
378 struct fts_backend_uid_map *last_uids;
8950
ec1ae90af21a fts: Fixes to how virtual mailboxes are searched.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
379 ARRAY_TYPE(mailboxes) mailboxes;
ec1ae90af21a fts: Fixes to how virtual mailboxes are searched.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
380 struct mailbox *const *boxes;
ec1ae90af21a fts: Fixes to how virtual mailboxes are searched.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
381 struct fts_orig_mailboxes *orig_boxes;
ec1ae90af21a fts: Fixes to how virtual mailboxes are searched.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
382 struct fts_orig_mailboxes orig_box;
ec1ae90af21a fts: Fixes to how virtual mailboxes are searched.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
383 unsigned int i, box_count, last_uid_count;
8495
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
384 int ret;
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
385
8950
ec1ae90af21a fts: Fixes to how virtual mailboxes are searched.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
386 t_array_init(&mailboxes, 64);
ec1ae90af21a fts: Fixes to how virtual mailboxes are searched.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
387 mailbox_get_virtual_backend_boxes(fctx->t->box, &mailboxes, TRUE);
ec1ae90af21a fts: Fixes to how virtual mailboxes are searched.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
388 boxes = array_get_modifiable(&mailboxes, &box_count);
ec1ae90af21a fts: Fixes to how virtual mailboxes are searched.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
389
8495
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
390 vctx->pool = pool_alloconly_create("fts virtual build", 1024);
8950
ec1ae90af21a fts: Fixes to how virtual mailboxes are searched.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
391 p_array_init(&vctx->orig_mailboxes, vctx->pool, box_count);
ec1ae90af21a fts: Fixes to how virtual mailboxes are searched.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
392 memset(&orig_box, 0, sizeof(orig_box));
ec1ae90af21a fts: Fixes to how virtual mailboxes are searched.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
393 for (i = 0; i < box_count; i++) {
ec1ae90af21a fts: Fixes to how virtual mailboxes are searched.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
394 orig_box.box = boxes[i];
ec1ae90af21a fts: Fixes to how virtual mailboxes are searched.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
395 orig_box.name = fts_box_get_root(boxes[i], &orig_box.ns);
ec1ae90af21a fts: Fixes to how virtual mailboxes are searched.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
396 array_append(&vctx->orig_mailboxes, &orig_box, 1);
ec1ae90af21a fts: Fixes to how virtual mailboxes are searched.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
397 }
ec1ae90af21a fts: Fixes to how virtual mailboxes are searched.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
398
ec1ae90af21a fts: Fixes to how virtual mailboxes are searched.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
399 orig_boxes = array_get_modifiable(&vctx->orig_mailboxes, &box_count);
8495
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
400
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
401 if (box_count <= 0) {
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
402 if (box_count == 0) {
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
403 /* empty virtual mailbox */
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
404 return 0;
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
405 }
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
406 /* virtual mailbox is built from only a single mailbox
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
407 (currently). check that directly. */
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
408 fctx->virtual_ctx.trans =
8950
ec1ae90af21a fts: Fixes to how virtual mailboxes are searched.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
409 mailbox_transaction_begin(orig_boxes[0].box, 0);
8495
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
410 ret = fts_build_init_trans(fctx, fctx->virtual_ctx.trans);
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
411 return ret;
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
412 }
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
413
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
414 /* virtual mailbox is built from multiple mailboxes. figure out which
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
415 ones need updating. */
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
416 p_array_init(&vctx->last_uids, vctx->pool, 64);
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
417 if (fts_backend_get_all_last_uids(fctx->build_backend, vctx->pool,
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
418 &vctx->last_uids) < 0) {
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
419 pool_unref(&vctx->pool);
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
420 return -1;
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
421 }
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
422 last_uids = array_get_modifiable(&vctx->last_uids, &last_uid_count);
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
423
8950
ec1ae90af21a fts: Fixes to how virtual mailboxes are searched.
Timo Sirainen <tss@iki.fi>
parents: 8590
diff changeset
424 qsort(orig_boxes, box_count, sizeof(*orig_boxes), mailbox_name_cmp);
8495
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
425 qsort(last_uids, last_uid_count, sizeof(*last_uids),
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
426 fts_backend_uid_map_mailbox_cmp);
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
427
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
428 ret = fts_build_init_virtual_next(fctx);
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
429 return ret < 0 ? -1 : 0;
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
430 }
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
431
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
432 static int fts_build_init(struct fts_search_context *fctx)
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
433 {
8496
1e8f718884c4 fts: Cache "last indexed uid" lookups as long as new messages aren't added to mailbox.
Timo Sirainen <tss@iki.fi>
parents: 8495
diff changeset
434 struct mailbox_status status;
1e8f718884c4 fts: Cache "last indexed uid" lookups as long as new messages aren't added to mailbox.
Timo Sirainen <tss@iki.fi>
parents: 8495
diff changeset
435 int ret;
1e8f718884c4 fts: Cache "last indexed uid" lookups as long as new messages aren't added to mailbox.
Timo Sirainen <tss@iki.fi>
parents: 8495
diff changeset
436
1e8f718884c4 fts: Cache "last indexed uid" lookups as long as new messages aren't added to mailbox.
Timo Sirainen <tss@iki.fi>
parents: 8495
diff changeset
437 mailbox_get_status(fctx->t->box, STATUS_MESSAGES | STATUS_UIDNEXT,
1e8f718884c4 fts: Cache "last indexed uid" lookups as long as new messages aren't added to mailbox.
Timo Sirainen <tss@iki.fi>
parents: 8495
diff changeset
438 &status);
1e8f718884c4 fts: Cache "last indexed uid" lookups as long as new messages aren't added to mailbox.
Timo Sirainen <tss@iki.fi>
parents: 8495
diff changeset
439 if (status.messages == fctx->fbox->last_messages_count &&
1e8f718884c4 fts: Cache "last indexed uid" lookups as long as new messages aren't added to mailbox.
Timo Sirainen <tss@iki.fi>
parents: 8495
diff changeset
440 status.uidnext == fctx->fbox->last_uidnext) {
1e8f718884c4 fts: Cache "last indexed uid" lookups as long as new messages aren't added to mailbox.
Timo Sirainen <tss@iki.fi>
parents: 8495
diff changeset
441 /* no new messages since last check */
1e8f718884c4 fts: Cache "last indexed uid" lookups as long as new messages aren't added to mailbox.
Timo Sirainen <tss@iki.fi>
parents: 8495
diff changeset
442 return 0;
1e8f718884c4 fts: Cache "last indexed uid" lookups as long as new messages aren't added to mailbox.
Timo Sirainen <tss@iki.fi>
parents: 8495
diff changeset
443 }
1e8f718884c4 fts: Cache "last indexed uid" lookups as long as new messages aren't added to mailbox.
Timo Sirainen <tss@iki.fi>
parents: 8495
diff changeset
444
9292
96b764649cbb fts: Fixed crashing with Squat.
Timo Sirainen <tss@iki.fi>
parents: 9058
diff changeset
445 if (fctx->fbox->virtual &&
96b764649cbb fts: Fixed crashing with Squat.
Timo Sirainen <tss@iki.fi>
parents: 9058
diff changeset
446 (fctx->build_backend->flags & FTS_BACKEND_FLAG_VIRTUAL_LOOKUPS) != 0)
8496
1e8f718884c4 fts: Cache "last indexed uid" lookups as long as new messages aren't added to mailbox.
Timo Sirainen <tss@iki.fi>
parents: 8495
diff changeset
447 ret = fts_build_init_virtual(fctx);
1e8f718884c4 fts: Cache "last indexed uid" lookups as long as new messages aren't added to mailbox.
Timo Sirainen <tss@iki.fi>
parents: 8495
diff changeset
448 else
1e8f718884c4 fts: Cache "last indexed uid" lookups as long as new messages aren't added to mailbox.
Timo Sirainen <tss@iki.fi>
parents: 8495
diff changeset
449 ret = fts_build_init_trans(fctx, fctx->t);
1e8f718884c4 fts: Cache "last indexed uid" lookups as long as new messages aren't added to mailbox.
Timo Sirainen <tss@iki.fi>
parents: 8495
diff changeset
450 if (ret == 0 && fctx->build_ctx == NULL) {
1e8f718884c4 fts: Cache "last indexed uid" lookups as long as new messages aren't added to mailbox.
Timo Sirainen <tss@iki.fi>
parents: 8495
diff changeset
451 /* index was up-to-date */
1e8f718884c4 fts: Cache "last indexed uid" lookups as long as new messages aren't added to mailbox.
Timo Sirainen <tss@iki.fi>
parents: 8495
diff changeset
452 fctx->fbox->last_messages_count = status.messages;
1e8f718884c4 fts: Cache "last indexed uid" lookups as long as new messages aren't added to mailbox.
Timo Sirainen <tss@iki.fi>
parents: 8495
diff changeset
453 fctx->fbox->last_uidnext = status.uidnext;
1e8f718884c4 fts: Cache "last indexed uid" lookups as long as new messages aren't added to mailbox.
Timo Sirainen <tss@iki.fi>
parents: 8495
diff changeset
454 }
1e8f718884c4 fts: Cache "last indexed uid" lookups as long as new messages aren't added to mailbox.
Timo Sirainen <tss@iki.fi>
parents: 8495
diff changeset
455 return ret;
4946
460d589403d0 Make indexing non-blocking. Optimize also header searches.
Timo Sirainen <tss@iki.fi>
parents: 4942
diff changeset
456 }
460d589403d0 Make indexing non-blocking. Optimize also header searches.
Timo Sirainen <tss@iki.fi>
parents: 4942
diff changeset
457
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
458 static int fts_build_deinit(struct fts_storage_build_context **_ctx)
4946
460d589403d0 Make indexing non-blocking. Optimize also header searches.
Timo Sirainen <tss@iki.fi>
parents: 4942
diff changeset
459 {
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
460 struct fts_storage_build_context *ctx = *_ctx;
4950
16dd9aa9d275 If indexing takes over 10 seconds, start giving estimates about when it's
Timo Sirainen <tss@iki.fi>
parents: 4948
diff changeset
461 struct mailbox *box = ctx->mail->transaction->box;
8496
1e8f718884c4 fts: Cache "last indexed uid" lookups as long as new messages aren't added to mailbox.
Timo Sirainen <tss@iki.fi>
parents: 8495
diff changeset
462 struct fts_mailbox *fbox = FTS_CONTEXT(box);
1e8f718884c4 fts: Cache "last indexed uid" lookups as long as new messages aren't added to mailbox.
Timo Sirainen <tss@iki.fi>
parents: 8495
diff changeset
463 struct mailbox_status status;
4946
460d589403d0 Make indexing non-blocking. Optimize also header searches.
Timo Sirainen <tss@iki.fi>
parents: 4942
diff changeset
464 int ret = 0;
4609
48a16f1254b5 Added full text search plugin framework. Still missing support for handling
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
465
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
466 *_ctx = NULL;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
467
4946
460d589403d0 Make indexing non-blocking. Optimize also header searches.
Timo Sirainen <tss@iki.fi>
parents: 4942
diff changeset
468 if (mailbox_search_deinit(&ctx->search_ctx) < 0)
460d589403d0 Make indexing non-blocking. Optimize also header searches.
Timo Sirainen <tss@iki.fi>
parents: 4942
diff changeset
469 ret = -1;
460d589403d0 Make indexing non-blocking. Optimize also header searches.
Timo Sirainen <tss@iki.fi>
parents: 4942
diff changeset
470 mail_free(&ctx->mail);
460d589403d0 Make indexing non-blocking. Optimize also header searches.
Timo Sirainen <tss@iki.fi>
parents: 4942
diff changeset
471
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
472 if (fts_backend_build_deinit(&ctx->build) < 0)
4946
460d589403d0 Make indexing non-blocking. Optimize also header searches.
Timo Sirainen <tss@iki.fi>
parents: 4942
diff changeset
473 ret = -1;
4950
16dd9aa9d275 If indexing takes over 10 seconds, start giving estimates about when it's
Timo Sirainen <tss@iki.fi>
parents: 4948
diff changeset
474
8496
1e8f718884c4 fts: Cache "last indexed uid" lookups as long as new messages aren't added to mailbox.
Timo Sirainen <tss@iki.fi>
parents: 8495
diff changeset
475 if (ret == 0) {
1e8f718884c4 fts: Cache "last indexed uid" lookups as long as new messages aren't added to mailbox.
Timo Sirainen <tss@iki.fi>
parents: 8495
diff changeset
476 mailbox_get_status(box, STATUS_MESSAGES | STATUS_UIDNEXT,
1e8f718884c4 fts: Cache "last indexed uid" lookups as long as new messages aren't added to mailbox.
Timo Sirainen <tss@iki.fi>
parents: 8495
diff changeset
477 &status);
1e8f718884c4 fts: Cache "last indexed uid" lookups as long as new messages aren't added to mailbox.
Timo Sirainen <tss@iki.fi>
parents: 8495
diff changeset
478 fbox->last_messages_count = status.messages;
1e8f718884c4 fts: Cache "last indexed uid" lookups as long as new messages aren't added to mailbox.
Timo Sirainen <tss@iki.fi>
parents: 8495
diff changeset
479 fbox->last_uidnext = status.uidnext;
1e8f718884c4 fts: Cache "last indexed uid" lookups as long as new messages aren't added to mailbox.
Timo Sirainen <tss@iki.fi>
parents: 8495
diff changeset
480 }
1e8f718884c4 fts: Cache "last indexed uid" lookups as long as new messages aren't added to mailbox.
Timo Sirainen <tss@iki.fi>
parents: 8495
diff changeset
481
4950
16dd9aa9d275 If indexing takes over 10 seconds, start giving estimates about when it's
Timo Sirainen <tss@iki.fi>
parents: 4948
diff changeset
482 if (ioloop_time - ctx->search_start_time.tv_sec >=
16dd9aa9d275 If indexing takes over 10 seconds, start giving estimates about when it's
Timo Sirainen <tss@iki.fi>
parents: 4948
diff changeset
483 FTS_BUILD_NOTIFY_INTERVAL_SECS) {
16dd9aa9d275 If indexing takes over 10 seconds, start giving estimates about when it's
Timo Sirainen <tss@iki.fi>
parents: 4948
diff changeset
484 /* we notified at least once */
16dd9aa9d275 If indexing takes over 10 seconds, start giving estimates about when it's
Timo Sirainen <tss@iki.fi>
parents: 4948
diff changeset
485 box->storage->callbacks->
16dd9aa9d275 If indexing takes over 10 seconds, start giving estimates about when it's
Timo Sirainen <tss@iki.fi>
parents: 4948
diff changeset
486 notify_ok(box, "Mailbox indexing finished",
16dd9aa9d275 If indexing takes over 10 seconds, start giving estimates about when it's
Timo Sirainen <tss@iki.fi>
parents: 4948
diff changeset
487 box->storage->callback_context);
16dd9aa9d275 If indexing takes over 10 seconds, start giving estimates about when it's
Timo Sirainen <tss@iki.fi>
parents: 4948
diff changeset
488 }
16dd9aa9d275 If indexing takes over 10 seconds, start giving estimates about when it's
Timo Sirainen <tss@iki.fi>
parents: 4948
diff changeset
489
4946
460d589403d0 Make indexing non-blocking. Optimize also header searches.
Timo Sirainen <tss@iki.fi>
parents: 4942
diff changeset
490 str_free(&ctx->headers);
7642
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7619
diff changeset
491 mail_search_args_unref(&ctx->search_args);
4946
460d589403d0 Make indexing non-blocking. Optimize also header searches.
Timo Sirainen <tss@iki.fi>
parents: 4942
diff changeset
492 i_free(ctx);
460d589403d0 Make indexing non-blocking. Optimize also header searches.
Timo Sirainen <tss@iki.fi>
parents: 4942
diff changeset
493 return ret;
460d589403d0 Make indexing non-blocking. Optimize also header searches.
Timo Sirainen <tss@iki.fi>
parents: 4942
diff changeset
494 }
460d589403d0 Make indexing non-blocking. Optimize also header searches.
Timo Sirainen <tss@iki.fi>
parents: 4942
diff changeset
495
4950
16dd9aa9d275 If indexing takes over 10 seconds, start giving estimates about when it's
Timo Sirainen <tss@iki.fi>
parents: 4948
diff changeset
496 static void fts_build_notify(struct fts_storage_build_context *ctx)
16dd9aa9d275 If indexing takes over 10 seconds, start giving estimates about when it's
Timo Sirainen <tss@iki.fi>
parents: 4948
diff changeset
497 {
16dd9aa9d275 If indexing takes over 10 seconds, start giving estimates about when it's
Timo Sirainen <tss@iki.fi>
parents: 4948
diff changeset
498 struct mailbox *box = ctx->mail->transaction->box;
7619
56f55bd35aa5 Moved IMAP messageset handling to lib-imap/ and searching to lib-storage/.
Timo Sirainen <tss@iki.fi>
parents: 7377
diff changeset
499 const struct seq_range *range;
4950
16dd9aa9d275 If indexing takes over 10 seconds, start giving estimates about when it's
Timo Sirainen <tss@iki.fi>
parents: 4948
diff changeset
500 float percentage;
16dd9aa9d275 If indexing takes over 10 seconds, start giving estimates about when it's
Timo Sirainen <tss@iki.fi>
parents: 4948
diff changeset
501 unsigned int msecs, secs;
16dd9aa9d275 If indexing takes over 10 seconds, start giving estimates about when it's
Timo Sirainen <tss@iki.fi>
parents: 4948
diff changeset
502
16dd9aa9d275 If indexing takes over 10 seconds, start giving estimates about when it's
Timo Sirainen <tss@iki.fi>
parents: 4948
diff changeset
503 if (ctx->last_notify.tv_sec == 0) {
16dd9aa9d275 If indexing takes over 10 seconds, start giving estimates about when it's
Timo Sirainen <tss@iki.fi>
parents: 4948
diff changeset
504 /* set the search time in here, in case a plugin
16dd9aa9d275 If indexing takes over 10 seconds, start giving estimates about when it's
Timo Sirainen <tss@iki.fi>
parents: 4948
diff changeset
505 already spent some time indexing the mailbox */
16dd9aa9d275 If indexing takes over 10 seconds, start giving estimates about when it's
Timo Sirainen <tss@iki.fi>
parents: 4948
diff changeset
506 ctx->search_start_time = ioloop_timeval;
16dd9aa9d275 If indexing takes over 10 seconds, start giving estimates about when it's
Timo Sirainen <tss@iki.fi>
parents: 4948
diff changeset
507 } else if (box->storage->callbacks->notify_ok != NULL) {
7642
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7619
diff changeset
508 range = array_idx(&ctx->search_args->args->value.seqset, 0);
7619
56f55bd35aa5 Moved IMAP messageset handling to lib-imap/ and searching to lib-storage/.
Timo Sirainen <tss@iki.fi>
parents: 7377
diff changeset
509 percentage = (ctx->mail->seq - range->seq1) * 100.0 /
56f55bd35aa5 Moved IMAP messageset handling to lib-imap/ and searching to lib-storage/.
Timo Sirainen <tss@iki.fi>
parents: 7377
diff changeset
510 (range->seq2 - range->seq1);
9311
d48640a2ab4a Use timeval_diff_*() more.
Timo Sirainen <tss@iki.fi>
parents: 9292
diff changeset
511 msecs = timeval_diff_msecs(&ioloop_timeval,
d48640a2ab4a Use timeval_diff_*() more.
Timo Sirainen <tss@iki.fi>
parents: 9292
diff changeset
512 &ctx->search_start_time);
4950
16dd9aa9d275 If indexing takes over 10 seconds, start giving estimates about when it's
Timo Sirainen <tss@iki.fi>
parents: 4948
diff changeset
513 secs = (msecs / (percentage / 100.0) - msecs) / 1000;
16dd9aa9d275 If indexing takes over 10 seconds, start giving estimates about when it's
Timo Sirainen <tss@iki.fi>
parents: 4948
diff changeset
514
7226
e6693a0ec8e1 Renamed T_FRAME_BEGIN/END to T_BEGIN/END. Removed T_FRAME() macro and
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
515 T_BEGIN {
6940
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6914
diff changeset
516 const char *text;
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6914
diff changeset
517
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6914
diff changeset
518 text = t_strdup_printf("Indexed %d%% of the mailbox, "
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6914
diff changeset
519 "ETA %d:%02d", (int)percentage,
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6914
diff changeset
520 secs/60, secs%60);
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6914
diff changeset
521 box->storage->callbacks->
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6914
diff changeset
522 notify_ok(box, text,
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6914
diff changeset
523 box->storage->callback_context);
7226
e6693a0ec8e1 Renamed T_FRAME_BEGIN/END to T_BEGIN/END. Removed T_FRAME() macro and
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
524 } T_END;
4950
16dd9aa9d275 If indexing takes over 10 seconds, start giving estimates about when it's
Timo Sirainen <tss@iki.fi>
parents: 4948
diff changeset
525 }
16dd9aa9d275 If indexing takes over 10 seconds, start giving estimates about when it's
Timo Sirainen <tss@iki.fi>
parents: 4948
diff changeset
526 ctx->last_notify = ioloop_timeval;
16dd9aa9d275 If indexing takes over 10 seconds, start giving estimates about when it's
Timo Sirainen <tss@iki.fi>
parents: 4948
diff changeset
527 }
16dd9aa9d275 If indexing takes over 10 seconds, start giving estimates about when it's
Timo Sirainen <tss@iki.fi>
parents: 4948
diff changeset
528
4946
460d589403d0 Make indexing non-blocking. Optimize also header searches.
Timo Sirainen <tss@iki.fi>
parents: 4942
diff changeset
529 static int fts_build_more(struct fts_storage_build_context *ctx)
460d589403d0 Make indexing non-blocking. Optimize also header searches.
Timo Sirainen <tss@iki.fi>
parents: 4942
diff changeset
530 {
460d589403d0 Make indexing non-blocking. Optimize also header searches.
Timo Sirainen <tss@iki.fi>
parents: 4942
diff changeset
531 unsigned int count = 0;
460d589403d0 Make indexing non-blocking. Optimize also header searches.
Timo Sirainen <tss@iki.fi>
parents: 4942
diff changeset
532 int ret;
460d589403d0 Make indexing non-blocking. Optimize also header searches.
Timo Sirainen <tss@iki.fi>
parents: 4942
diff changeset
533
4950
16dd9aa9d275 If indexing takes over 10 seconds, start giving estimates about when it's
Timo Sirainen <tss@iki.fi>
parents: 4948
diff changeset
534 if (ioloop_time - ctx->last_notify.tv_sec >=
16dd9aa9d275 If indexing takes over 10 seconds, start giving estimates about when it's
Timo Sirainen <tss@iki.fi>
parents: 4948
diff changeset
535 FTS_BUILD_NOTIFY_INTERVAL_SECS)
16dd9aa9d275 If indexing takes over 10 seconds, start giving estimates about when it's
Timo Sirainen <tss@iki.fi>
parents: 4948
diff changeset
536 fts_build_notify(ctx);
16dd9aa9d275 If indexing takes over 10 seconds, start giving estimates about when it's
Timo Sirainen <tss@iki.fi>
parents: 4948
diff changeset
537
4946
460d589403d0 Make indexing non-blocking. Optimize also header searches.
Timo Sirainen <tss@iki.fi>
parents: 4942
diff changeset
538 while (mailbox_search_next(ctx->search_ctx, ctx->mail) > 0) {
7226
e6693a0ec8e1 Renamed T_FRAME_BEGIN/END to T_BEGIN/END. Removed T_FRAME() macro and
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
539 T_BEGIN {
6940
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6914
diff changeset
540 ret = fts_build_mail(ctx, ctx->mail->uid);
7226
e6693a0ec8e1 Renamed T_FRAME_BEGIN/END to T_BEGIN/END. Removed T_FRAME() macro and
Timo Sirainen <tss@iki.fi>
parents: 7086
diff changeset
541 } T_END;
4884
8a09d03e6628 Don't waste memory in data stack.
Timo Sirainen <tss@iki.fi>
parents: 4882
diff changeset
542
8a09d03e6628 Don't waste memory in data stack.
Timo Sirainen <tss@iki.fi>
parents: 4882
diff changeset
543 if (ret < 0)
4946
460d589403d0 Make indexing non-blocking. Optimize also header searches.
Timo Sirainen <tss@iki.fi>
parents: 4942
diff changeset
544 return -1;
460d589403d0 Make indexing non-blocking. Optimize also header searches.
Timo Sirainen <tss@iki.fi>
parents: 4942
diff changeset
545
460d589403d0 Make indexing non-blocking. Optimize also header searches.
Timo Sirainen <tss@iki.fi>
parents: 4942
diff changeset
546 if (++count == FTS_SEARCH_NONBLOCK_COUNT)
460d589403d0 Make indexing non-blocking. Optimize also header searches.
Timo Sirainen <tss@iki.fi>
parents: 4942
diff changeset
547 return 0;
4609
48a16f1254b5 Added full text search plugin framework. Still missing support for handling
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
548 }
4950
16dd9aa9d275 If indexing takes over 10 seconds, start giving estimates about when it's
Timo Sirainen <tss@iki.fi>
parents: 4948
diff changeset
549
4946
460d589403d0 Make indexing non-blocking. Optimize also header searches.
Timo Sirainen <tss@iki.fi>
parents: 4942
diff changeset
550 return 1;
460d589403d0 Make indexing non-blocking. Optimize also header searches.
Timo Sirainen <tss@iki.fi>
parents: 4942
diff changeset
551 }
460d589403d0 Make indexing non-blocking. Optimize also header searches.
Timo Sirainen <tss@iki.fi>
parents: 4942
diff changeset
552
8507
f323bf2465bd Give more correct "* OK searched n%" notifications with fts and virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8500
diff changeset
553 static void fts_search_init_lookup(struct mail_search_context *ctx,
f323bf2465bd Give more correct "* OK searched n%" notifications with fts and virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8500
diff changeset
554 struct fts_search_context *fctx)
f323bf2465bd Give more correct "* OK searched n%" notifications with fts and virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8500
diff changeset
555 {
f323bf2465bd Give more correct "* OK searched n%" notifications with fts and virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8500
diff changeset
556 fts_search_lookup(fctx);
f323bf2465bd Give more correct "* OK searched n%" notifications with fts and virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8500
diff changeset
557
f323bf2465bd Give more correct "* OK searched n%" notifications with fts and virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8500
diff changeset
558 if (fctx->seqs_set &&
f323bf2465bd Give more correct "* OK searched n%" notifications with fts and virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8500
diff changeset
559 strcmp(ctx->transaction->box->storage->name, "virtual") != 0) {
f323bf2465bd Give more correct "* OK searched n%" notifications with fts and virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8500
diff changeset
560 ctx->progress_max = array_count(&fctx->definite_seqs) +
f323bf2465bd Give more correct "* OK searched n%" notifications with fts and virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8500
diff changeset
561 array_count(&fctx->maybe_seqs);
f323bf2465bd Give more correct "* OK searched n%" notifications with fts and virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8500
diff changeset
562 }
8508
689a63a99363 fts: Hide "Searching .." notify while indexing.
Timo Sirainen <tss@iki.fi>
parents: 8507
diff changeset
563 ctx->progress_cur = 0;
8507
f323bf2465bd Give more correct "* OK searched n%" notifications with fts and virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8500
diff changeset
564 }
f323bf2465bd Give more correct "* OK searched n%" notifications with fts and virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8500
diff changeset
565
f323bf2465bd Give more correct "* OK searched n%" notifications with fts and virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8500
diff changeset
566 static bool fts_try_build_init(struct mail_search_context *ctx,
f323bf2465bd Give more correct "* OK searched n%" notifications with fts and virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8500
diff changeset
567 struct fts_search_context *fctx)
5405
22d04968449a Don't crash if another search is started while we're still building the
Timo Sirainen <tss@iki.fi>
parents: 5341
diff changeset
568 {
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
569 if (fctx->build_backend == NULL) {
5405
22d04968449a Don't crash if another search is started while we're still building the
Timo Sirainen <tss@iki.fi>
parents: 5341
diff changeset
570 fctx->build_initialized = TRUE;
22d04968449a Don't crash if another search is started while we're still building the
Timo Sirainen <tss@iki.fi>
parents: 5341
diff changeset
571 return TRUE;
22d04968449a Don't crash if another search is started while we're still building the
Timo Sirainen <tss@iki.fi>
parents: 5341
diff changeset
572 }
22d04968449a Don't crash if another search is started while we're still building the
Timo Sirainen <tss@iki.fi>
parents: 5341
diff changeset
573
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
574 if (fts_backend_is_building(fctx->build_backend)) {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
575 /* this process is already building the indexes */
5405
22d04968449a Don't crash if another search is started while we're still building the
Timo Sirainen <tss@iki.fi>
parents: 5341
diff changeset
576 return FALSE;
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
577 }
5405
22d04968449a Don't crash if another search is started while we're still building the
Timo Sirainen <tss@iki.fi>
parents: 5341
diff changeset
578 fctx->build_initialized = TRUE;
22d04968449a Don't crash if another search is started while we're still building the
Timo Sirainen <tss@iki.fi>
parents: 5341
diff changeset
579
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
580 if (fts_build_init(fctx) < 0) {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
581 fctx->build_backend = NULL;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
582 return TRUE;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
583 }
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
584
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
585 if (fctx->build_ctx == NULL) {
5405
22d04968449a Don't crash if another search is started while we're still building the
Timo Sirainen <tss@iki.fi>
parents: 5341
diff changeset
586 /* the index was up to date */
8507
f323bf2465bd Give more correct "* OK searched n%" notifications with fts and virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8500
diff changeset
587 fts_search_init_lookup(ctx, fctx);
8508
689a63a99363 fts: Hide "Searching .." notify while indexing.
Timo Sirainen <tss@iki.fi>
parents: 8507
diff changeset
588 } else {
689a63a99363 fts: Hide "Searching .." notify while indexing.
Timo Sirainen <tss@iki.fi>
parents: 8507
diff changeset
589 /* hide "searching" notifications */
689a63a99363 fts: Hide "Searching .." notify while indexing.
Timo Sirainen <tss@iki.fi>
parents: 8507
diff changeset
590 ctx->progress_hidden = TRUE;
5405
22d04968449a Don't crash if another search is started while we're still building the
Timo Sirainen <tss@iki.fi>
parents: 5341
diff changeset
591 }
22d04968449a Don't crash if another search is started while we're still building the
Timo Sirainen <tss@iki.fi>
parents: 5341
diff changeset
592 return TRUE;
22d04968449a Don't crash if another search is started while we're still building the
Timo Sirainen <tss@iki.fi>
parents: 5341
diff changeset
593 }
22d04968449a Don't crash if another search is started while we're still building the
Timo Sirainen <tss@iki.fi>
parents: 5341
diff changeset
594
4609
48a16f1254b5 Added full text search plugin framework. Still missing support for handling
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
595 static struct mail_search_context *
48a16f1254b5 Added full text search plugin framework. Still missing support for handling
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
596 fts_mailbox_search_init(struct mailbox_transaction_context *t,
7642
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7619
diff changeset
597 struct mail_search_args *args,
4609
48a16f1254b5 Added full text search plugin framework. Still missing support for handling
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
598 const enum mail_sort_type *sort_program)
48a16f1254b5 Added full text search plugin framework. Still missing support for handling
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
599 {
8006
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7990
diff changeset
600 struct fts_transaction_context *ft = FTS_CONTEXT(t);
4609
48a16f1254b5 Added full text search plugin framework. Still missing support for handling
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
601 struct fts_mailbox *fbox = FTS_CONTEXT(t->box);
48a16f1254b5 Added full text search plugin framework. Still missing support for handling
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
602 struct mail_search_context *ctx;
48a16f1254b5 Added full text search plugin framework. Still missing support for handling
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
603 struct fts_search_context *fctx;
48a16f1254b5 Added full text search plugin framework. Still missing support for handling
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
604
7642
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7619
diff changeset
605 ctx = fbox->module_ctx.super.search_init(t, args, sort_program);
4609
48a16f1254b5 Added full text search plugin framework. Still missing support for handling
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
606
48a16f1254b5 Added full text search plugin framework. Still missing support for handling
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
607 fctx = i_new(struct fts_search_context, 1);
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
608 fctx->fbox = fbox;
5405
22d04968449a Don't crash if another search is started while we're still building the
Timo Sirainen <tss@iki.fi>
parents: 5341
diff changeset
609 fctx->t = t;
4946
460d589403d0 Make indexing non-blocking. Optimize also header searches.
Timo Sirainen <tss@iki.fi>
parents: 4942
diff changeset
610 fctx->args = args;
8495
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
611 fctx->first_nonindexed_seq = (uint32_t)-1;
5450
7a6db5ec047d Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents: 5413
diff changeset
612 MODULE_CONTEXT_SET(ctx, fts_storage_module, fctx);
4609
48a16f1254b5 Added full text search plugin framework. Still missing support for handling
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
613
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
614 if (fbox->backend_substr == NULL && fbox->backend_fast == NULL)
4882
969cf7a88c25 Delay calling fts_backend_init() until first transaction is created. By that
Timo Sirainen <tss@iki.fi>
parents: 4877
diff changeset
615 return ctx;
969cf7a88c25 Delay calling fts_backend_init() until first transaction is created. By that
Timo Sirainen <tss@iki.fi>
parents: 4877
diff changeset
616
8006
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7990
diff changeset
617 ft->score_map = &fctx->score_map;
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7990
diff changeset
618
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
619 fts_search_analyze(fctx);
8507
f323bf2465bd Give more correct "* OK searched n%" notifications with fts and virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8500
diff changeset
620 (void)fts_try_build_init(ctx, fctx);
4946
460d589403d0 Make indexing non-blocking. Optimize also header searches.
Timo Sirainen <tss@iki.fi>
parents: 4942
diff changeset
621 return ctx;
460d589403d0 Make indexing non-blocking. Optimize also header searches.
Timo Sirainen <tss@iki.fi>
parents: 4942
diff changeset
622 }
4942
b382b21409b5 Added support for X-BODY-FAST and X-TEXT-FAST SEARCH arguments. FTS plugin
Timo Sirainen <tss@iki.fi>
parents: 4884
diff changeset
623
4946
460d589403d0 Make indexing non-blocking. Optimize also header searches.
Timo Sirainen <tss@iki.fi>
parents: 4942
diff changeset
624 static int fts_mailbox_search_next_nonblock(struct mail_search_context *ctx,
460d589403d0 Make indexing non-blocking. Optimize also header searches.
Timo Sirainen <tss@iki.fi>
parents: 4942
diff changeset
625 struct mail *mail, bool *tryagain_r)
460d589403d0 Make indexing non-blocking. Optimize also header searches.
Timo Sirainen <tss@iki.fi>
parents: 4942
diff changeset
626 {
460d589403d0 Make indexing non-blocking. Optimize also header searches.
Timo Sirainen <tss@iki.fi>
parents: 4942
diff changeset
627 struct fts_mailbox *fbox = FTS_CONTEXT(ctx->transaction->box);
460d589403d0 Make indexing non-blocking. Optimize also header searches.
Timo Sirainen <tss@iki.fi>
parents: 4942
diff changeset
628 struct fts_search_context *fctx = FTS_CONTEXT(ctx);
460d589403d0 Make indexing non-blocking. Optimize also header searches.
Timo Sirainen <tss@iki.fi>
parents: 4942
diff changeset
629 int ret;
4609
48a16f1254b5 Added full text search plugin framework. Still missing support for handling
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
630
5405
22d04968449a Don't crash if another search is started while we're still building the
Timo Sirainen <tss@iki.fi>
parents: 5341
diff changeset
631 if (!fctx->build_initialized) {
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
632 /* we're still waiting for this process (but another command)
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
633 to finish building the indexes */
8507
f323bf2465bd Give more correct "* OK searched n%" notifications with fts and virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8500
diff changeset
634 if (!fts_try_build_init(ctx, fctx)) {
5405
22d04968449a Don't crash if another search is started while we're still building the
Timo Sirainen <tss@iki.fi>
parents: 5341
diff changeset
635 *tryagain_r = TRUE;
22d04968449a Don't crash if another search is started while we're still building the
Timo Sirainen <tss@iki.fi>
parents: 5341
diff changeset
636 return 0;
22d04968449a Don't crash if another search is started while we're still building the
Timo Sirainen <tss@iki.fi>
parents: 5341
diff changeset
637 }
22d04968449a Don't crash if another search is started while we're still building the
Timo Sirainen <tss@iki.fi>
parents: 5341
diff changeset
638 }
22d04968449a Don't crash if another search is started while we're still building the
Timo Sirainen <tss@iki.fi>
parents: 5341
diff changeset
639
8495
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
640 while (fctx->build_ctx != NULL) {
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
641 /* this command is still building the indexes */
4946
460d589403d0 Make indexing non-blocking. Optimize also header searches.
Timo Sirainen <tss@iki.fi>
parents: 4942
diff changeset
642 ret = fts_build_more(fctx->build_ctx);
460d589403d0 Make indexing non-blocking. Optimize also header searches.
Timo Sirainen <tss@iki.fi>
parents: 4942
diff changeset
643 if (ret == 0) {
460d589403d0 Make indexing non-blocking. Optimize also header searches.
Timo Sirainen <tss@iki.fi>
parents: 4942
diff changeset
644 *tryagain_r = TRUE;
460d589403d0 Make indexing non-blocking. Optimize also header searches.
Timo Sirainen <tss@iki.fi>
parents: 4942
diff changeset
645 return 0;
460d589403d0 Make indexing non-blocking. Optimize also header searches.
Timo Sirainen <tss@iki.fi>
parents: 4942
diff changeset
646 }
4942
b382b21409b5 Added support for X-BODY-FAST and X-TEXT-FAST SEARCH arguments. FTS plugin
Timo Sirainen <tss@iki.fi>
parents: 4884
diff changeset
647
4946
460d589403d0 Make indexing non-blocking. Optimize also header searches.
Timo Sirainen <tss@iki.fi>
parents: 4942
diff changeset
648 /* finished / error */
8508
689a63a99363 fts: Hide "Searching .." notify while indexing.
Timo Sirainen <tss@iki.fi>
parents: 8507
diff changeset
649 ctx->progress_hidden = FALSE;
8387
fbd90ad20593 fts: If we haven't indexed all messages, search the rest using non-indexed search.
Timo Sirainen <tss@iki.fi>
parents: 8386
diff changeset
650 if (fts_build_deinit(&fctx->build_ctx) < 0)
fbd90ad20593 fts: If we haven't indexed all messages, search the rest using non-indexed search.
Timo Sirainen <tss@iki.fi>
parents: 8386
diff changeset
651 ret = -1;
fbd90ad20593 fts: If we haven't indexed all messages, search the rest using non-indexed search.
Timo Sirainen <tss@iki.fi>
parents: 8386
diff changeset
652 if (ret > 0) {
8495
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
653 if (fts_build_init_virtual_next(fctx) == 0) {
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
654 /* all finished */
8507
f323bf2465bd Give more correct "* OK searched n%" notifications with fts and virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8500
diff changeset
655 fts_search_init_lookup(ctx, fctx);
8495
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
656 }
8387
fbd90ad20593 fts: If we haven't indexed all messages, search the rest using non-indexed search.
Timo Sirainen <tss@iki.fi>
parents: 8386
diff changeset
657 }
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
658 }
4877
63d3b76e44fe Added lock/unlock backend operations.
Timo Sirainen <tss@iki.fi>
parents: 4854
diff changeset
659
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
660 /* if we're here, the indexes are either built or they're not used */
5450
7a6db5ec047d Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents: 5413
diff changeset
661 return fbox->module_ctx.super.
7a6db5ec047d Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents: 5413
diff changeset
662 search_next_nonblock(ctx, mail, tryagain_r);
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
663 }
4609
48a16f1254b5 Added full text search plugin framework. Still missing support for handling
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
664
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
665 static void
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
666 fts_mailbox_search_args_definite_set(struct fts_search_context *fctx)
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
667 {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
668 struct mail_search_arg *arg;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
669
7642
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7619
diff changeset
670 for (arg = fctx->args->args; arg != NULL; arg = arg->next) {
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
671 switch (arg->type) {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
672 case SEARCH_TEXT:
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
673 case SEARCH_BODY:
8507
f323bf2465bd Give more correct "* OK searched n%" notifications with fts and virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8500
diff changeset
674 if (fctx->fbox->backend_substr == NULL) {
f323bf2465bd Give more correct "* OK searched n%" notifications with fts and virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8500
diff changeset
675 /* we're marking only fast args */
f323bf2465bd Give more correct "* OK searched n%" notifications with fts and virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8500
diff changeset
676 break;
f323bf2465bd Give more correct "* OK searched n%" notifications with fts and virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8500
diff changeset
677 }
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
678 case SEARCH_BODY_FAST:
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
679 case SEARCH_TEXT_FAST:
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
680 arg->result = 1;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
681 break;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
682 default:
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
683 break;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
684 }
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
685 }
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
686 }
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
687
8507
f323bf2465bd Give more correct "* OK searched n%" notifications with fts and virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8500
diff changeset
688 static bool search_nonindexed(struct mail_search_context *ctx)
f323bf2465bd Give more correct "* OK searched n%" notifications with fts and virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8500
diff changeset
689 {
f323bf2465bd Give more correct "* OK searched n%" notifications with fts and virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8500
diff changeset
690 struct fts_search_context *fctx = FTS_CONTEXT(ctx);
f323bf2465bd Give more correct "* OK searched n%" notifications with fts and virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8500
diff changeset
691 struct fts_mailbox *fbox = FTS_CONTEXT(ctx->transaction->box);
f323bf2465bd Give more correct "* OK searched n%" notifications with fts and virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8500
diff changeset
692 struct mailbox_status status;
f323bf2465bd Give more correct "* OK searched n%" notifications with fts and virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8500
diff changeset
693
f323bf2465bd Give more correct "* OK searched n%" notifications with fts and virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8500
diff changeset
694 mailbox_get_status(ctx->transaction->box, STATUS_MESSAGES, &status);
f323bf2465bd Give more correct "* OK searched n%" notifications with fts and virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8500
diff changeset
695
f323bf2465bd Give more correct "* OK searched n%" notifications with fts and virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8500
diff changeset
696 fctx->seqs_set = FALSE;
f323bf2465bd Give more correct "* OK searched n%" notifications with fts and virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8500
diff changeset
697 ctx->seq = fctx->first_nonindexed_seq - 1;
f323bf2465bd Give more correct "* OK searched n%" notifications with fts and virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8500
diff changeset
698 ctx->progress_cur = ctx->seq;
f323bf2465bd Give more correct "* OK searched n%" notifications with fts and virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8500
diff changeset
699 ctx->progress_max = status.messages;
f323bf2465bd Give more correct "* OK searched n%" notifications with fts and virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8500
diff changeset
700 return fbox->module_ctx.super.search_next_update_seq(ctx);
f323bf2465bd Give more correct "* OK searched n%" notifications with fts and virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8500
diff changeset
701 }
f323bf2465bd Give more correct "* OK searched n%" notifications with fts and virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8500
diff changeset
702
8477
c033b3e2d9b6 mail_storage.search_next_update_seq returns now bool. It was never failing.
Timo Sirainen <tss@iki.fi>
parents: 8387
diff changeset
703 static bool fts_mailbox_search_next_update_seq(struct mail_search_context *ctx)
4609
48a16f1254b5 Added full text search plugin framework. Still missing support for handling
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
704 {
48a16f1254b5 Added full text search plugin framework. Still missing support for handling
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
705 struct fts_mailbox *fbox = FTS_CONTEXT(ctx->transaction->box);
48a16f1254b5 Added full text search plugin framework. Still missing support for handling
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
706 struct fts_search_context *fctx = FTS_CONTEXT(ctx);
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
707 struct seq_range *def_range, *maybe_range, *range;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
708 unsigned int def_count, maybe_count;
4618
a1621235f405 API updates and some fixes
Timo Sirainen <tss@iki.fi>
parents: 4610
diff changeset
709 uint32_t wanted_seq;
8477
c033b3e2d9b6 mail_storage.search_next_update_seq returns now bool. It was never failing.
Timo Sirainen <tss@iki.fi>
parents: 8387
diff changeset
710 bool use_maybe, ret;
4609
48a16f1254b5 Added full text search plugin framework. Still missing support for handling
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
711
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
712 if (!fctx->seqs_set)
5450
7a6db5ec047d Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents: 5413
diff changeset
713 return fbox->module_ctx.super.search_next_update_seq(ctx);
4618
a1621235f405 API updates and some fixes
Timo Sirainen <tss@iki.fi>
parents: 4610
diff changeset
714
7377
f435be3e3def If the SEARCH TEXT/BODY command contained more parameters, we could have
Timo Sirainen <tss@iki.fi>
parents: 7243
diff changeset
715 wanted_seq = ctx->seq + 1;
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
716 /* fts_search_lookup() was called successfully */
7377
f435be3e3def If the SEARCH TEXT/BODY command contained more parameters, we could have
Timo Sirainen <tss@iki.fi>
parents: 7243
diff changeset
717 for (;;) {
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
718 def_range = array_get_modifiable(&fctx->definite_seqs,
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
719 &def_count);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
720 maybe_range = array_get_modifiable(&fctx->maybe_seqs,
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
721 &maybe_count);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
722 /* if we're ahead of current positions, skip them */
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
723 while (fctx->definite_idx < def_count &&
7377
f435be3e3def If the SEARCH TEXT/BODY command contained more parameters, we could have
Timo Sirainen <tss@iki.fi>
parents: 7243
diff changeset
724 wanted_seq > def_range[fctx->definite_idx].seq2)
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
725 fctx->definite_idx++;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
726 while (fctx->maybe_idx < maybe_count &&
7377
f435be3e3def If the SEARCH TEXT/BODY command contained more parameters, we could have
Timo Sirainen <tss@iki.fi>
parents: 7243
diff changeset
727 wanted_seq > maybe_range[fctx->maybe_idx].seq2)
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
728 fctx->maybe_idx++;
4609
48a16f1254b5 Added full text search plugin framework. Still missing support for handling
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
729
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
730 /* use whichever is lower of definite/maybe */
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
731 if (fctx->definite_idx == def_count) {
6905
8c779f3e16be Fixes to FTS handling.
Timo Sirainen <tss@iki.fi>
parents: 6901
diff changeset
732 if (fctx->maybe_idx == maybe_count) {
8387
fbd90ad20593 fts: If we haven't indexed all messages, search the rest using non-indexed search.
Timo Sirainen <tss@iki.fi>
parents: 8386
diff changeset
733 /* look for the non-indexed mails */
8495
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
734 if (fctx->first_nonindexed_seq == (uint32_t)-1)
8477
c033b3e2d9b6 mail_storage.search_next_update_seq returns now bool. It was never failing.
Timo Sirainen <tss@iki.fi>
parents: 8387
diff changeset
735 return FALSE;
8507
f323bf2465bd Give more correct "* OK searched n%" notifications with fts and virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8500
diff changeset
736 return search_nonindexed(ctx);
6905
8c779f3e16be Fixes to FTS handling.
Timo Sirainen <tss@iki.fi>
parents: 6901
diff changeset
737 }
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
738 use_maybe = TRUE;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
739 } else if (fctx->maybe_idx == maybe_count) {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
740 use_maybe = FALSE;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
741 } else {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
742 use_maybe = maybe_range[fctx->maybe_idx].seq1 <
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
743 def_range[fctx->definite_idx].seq2;
4609
48a16f1254b5 Added full text search plugin framework. Still missing support for handling
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
744 }
4618
a1621235f405 API updates and some fixes
Timo Sirainen <tss@iki.fi>
parents: 4610
diff changeset
745
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
746 if (use_maybe)
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
747 range = maybe_range + fctx->maybe_idx;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
748 else
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
749 range = def_range + fctx->definite_idx;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
750
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
751 i_assert(range->seq1 <= range->seq2);
7377
f435be3e3def If the SEARCH TEXT/BODY command contained more parameters, we could have
Timo Sirainen <tss@iki.fi>
parents: 7243
diff changeset
752 if (wanted_seq > range->seq1) {
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
753 /* current sequence is already larger than where
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
754 range begins, so use the current sequence. */
7377
f435be3e3def If the SEARCH TEXT/BODY command contained more parameters, we could have
Timo Sirainen <tss@iki.fi>
parents: 7243
diff changeset
755 range->seq1 = wanted_seq+1;
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
756 } else {
7377
f435be3e3def If the SEARCH TEXT/BODY command contained more parameters, we could have
Timo Sirainen <tss@iki.fi>
parents: 7243
diff changeset
757 wanted_seq = range->seq1;
f435be3e3def If the SEARCH TEXT/BODY command contained more parameters, we could have
Timo Sirainen <tss@iki.fi>
parents: 7243
diff changeset
758 range->seq1++;
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
759 }
7377
f435be3e3def If the SEARCH TEXT/BODY command contained more parameters, we could have
Timo Sirainen <tss@iki.fi>
parents: 7243
diff changeset
760 if (range->seq1 > range->seq2)
f435be3e3def If the SEARCH TEXT/BODY command contained more parameters, we could have
Timo Sirainen <tss@iki.fi>
parents: 7243
diff changeset
761 range->seq2 = 0;
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
762
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
763 /* ctx->seq points to previous sequence we want */
7377
f435be3e3def If the SEARCH TEXT/BODY command contained more parameters, we could have
Timo Sirainen <tss@iki.fi>
parents: 7243
diff changeset
764 ctx->seq = wanted_seq - 1;
5450
7a6db5ec047d Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents: 5413
diff changeset
765 ret = fbox->module_ctx.super.search_next_update_seq(ctx);
8477
c033b3e2d9b6 mail_storage.search_next_update_seq returns now bool. It was never failing.
Timo Sirainen <tss@iki.fi>
parents: 8387
diff changeset
766 if (!ret || wanted_seq == ctx->seq)
7377
f435be3e3def If the SEARCH TEXT/BODY command contained more parameters, we could have
Timo Sirainen <tss@iki.fi>
parents: 7243
diff changeset
767 break;
f435be3e3def If the SEARCH TEXT/BODY command contained more parameters, we could have
Timo Sirainen <tss@iki.fi>
parents: 7243
diff changeset
768 wanted_seq = ctx->seq;
7642
077bb84e9e77 Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents: 7619
diff changeset
769 mail_search_args_reset(ctx->args->args, FALSE);
7377
f435be3e3def If the SEARCH TEXT/BODY command contained more parameters, we could have
Timo Sirainen <tss@iki.fi>
parents: 7243
diff changeset
770 }
4618
a1621235f405 API updates and some fixes
Timo Sirainen <tss@iki.fi>
parents: 4610
diff changeset
771
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
772 if (!use_maybe) {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
773 /* we have definite results, update args */
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
774 fts_mailbox_search_args_definite_set(fctx);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
775 }
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
776
8495
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
777 if (ctx->seq + 1 >= fctx->first_nonindexed_seq) {
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
778 /* this is a virtual mailbox and we're searching headers.
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
779 some mailboxes had more messages indexed than others.
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
780 to avoid duplicates or jumping around, ignore the rest of
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
781 the search results and just go through the messages in
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
782 order. */
8507
f323bf2465bd Give more correct "* OK searched n%" notifications with fts and virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8500
diff changeset
783 return search_nonindexed(ctx);
8495
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
784 }
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
785
8507
f323bf2465bd Give more correct "* OK searched n%" notifications with fts and virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8500
diff changeset
786 ctx->progress_cur = fctx->definite_idx + fctx->maybe_idx;
4618
a1621235f405 API updates and some fixes
Timo Sirainen <tss@iki.fi>
parents: 4610
diff changeset
787 return ret;
4609
48a16f1254b5 Added full text search plugin framework. Still missing support for handling
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
788 }
48a16f1254b5 Added full text search plugin framework. Still missing support for handling
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
789
8484
db78eab2ba5d Initial support for getting full text search working nicely with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8477
diff changeset
790 static bool
db78eab2ba5d Initial support for getting full text search working nicely with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8477
diff changeset
791 fts_mailbox_search_next_update_seq_virtual(struct mail_search_context *ctx)
db78eab2ba5d Initial support for getting full text search working nicely with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8477
diff changeset
792 {
db78eab2ba5d Initial support for getting full text search working nicely with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8477
diff changeset
793 struct fts_mailbox *fbox = FTS_CONTEXT(ctx->transaction->box);
db78eab2ba5d Initial support for getting full text search working nicely with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8477
diff changeset
794 struct fts_search_context *fctx = FTS_CONTEXT(ctx);
db78eab2ba5d Initial support for getting full text search working nicely with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8477
diff changeset
795
db78eab2ba5d Initial support for getting full text search working nicely with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8477
diff changeset
796 while (fbox->module_ctx.super.search_next_update_seq(ctx)) {
db78eab2ba5d Initial support for getting full text search working nicely with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8477
diff changeset
797 if (!fctx->seqs_set)
db78eab2ba5d Initial support for getting full text search working nicely with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8477
diff changeset
798 return TRUE;
db78eab2ba5d Initial support for getting full text search working nicely with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8477
diff changeset
799
db78eab2ba5d Initial support for getting full text search working nicely with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8477
diff changeset
800 /* virtual mailbox searches don't return sequences sorted.
db78eab2ba5d Initial support for getting full text search working nicely with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8477
diff changeset
801 just check if the suggested sequence exists. */
db78eab2ba5d Initial support for getting full text search working nicely with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8477
diff changeset
802 if (seq_range_exists(&fctx->definite_seqs, ctx->seq)) {
db78eab2ba5d Initial support for getting full text search working nicely with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8477
diff changeset
803 fts_mailbox_search_args_definite_set(fctx);
db78eab2ba5d Initial support for getting full text search working nicely with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8477
diff changeset
804 return TRUE;
db78eab2ba5d Initial support for getting full text search working nicely with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8477
diff changeset
805 }
db78eab2ba5d Initial support for getting full text search working nicely with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8477
diff changeset
806 if (seq_range_exists(&fctx->maybe_seqs, ctx->seq))
db78eab2ba5d Initial support for getting full text search working nicely with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8477
diff changeset
807 return TRUE;
db78eab2ba5d Initial support for getting full text search working nicely with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8477
diff changeset
808 mail_search_args_reset(ctx->args->args, FALSE);
db78eab2ba5d Initial support for getting full text search working nicely with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8477
diff changeset
809 }
db78eab2ba5d Initial support for getting full text search working nicely with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8477
diff changeset
810 return FALSE;
db78eab2ba5d Initial support for getting full text search working nicely with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8477
diff changeset
811 }
db78eab2ba5d Initial support for getting full text search working nicely with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8477
diff changeset
812
4609
48a16f1254b5 Added full text search plugin framework. Still missing support for handling
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
813 static int fts_mailbox_search_deinit(struct mail_search_context *ctx)
48a16f1254b5 Added full text search plugin framework. Still missing support for handling
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
814 {
8006
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7990
diff changeset
815 struct fts_transaction_context *ft = FTS_CONTEXT(ctx->transaction);
4609
48a16f1254b5 Added full text search plugin framework. Still missing support for handling
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
816 struct fts_mailbox *fbox = FTS_CONTEXT(ctx->transaction->box);
48a16f1254b5 Added full text search plugin framework. Still missing support for handling
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
817 struct fts_search_context *fctx = FTS_CONTEXT(ctx);
48a16f1254b5 Added full text search plugin framework. Still missing support for handling
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
818
8006
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7990
diff changeset
819 if (ft->score_map == &fctx->score_map)
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7990
diff changeset
820 ft->score_map = NULL;
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7990
diff changeset
821
4946
460d589403d0 Make indexing non-blocking. Optimize also header searches.
Timo Sirainen <tss@iki.fi>
parents: 4942
diff changeset
822 if (fctx->build_ctx != NULL) {
460d589403d0 Make indexing non-blocking. Optimize also header searches.
Timo Sirainen <tss@iki.fi>
parents: 4942
diff changeset
823 /* the search was cancelled */
8387
fbd90ad20593 fts: If we haven't indexed all messages, search the rest using non-indexed search.
Timo Sirainen <tss@iki.fi>
parents: 8386
diff changeset
824 (void)fts_build_deinit(&fctx->build_ctx);
4946
460d589403d0 Make indexing non-blocking. Optimize also header searches.
Timo Sirainen <tss@iki.fi>
parents: 4942
diff changeset
825 }
460d589403d0 Make indexing non-blocking. Optimize also header searches.
Timo Sirainen <tss@iki.fi>
parents: 4942
diff changeset
826
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
827 if (array_is_created(&fctx->definite_seqs))
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
828 array_free(&fctx->definite_seqs);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
829 if (array_is_created(&fctx->maybe_seqs))
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
830 array_free(&fctx->maybe_seqs);
8006
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7990
diff changeset
831 if (array_is_created(&fctx->score_map))
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7990
diff changeset
832 array_free(&fctx->score_map);
8495
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
833 if (fctx->virtual_ctx.trans != NULL)
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
834 (void)mailbox_transaction_commit(&fctx->virtual_ctx.trans);
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
835 if (fctx->virtual_ctx.pool != NULL)
ffb37c392166 Finished making full text search indexes work fast with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8484
diff changeset
836 pool_unref(&fctx->virtual_ctx.pool);
4609
48a16f1254b5 Added full text search plugin framework. Still missing support for handling
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
837 i_free(fctx);
5450
7a6db5ec047d Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents: 5413
diff changeset
838 return fbox->module_ctx.super.search_deinit(ctx);
4609
48a16f1254b5 Added full text search plugin framework. Still missing support for handling
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
839 }
48a16f1254b5 Added full text search plugin framework. Still missing support for handling
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
840
6277
5f66277bbe40 mail_index_lookup*() can't fail anymore. Changed several APIs not to return
Timo Sirainen <tss@iki.fi>
parents: 6275
diff changeset
841 static void fts_mail_expunge(struct mail *_mail)
4714
1acce53d423e ADd support for expunges
Timo Sirainen <tss@iki.fi>
parents: 4712
diff changeset
842 {
1acce53d423e ADd support for expunges
Timo Sirainen <tss@iki.fi>
parents: 4712
diff changeset
843 struct mail_private *mail = (struct mail_private *)_mail;
8006
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7990
diff changeset
844 struct fts_mail *fmail = FTS_MAIL_CONTEXT(mail);
4714
1acce53d423e ADd support for expunges
Timo Sirainen <tss@iki.fi>
parents: 4712
diff changeset
845 struct fts_mailbox *fbox = FTS_CONTEXT(_mail->box);
4882
969cf7a88c25 Delay calling fts_backend_init() until first transaction is created. By that
Timo Sirainen <tss@iki.fi>
parents: 4877
diff changeset
846 struct fts_transaction_context *ft = FTS_CONTEXT(_mail->transaction);
4714
1acce53d423e ADd support for expunges
Timo Sirainen <tss@iki.fi>
parents: 4712
diff changeset
847
4882
969cf7a88c25 Delay calling fts_backend_init() until first transaction is created. By that
Timo Sirainen <tss@iki.fi>
parents: 4877
diff changeset
848 ft->expunges = TRUE;
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
849 if (fbox->backend_substr != NULL)
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
850 fts_backend_expunge(fbox->backend_substr, _mail);
4942
b382b21409b5 Added support for X-BODY-FAST and X-TEXT-FAST SEARCH arguments. FTS plugin
Timo Sirainen <tss@iki.fi>
parents: 4884
diff changeset
851 if (fbox->backend_fast != NULL)
b382b21409b5 Added support for X-BODY-FAST and X-TEXT-FAST SEARCH arguments. FTS plugin
Timo Sirainen <tss@iki.fi>
parents: 4884
diff changeset
852 fts_backend_expunge(fbox->backend_fast, _mail);
6277
5f66277bbe40 mail_index_lookup*() can't fail anymore. Changed several APIs not to return
Timo Sirainen <tss@iki.fi>
parents: 6275
diff changeset
853
8006
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7990
diff changeset
854 fmail->module_ctx.super.expunge(_mail);
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7990
diff changeset
855 }
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7990
diff changeset
856
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7990
diff changeset
857 static int fts_score_cmp(const void *key, const void *data)
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7990
diff changeset
858 {
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7990
diff changeset
859 const uint32_t *uid = key;
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7990
diff changeset
860 const struct fts_score_map *score = data;
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7990
diff changeset
861
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7990
diff changeset
862 return *uid < score->uid ? -1 :
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7990
diff changeset
863 (*uid > score->uid ? 1 : 0);
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7990
diff changeset
864 }
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7990
diff changeset
865
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7990
diff changeset
866 static int fts_mail_get_special(struct mail *_mail, enum mail_fetch_field field,
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7990
diff changeset
867 const char **value_r)
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7990
diff changeset
868 {
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7990
diff changeset
869 struct mail_private *mail = (struct mail_private *)_mail;
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7990
diff changeset
870 struct fts_mail *fmail = FTS_MAIL_CONTEXT(mail);
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7990
diff changeset
871 struct fts_transaction_context *ft = FTS_CONTEXT(_mail->transaction);
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7990
diff changeset
872 const struct fts_score_map *scores;
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7990
diff changeset
873 unsigned int count;
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7990
diff changeset
874
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7990
diff changeset
875 if (field != MAIL_FETCH_SEARCH_SCORE || ft->score_map == NULL ||
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7990
diff changeset
876 !array_is_created(ft->score_map))
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7990
diff changeset
877 scores = NULL;
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7990
diff changeset
878 else {
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7990
diff changeset
879 scores = array_get(ft->score_map, &count);
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7990
diff changeset
880 scores = bsearch(&_mail->uid, scores, count, sizeof(*scores),
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7990
diff changeset
881 fts_score_cmp);
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7990
diff changeset
882 }
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7990
diff changeset
883 if (scores != NULL) {
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7990
diff changeset
884 i_assert(scores->uid == _mail->uid);
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7990
diff changeset
885 i_snprintf(fmail->score, sizeof(fmail->score),
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7990
diff changeset
886 "%f", scores->score);
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7990
diff changeset
887 *value_r = fmail->score;
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7990
diff changeset
888 return 0;
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7990
diff changeset
889 }
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7990
diff changeset
890
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7990
diff changeset
891 return fmail->module_ctx.super.get_special(_mail, field, value_r);
4714
1acce53d423e ADd support for expunges
Timo Sirainen <tss@iki.fi>
parents: 4712
diff changeset
892 }
1acce53d423e ADd support for expunges
Timo Sirainen <tss@iki.fi>
parents: 4712
diff changeset
893
1acce53d423e ADd support for expunges
Timo Sirainen <tss@iki.fi>
parents: 4712
diff changeset
894 static struct mail *
1acce53d423e ADd support for expunges
Timo Sirainen <tss@iki.fi>
parents: 4712
diff changeset
895 fts_mail_alloc(struct mailbox_transaction_context *t,
1acce53d423e ADd support for expunges
Timo Sirainen <tss@iki.fi>
parents: 4712
diff changeset
896 enum mail_fetch_field wanted_fields,
1acce53d423e ADd support for expunges
Timo Sirainen <tss@iki.fi>
parents: 4712
diff changeset
897 struct mailbox_header_lookup_ctx *wanted_headers)
1acce53d423e ADd support for expunges
Timo Sirainen <tss@iki.fi>
parents: 4712
diff changeset
898 {
1acce53d423e ADd support for expunges
Timo Sirainen <tss@iki.fi>
parents: 4712
diff changeset
899 struct fts_mailbox *fbox = FTS_CONTEXT(t->box);
8006
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7990
diff changeset
900 struct fts_mail *fmail;
4714
1acce53d423e ADd support for expunges
Timo Sirainen <tss@iki.fi>
parents: 4712
diff changeset
901 struct mail *_mail;
1acce53d423e ADd support for expunges
Timo Sirainen <tss@iki.fi>
parents: 4712
diff changeset
902 struct mail_private *mail;
1acce53d423e ADd support for expunges
Timo Sirainen <tss@iki.fi>
parents: 4712
diff changeset
903
5450
7a6db5ec047d Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents: 5413
diff changeset
904 _mail = fbox->module_ctx.super.
7a6db5ec047d Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents: 5413
diff changeset
905 mail_alloc(t, wanted_fields, wanted_headers);
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
906 if (fbox->backend_substr != NULL || fbox->backend_fast != NULL) {
4882
969cf7a88c25 Delay calling fts_backend_init() until first transaction is created. By that
Timo Sirainen <tss@iki.fi>
parents: 4877
diff changeset
907 mail = (struct mail_private *)_mail;
4854
09b9b1e8f73d Added fts_backend_expunge_finish() virtual backend function.
Timo Sirainen <tss@iki.fi>
parents: 4714
diff changeset
908
8006
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7990
diff changeset
909 fmail = p_new(mail->pool, struct fts_mail, 1);
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7990
diff changeset
910 fmail->module_ctx.super = mail->v;
4714
1acce53d423e ADd support for expunges
Timo Sirainen <tss@iki.fi>
parents: 4712
diff changeset
911
4882
969cf7a88c25 Delay calling fts_backend_init() until first transaction is created. By that
Timo Sirainen <tss@iki.fi>
parents: 4877
diff changeset
912 mail->v.expunge = fts_mail_expunge;
8006
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7990
diff changeset
913 mail->v.get_special = fts_mail_get_special;
0a3b5ddb0869 Added support for sorting by X-SCORE. Currently it's only set by fts-solr.
Timo Sirainen <tss@iki.fi>
parents: 7990
diff changeset
914 MODULE_CONTEXT_SET(mail, fts_mail_module, fmail);
4882
969cf7a88c25 Delay calling fts_backend_init() until first transaction is created. By that
Timo Sirainen <tss@iki.fi>
parents: 4877
diff changeset
915 }
4714
1acce53d423e ADd support for expunges
Timo Sirainen <tss@iki.fi>
parents: 4712
diff changeset
916 return _mail;
1acce53d423e ADd support for expunges
Timo Sirainen <tss@iki.fi>
parents: 4712
diff changeset
917 }
1acce53d423e ADd support for expunges
Timo Sirainen <tss@iki.fi>
parents: 4712
diff changeset
918
4942
b382b21409b5 Added support for X-BODY-FAST and X-TEXT-FAST SEARCH arguments. FTS plugin
Timo Sirainen <tss@iki.fi>
parents: 4884
diff changeset
919 static void fts_box_backends_init(struct mailbox *box)
b382b21409b5 Added support for X-BODY-FAST and X-TEXT-FAST SEARCH arguments. FTS plugin
Timo Sirainen <tss@iki.fi>
parents: 4884
diff changeset
920 {
b382b21409b5 Added support for X-BODY-FAST and X-TEXT-FAST SEARCH arguments. FTS plugin
Timo Sirainen <tss@iki.fi>
parents: 4884
diff changeset
921 struct fts_mailbox *fbox = FTS_CONTEXT(box);
b382b21409b5 Added support for X-BODY-FAST and X-TEXT-FAST SEARCH arguments. FTS plugin
Timo Sirainen <tss@iki.fi>
parents: 4884
diff changeset
922 struct fts_backend *backend;
b382b21409b5 Added support for X-BODY-FAST and X-TEXT-FAST SEARCH arguments. FTS plugin
Timo Sirainen <tss@iki.fi>
parents: 4884
diff changeset
923 const char *const *tmp;
b382b21409b5 Added support for X-BODY-FAST and X-TEXT-FAST SEARCH arguments. FTS plugin
Timo Sirainen <tss@iki.fi>
parents: 4884
diff changeset
924
b382b21409b5 Added support for X-BODY-FAST and X-TEXT-FAST SEARCH arguments. FTS plugin
Timo Sirainen <tss@iki.fi>
parents: 4884
diff changeset
925 for (tmp = t_strsplit(fbox->env, ", "); *tmp != NULL; tmp++) {
b382b21409b5 Added support for X-BODY-FAST and X-TEXT-FAST SEARCH arguments. FTS plugin
Timo Sirainen <tss@iki.fi>
parents: 4884
diff changeset
926 backend = fts_backend_init(*tmp, box);
b382b21409b5 Added support for X-BODY-FAST and X-TEXT-FAST SEARCH arguments. FTS plugin
Timo Sirainen <tss@iki.fi>
parents: 4884
diff changeset
927 if (backend == NULL)
b382b21409b5 Added support for X-BODY-FAST and X-TEXT-FAST SEARCH arguments. FTS plugin
Timo Sirainen <tss@iki.fi>
parents: 4884
diff changeset
928 continue;
b382b21409b5 Added support for X-BODY-FAST and X-TEXT-FAST SEARCH arguments. FTS plugin
Timo Sirainen <tss@iki.fi>
parents: 4884
diff changeset
929
b382b21409b5 Added support for X-BODY-FAST and X-TEXT-FAST SEARCH arguments. FTS plugin
Timo Sirainen <tss@iki.fi>
parents: 4884
diff changeset
930 if ((backend->flags &
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
931 FTS_BACKEND_FLAG_SUBSTRING_LOOKUPS) != 0) {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
932 if (fbox->backend_substr != NULL) {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
933 i_fatal("fts: duplicate substring backend: %s",
4942
b382b21409b5 Added support for X-BODY-FAST and X-TEXT-FAST SEARCH arguments. FTS plugin
Timo Sirainen <tss@iki.fi>
parents: 4884
diff changeset
934 *tmp);
b382b21409b5 Added support for X-BODY-FAST and X-TEXT-FAST SEARCH arguments. FTS plugin
Timo Sirainen <tss@iki.fi>
parents: 4884
diff changeset
935 }
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
936 fbox->backend_substr = backend;
4942
b382b21409b5 Added support for X-BODY-FAST and X-TEXT-FAST SEARCH arguments. FTS plugin
Timo Sirainen <tss@iki.fi>
parents: 4884
diff changeset
937 } else {
b382b21409b5 Added support for X-BODY-FAST and X-TEXT-FAST SEARCH arguments. FTS plugin
Timo Sirainen <tss@iki.fi>
parents: 4884
diff changeset
938 if (fbox->backend_fast != NULL) {
b382b21409b5 Added support for X-BODY-FAST and X-TEXT-FAST SEARCH arguments. FTS plugin
Timo Sirainen <tss@iki.fi>
parents: 4884
diff changeset
939 i_fatal("fts: duplicate fast backend: %s",
b382b21409b5 Added support for X-BODY-FAST and X-TEXT-FAST SEARCH arguments. FTS plugin
Timo Sirainen <tss@iki.fi>
parents: 4884
diff changeset
940 *tmp);
b382b21409b5 Added support for X-BODY-FAST and X-TEXT-FAST SEARCH arguments. FTS plugin
Timo Sirainen <tss@iki.fi>
parents: 4884
diff changeset
941 }
b382b21409b5 Added support for X-BODY-FAST and X-TEXT-FAST SEARCH arguments. FTS plugin
Timo Sirainen <tss@iki.fi>
parents: 4884
diff changeset
942 fbox->backend_fast = backend;
b382b21409b5 Added support for X-BODY-FAST and X-TEXT-FAST SEARCH arguments. FTS plugin
Timo Sirainen <tss@iki.fi>
parents: 4884
diff changeset
943 }
b382b21409b5 Added support for X-BODY-FAST and X-TEXT-FAST SEARCH arguments. FTS plugin
Timo Sirainen <tss@iki.fi>
parents: 4884
diff changeset
944 }
8330
16a99d3a34dd FTS: If mail_debug=yes, log messages if fts is disabled.
Timo Sirainen <tss@iki.fi>
parents: 8006
diff changeset
945 if ((box->storage->flags & MAIL_STORAGE_FLAG_DEBUG) != 0 &&
16a99d3a34dd FTS: If mail_debug=yes, log messages if fts is disabled.
Timo Sirainen <tss@iki.fi>
parents: 8006
diff changeset
946 fbox->backend_substr == NULL && fbox->backend_fast == NULL)
16a99d3a34dd FTS: If mail_debug=yes, log messages if fts is disabled.
Timo Sirainen <tss@iki.fi>
parents: 8006
diff changeset
947 i_info("fts: No backends enabled by the fts setting");
4942
b382b21409b5 Added support for X-BODY-FAST and X-TEXT-FAST SEARCH arguments. FTS plugin
Timo Sirainen <tss@iki.fi>
parents: 4884
diff changeset
948 }
b382b21409b5 Added support for X-BODY-FAST and X-TEXT-FAST SEARCH arguments. FTS plugin
Timo Sirainen <tss@iki.fi>
parents: 4884
diff changeset
949
4854
09b9b1e8f73d Added fts_backend_expunge_finish() virtual backend function.
Timo Sirainen <tss@iki.fi>
parents: 4714
diff changeset
950 static struct mailbox_transaction_context *
09b9b1e8f73d Added fts_backend_expunge_finish() virtual backend function.
Timo Sirainen <tss@iki.fi>
parents: 4714
diff changeset
951 fts_transaction_begin(struct mailbox *box,
09b9b1e8f73d Added fts_backend_expunge_finish() virtual backend function.
Timo Sirainen <tss@iki.fi>
parents: 4714
diff changeset
952 enum mailbox_transaction_flags flags)
09b9b1e8f73d Added fts_backend_expunge_finish() virtual backend function.
Timo Sirainen <tss@iki.fi>
parents: 4714
diff changeset
953 {
09b9b1e8f73d Added fts_backend_expunge_finish() virtual backend function.
Timo Sirainen <tss@iki.fi>
parents: 4714
diff changeset
954 struct fts_mailbox *fbox = FTS_CONTEXT(box);
09b9b1e8f73d Added fts_backend_expunge_finish() virtual backend function.
Timo Sirainen <tss@iki.fi>
parents: 4714
diff changeset
955 struct mailbox_transaction_context *t;
09b9b1e8f73d Added fts_backend_expunge_finish() virtual backend function.
Timo Sirainen <tss@iki.fi>
parents: 4714
diff changeset
956 struct fts_transaction_context *ft;
09b9b1e8f73d Added fts_backend_expunge_finish() virtual backend function.
Timo Sirainen <tss@iki.fi>
parents: 4714
diff changeset
957
09b9b1e8f73d Added fts_backend_expunge_finish() virtual backend function.
Timo Sirainen <tss@iki.fi>
parents: 4714
diff changeset
958 ft = i_new(struct fts_transaction_context, 1);
09b9b1e8f73d Added fts_backend_expunge_finish() virtual backend function.
Timo Sirainen <tss@iki.fi>
parents: 4714
diff changeset
959
4882
969cf7a88c25 Delay calling fts_backend_init() until first transaction is created. By that
Timo Sirainen <tss@iki.fi>
parents: 4877
diff changeset
960 /* the backend creation is delayed until the first transaction is
969cf7a88c25 Delay calling fts_backend_init() until first transaction is created. By that
Timo Sirainen <tss@iki.fi>
parents: 4877
diff changeset
961 started. at that point the mailbox has been synced at least once. */
4942
b382b21409b5 Added support for X-BODY-FAST and X-TEXT-FAST SEARCH arguments. FTS plugin
Timo Sirainen <tss@iki.fi>
parents: 4884
diff changeset
962 if (!fbox->backend_set) {
b382b21409b5 Added support for X-BODY-FAST and X-TEXT-FAST SEARCH arguments. FTS plugin
Timo Sirainen <tss@iki.fi>
parents: 4884
diff changeset
963 fts_box_backends_init(box);
b382b21409b5 Added support for X-BODY-FAST and X-TEXT-FAST SEARCH arguments. FTS plugin
Timo Sirainen <tss@iki.fi>
parents: 4884
diff changeset
964 fbox->backend_set = TRUE;
4882
969cf7a88c25 Delay calling fts_backend_init() until first transaction is created. By that
Timo Sirainen <tss@iki.fi>
parents: 4877
diff changeset
965 }
969cf7a88c25 Delay calling fts_backend_init() until first transaction is created. By that
Timo Sirainen <tss@iki.fi>
parents: 4877
diff changeset
966
5450
7a6db5ec047d Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents: 5413
diff changeset
967 t = fbox->module_ctx.super.transaction_begin(box, flags);
7a6db5ec047d Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents: 5413
diff changeset
968 MODULE_CONTEXT_SET(t, fts_storage_module, ft);
4854
09b9b1e8f73d Added fts_backend_expunge_finish() virtual backend function.
Timo Sirainen <tss@iki.fi>
parents: 4714
diff changeset
969 return t;
09b9b1e8f73d Added fts_backend_expunge_finish() virtual backend function.
Timo Sirainen <tss@iki.fi>
parents: 4714
diff changeset
970 }
09b9b1e8f73d Added fts_backend_expunge_finish() virtual backend function.
Timo Sirainen <tss@iki.fi>
parents: 4714
diff changeset
971
4942
b382b21409b5 Added support for X-BODY-FAST and X-TEXT-FAST SEARCH arguments. FTS plugin
Timo Sirainen <tss@iki.fi>
parents: 4884
diff changeset
972 static void
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
973 fts_storage_build_context_deinit(struct fts_storage_build_context *build_ctx)
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
974 {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
975 (void)fts_backend_build_deinit(&build_ctx->build);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
976 str_free(&build_ctx->headers);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
977 i_free(build_ctx);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
978 }
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
979
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
980 static void
4942
b382b21409b5 Added support for X-BODY-FAST and X-TEXT-FAST SEARCH arguments. FTS plugin
Timo Sirainen <tss@iki.fi>
parents: 4884
diff changeset
981 fts_transaction_finish(struct mailbox *box, struct fts_transaction_context *ft,
b382b21409b5 Added support for X-BODY-FAST and X-TEXT-FAST SEARCH arguments. FTS plugin
Timo Sirainen <tss@iki.fi>
parents: 4884
diff changeset
982 bool committed)
b382b21409b5 Added support for X-BODY-FAST and X-TEXT-FAST SEARCH arguments. FTS plugin
Timo Sirainen <tss@iki.fi>
parents: 4884
diff changeset
983 {
b382b21409b5 Added support for X-BODY-FAST and X-TEXT-FAST SEARCH arguments. FTS plugin
Timo Sirainen <tss@iki.fi>
parents: 4884
diff changeset
984 struct fts_mailbox *fbox = FTS_CONTEXT(box);
b382b21409b5 Added support for X-BODY-FAST and X-TEXT-FAST SEARCH arguments. FTS plugin
Timo Sirainen <tss@iki.fi>
parents: 4884
diff changeset
985
b382b21409b5 Added support for X-BODY-FAST and X-TEXT-FAST SEARCH arguments. FTS plugin
Timo Sirainen <tss@iki.fi>
parents: 4884
diff changeset
986 if (ft->expunges) {
b382b21409b5 Added support for X-BODY-FAST and X-TEXT-FAST SEARCH arguments. FTS plugin
Timo Sirainen <tss@iki.fi>
parents: 4884
diff changeset
987 if (fbox->backend_fast != NULL) {
b382b21409b5 Added support for X-BODY-FAST and X-TEXT-FAST SEARCH arguments. FTS plugin
Timo Sirainen <tss@iki.fi>
parents: 4884
diff changeset
988 fts_backend_expunge_finish(fbox->backend_fast,
b382b21409b5 Added support for X-BODY-FAST and X-TEXT-FAST SEARCH arguments. FTS plugin
Timo Sirainen <tss@iki.fi>
parents: 4884
diff changeset
989 box, committed);
b382b21409b5 Added support for X-BODY-FAST and X-TEXT-FAST SEARCH arguments. FTS plugin
Timo Sirainen <tss@iki.fi>
parents: 4884
diff changeset
990 }
b382b21409b5 Added support for X-BODY-FAST and X-TEXT-FAST SEARCH arguments. FTS plugin
Timo Sirainen <tss@iki.fi>
parents: 4884
diff changeset
991 }
b382b21409b5 Added support for X-BODY-FAST and X-TEXT-FAST SEARCH arguments. FTS plugin
Timo Sirainen <tss@iki.fi>
parents: 4884
diff changeset
992 i_free(ft);
b382b21409b5 Added support for X-BODY-FAST and X-TEXT-FAST SEARCH arguments. FTS plugin
Timo Sirainen <tss@iki.fi>
parents: 4884
diff changeset
993 }
b382b21409b5 Added support for X-BODY-FAST and X-TEXT-FAST SEARCH arguments. FTS plugin
Timo Sirainen <tss@iki.fi>
parents: 4884
diff changeset
994
4854
09b9b1e8f73d Added fts_backend_expunge_finish() virtual backend function.
Timo Sirainen <tss@iki.fi>
parents: 4714
diff changeset
995 static void fts_transaction_rollback(struct mailbox_transaction_context *t)
09b9b1e8f73d Added fts_backend_expunge_finish() virtual backend function.
Timo Sirainen <tss@iki.fi>
parents: 4714
diff changeset
996 {
09b9b1e8f73d Added fts_backend_expunge_finish() virtual backend function.
Timo Sirainen <tss@iki.fi>
parents: 4714
diff changeset
997 struct mailbox *box = t->box;
09b9b1e8f73d Added fts_backend_expunge_finish() virtual backend function.
Timo Sirainen <tss@iki.fi>
parents: 4714
diff changeset
998 struct fts_mailbox *fbox = FTS_CONTEXT(box);
09b9b1e8f73d Added fts_backend_expunge_finish() virtual backend function.
Timo Sirainen <tss@iki.fi>
parents: 4714
diff changeset
999 struct fts_transaction_context *ft = FTS_CONTEXT(t);
09b9b1e8f73d Added fts_backend_expunge_finish() virtual backend function.
Timo Sirainen <tss@iki.fi>
parents: 4714
diff changeset
1000
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
1001 if (ft->build_ctx != NULL) {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
1002 fts_storage_build_context_deinit(ft->build_ctx);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
1003 ft->build_ctx = NULL;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
1004 }
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
1005 if (ft->free_mail)
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
1006 mail_free(&ft->mail);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
1007
5450
7a6db5ec047d Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents: 5413
diff changeset
1008 fbox->module_ctx.super.transaction_rollback(t);
4942
b382b21409b5 Added support for X-BODY-FAST and X-TEXT-FAST SEARCH arguments. FTS plugin
Timo Sirainen <tss@iki.fi>
parents: 4884
diff changeset
1009 fts_transaction_finish(box, ft, FALSE);
4854
09b9b1e8f73d Added fts_backend_expunge_finish() virtual backend function.
Timo Sirainen <tss@iki.fi>
parents: 4714
diff changeset
1010 }
09b9b1e8f73d Added fts_backend_expunge_finish() virtual backend function.
Timo Sirainen <tss@iki.fi>
parents: 4714
diff changeset
1011
09b9b1e8f73d Added fts_backend_expunge_finish() virtual backend function.
Timo Sirainen <tss@iki.fi>
parents: 4714
diff changeset
1012 static int fts_transaction_commit(struct mailbox_transaction_context *t,
6273
df5c0e75c815 Reverted last change and now the real compile fix..
Timo Sirainen <tss@iki.fi>
parents: 6271
diff changeset
1013 uint32_t *uid_validity_r,
5572
896845fbc4ed Added mailbox_transaction_commit_get_uids() which returns the UID range for
Timo Sirainen <tss@iki.fi>
parents: 5522
diff changeset
1014 uint32_t *first_saved_uid_r,
896845fbc4ed Added mailbox_transaction_commit_get_uids() which returns the UID range for
Timo Sirainen <tss@iki.fi>
parents: 5522
diff changeset
1015 uint32_t *last_saved_uid_r)
4854
09b9b1e8f73d Added fts_backend_expunge_finish() virtual backend function.
Timo Sirainen <tss@iki.fi>
parents: 4714
diff changeset
1016 {
09b9b1e8f73d Added fts_backend_expunge_finish() virtual backend function.
Timo Sirainen <tss@iki.fi>
parents: 4714
diff changeset
1017 struct mailbox *box = t->box;
09b9b1e8f73d Added fts_backend_expunge_finish() virtual backend function.
Timo Sirainen <tss@iki.fi>
parents: 4714
diff changeset
1018 struct fts_mailbox *fbox = FTS_CONTEXT(box);
09b9b1e8f73d Added fts_backend_expunge_finish() virtual backend function.
Timo Sirainen <tss@iki.fi>
parents: 4714
diff changeset
1019 struct fts_transaction_context *ft = FTS_CONTEXT(t);
09b9b1e8f73d Added fts_backend_expunge_finish() virtual backend function.
Timo Sirainen <tss@iki.fi>
parents: 4714
diff changeset
1020 int ret;
09b9b1e8f73d Added fts_backend_expunge_finish() virtual backend function.
Timo Sirainen <tss@iki.fi>
parents: 4714
diff changeset
1021
6898
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
1022 if (ft->build_ctx != NULL) {
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
1023 fts_storage_build_context_deinit(ft->build_ctx);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
1024 ft->build_ctx = NULL;
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
1025 }
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
1026 if (ft->free_mail)
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
1027 mail_free(&ft->mail);
e739cffd05ef FTS API changes and Squat rewrite. Squat is still missing expunge handling.
Timo Sirainen <tss@iki.fi>
parents: 6759
diff changeset
1028
6512
1a3604c8ee05 mailbox_transaction_commit*() doesn't sync the mailbox anymore, so it
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
1029 ret = fbox->module_ctx.super.transaction_commit(t,
6273
df5c0e75c815 Reverted last change and now the real compile fix..
Timo Sirainen <tss@iki.fi>
parents: 6271
diff changeset
1030 uid_validity_r,
5572
896845fbc4ed Added mailbox_transaction_commit_get_uids() which returns the UID range for
Timo Sirainen <tss@iki.fi>
parents: 5522
diff changeset
1031 first_saved_uid_r,
896845fbc4ed Added mailbox_transaction_commit_get_uids() which returns the UID range for
Timo Sirainen <tss@iki.fi>
parents: 5522
diff changeset
1032 last_saved_uid_r);
4942
b382b21409b5 Added support for X-BODY-FAST and X-TEXT-FAST SEARCH arguments. FTS plugin
Timo Sirainen <tss@iki.fi>
parents: 4884
diff changeset
1033 fts_transaction_finish(box, ft, ret == 0);
4854
09b9b1e8f73d Added fts_backend_expunge_finish() virtual backend function.
Timo Sirainen <tss@iki.fi>
parents: 4714
diff changeset
1034 return ret;
09b9b1e8f73d Added fts_backend_expunge_finish() virtual backend function.
Timo Sirainen <tss@iki.fi>
parents: 4714
diff changeset
1035 }
09b9b1e8f73d Added fts_backend_expunge_finish() virtual backend function.
Timo Sirainen <tss@iki.fi>
parents: 4714
diff changeset
1036
7462
068f6eefc62b next_hook should be called after our hook is finished with its doings, that
Timo Sirainen <tss@iki.fi>
parents: 7377
diff changeset
1037 static void fts_mailbox_init(struct mailbox *box, const char *env)
4609
48a16f1254b5 Added full text search plugin framework. Still missing support for handling
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1038 {
48a16f1254b5 Added full text search plugin framework. Still missing support for handling
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1039 struct fts_mailbox *fbox;
48a16f1254b5 Added full text search plugin framework. Still missing support for handling
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1040
48a16f1254b5 Added full text search plugin framework. Still missing support for handling
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1041 fbox = i_new(struct fts_mailbox, 1);
8484
db78eab2ba5d Initial support for getting full text search working nicely with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8477
diff changeset
1042 fbox->virtual = strcmp(box->storage->name, "virtual") == 0;
4882
969cf7a88c25 Delay calling fts_backend_init() until first transaction is created. By that
Timo Sirainen <tss@iki.fi>
parents: 4877
diff changeset
1043 fbox->env = env;
5450
7a6db5ec047d Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents: 5413
diff changeset
1044 fbox->module_ctx.super = box->v;
4609
48a16f1254b5 Added full text search plugin framework. Still missing support for handling
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1045 box->v.close = fts_mailbox_close;
48a16f1254b5 Added full text search plugin framework. Still missing support for handling
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1046 box->v.search_init = fts_mailbox_search_init;
4946
460d589403d0 Make indexing non-blocking. Optimize also header searches.
Timo Sirainen <tss@iki.fi>
parents: 4942
diff changeset
1047 box->v.search_next_nonblock = fts_mailbox_search_next_nonblock;
8484
db78eab2ba5d Initial support for getting full text search working nicely with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8477
diff changeset
1048 box->v.search_next_update_seq = fbox->virtual ?
db78eab2ba5d Initial support for getting full text search working nicely with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8477
diff changeset
1049 fts_mailbox_search_next_update_seq_virtual :
db78eab2ba5d Initial support for getting full text search working nicely with virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents: 8477
diff changeset
1050 fts_mailbox_search_next_update_seq;
4609
48a16f1254b5 Added full text search plugin framework. Still missing support for handling
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1051 box->v.search_deinit = fts_mailbox_search_deinit;
4714
1acce53d423e ADd support for expunges
Timo Sirainen <tss@iki.fi>
parents: 4712
diff changeset
1052 box->v.mail_alloc = fts_mail_alloc;
4854
09b9b1e8f73d Added fts_backend_expunge_finish() virtual backend function.
Timo Sirainen <tss@iki.fi>
parents: 4714
diff changeset
1053 box->v.transaction_begin = fts_transaction_begin;
09b9b1e8f73d Added fts_backend_expunge_finish() virtual backend function.
Timo Sirainen <tss@iki.fi>
parents: 4714
diff changeset
1054 box->v.transaction_rollback = fts_transaction_rollback;
09b9b1e8f73d Added fts_backend_expunge_finish() virtual backend function.
Timo Sirainen <tss@iki.fi>
parents: 4714
diff changeset
1055 box->v.transaction_commit = fts_transaction_commit;
4609
48a16f1254b5 Added full text search plugin framework. Still missing support for handling
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1056
5450
7a6db5ec047d Better type safety to module_contexts arrays. Already fixed some bugs.
Timo Sirainen <tss@iki.fi>
parents: 5413
diff changeset
1057 MODULE_CONTEXT_SET(box, fts_storage_module, fbox);
4609
48a16f1254b5 Added full text search plugin framework. Still missing support for handling
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
1058 }
7462
068f6eefc62b next_hook should be called after our hook is finished with its doings, that
Timo Sirainen <tss@iki.fi>
parents: 7377
diff changeset
1059
068f6eefc62b next_hook should be called after our hook is finished with its doings, that
Timo Sirainen <tss@iki.fi>
parents: 7377
diff changeset
1060 void fts_mailbox_opened(struct mailbox *box)
068f6eefc62b next_hook should be called after our hook is finished with its doings, that
Timo Sirainen <tss@iki.fi>
parents: 7377
diff changeset
1061 {
068f6eefc62b next_hook should be called after our hook is finished with its doings, that
Timo Sirainen <tss@iki.fi>
parents: 7377
diff changeset
1062 const char *env;
068f6eefc62b next_hook should be called after our hook is finished with its doings, that
Timo Sirainen <tss@iki.fi>
parents: 7377
diff changeset
1063
068f6eefc62b next_hook should be called after our hook is finished with its doings, that
Timo Sirainen <tss@iki.fi>
parents: 7377
diff changeset
1064 env = getenv("FTS");
8330
16a99d3a34dd FTS: If mail_debug=yes, log messages if fts is disabled.
Timo Sirainen <tss@iki.fi>
parents: 8006
diff changeset
1065 i_assert(env != NULL);
16a99d3a34dd FTS: If mail_debug=yes, log messages if fts is disabled.
Timo Sirainen <tss@iki.fi>
parents: 8006
diff changeset
1066 fts_mailbox_init(box, env);
7462
068f6eefc62b next_hook should be called after our hook is finished with its doings, that
Timo Sirainen <tss@iki.fi>
parents: 7377
diff changeset
1067
068f6eefc62b next_hook should be called after our hook is finished with its doings, that
Timo Sirainen <tss@iki.fi>
parents: 7377
diff changeset
1068 if (fts_next_hook_mailbox_opened != NULL)
068f6eefc62b next_hook should be called after our hook is finished with its doings, that
Timo Sirainen <tss@iki.fi>
parents: 7377
diff changeset
1069 fts_next_hook_mailbox_opened(box);
068f6eefc62b next_hook should be called after our hook is finished with its doings, that
Timo Sirainen <tss@iki.fi>
parents: 7377
diff changeset
1070 }