Mercurial > dovecot > original-hg > dovecot-1.2
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 |
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 | 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 | 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 | 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 | 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 | 78 { |
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 | 81 |
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 | 84 return -1; |
85 | |
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 | 88 } |
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 | 91 { |
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 | 96 } |
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 | 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 | 511 msecs = timeval_diff_msecs(&ioloop_timeval, |
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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 842 { |
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 | 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 | 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 | 892 } |
893 | |
894 static struct mail * | |
895 fts_mail_alloc(struct mailbox_transaction_context *t, | |
896 enum mail_fetch_field wanted_fields, | |
897 struct mailbox_header_lookup_ctx *wanted_headers) | |
898 { | |
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 | 901 struct mail *_mail; |
902 struct mail_private *mail; | |
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 | 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 | 916 return _mail; |
917 } | |
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 | 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 } |