Mercurial > dovecot > original-hg > dovecot-1.2
annotate src/lib-storage/index/index-search.c @ 8982:947fab5a8992 HEAD
Search: Perform all lookups from cache before attempting any uncached lookups.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Tue, 28 Apr 2009 17:21:14 -0400 |
parents | b9faf4db2a9f |
children | e7bfb3c134f9 |
rev | line source |
---|---|
8590
b9faf4db2a9f
Updated copyright notices to include year 2009.
Timo Sirainen <tss@iki.fi>
parents:
8532
diff
changeset
|
1 /* Copyright (c) 2002-2009 Dovecot authors, see the included COPYING file */ |
0 | 2 |
3 #include "lib.h" | |
4949
a959d4208b54
Moved storage callbacks to struct mail_storage. If searching takes over 10
Timo Sirainen <tss@iki.fi>
parents:
4942
diff
changeset
|
4 #include "ioloop.h" |
4607
71b3570946f8
Moved some search parameters to public struct mail_search_context and added
Timo Sirainen <tss@iki.fi>
parents:
4439
diff
changeset
|
5 #include "array.h" |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
761
diff
changeset
|
6 #include "istream.h" |
7279
ef13dd179331
More fixes to SEARCH BEFORE/ON/SINCE timezone handling.
Timo Sirainen <tss@iki.fi>
parents:
7269
diff
changeset
|
7 #include "utc-offset.h" |
988
8028c4dcf38f
mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents:
962
diff
changeset
|
8 #include "str.h" |
8028c4dcf38f
mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents:
962
diff
changeset
|
9 #include "message-address.h" |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
898
diff
changeset
|
10 #include "message-date.h" |
5525
94bc3fbdecd5
Removed message body/header searchers. They're now combined into one
Timo Sirainen <tss@iki.fi>
parents:
5522
diff
changeset
|
11 #include "message-search.h" |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
1845
diff
changeset
|
12 #include "message-parser.h" |
7620 | 13 #include "mail-index-modseq.h" |
0 | 14 #include "index-storage.h" |
988
8028c4dcf38f
mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents:
962
diff
changeset
|
15 #include "index-mail.h" |
4303
5f03738219a6
Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4259
diff
changeset
|
16 #include "index-sort.h" |
0 | 17 #include "mail-search.h" |
7647
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
7642
diff
changeset
|
18 #include "mailbox-search-result-private.h" |
0 | 19 |
20 #include <stdlib.h> | |
21 #include <ctype.h> | |
22 | |
883
39e0b536e708
Storage can now specify if errors should be sent to user as BAD or NO.
Timo Sirainen <tss@iki.fi>
parents:
881
diff
changeset
|
23 #define TXT_UNKNOWN_CHARSET "[BADCHARSET] Unknown charset" |
608
debb8468514e
SEARCH CHARSET now works properly with message bodies, and in general body
Timo Sirainen <tss@iki.fi>
parents:
569
diff
changeset
|
24 #define TXT_INVALID_SEARCH_KEY "Invalid search key" |
debb8468514e
SEARCH CHARSET now works properly with message bodies, and in general body
Timo Sirainen <tss@iki.fi>
parents:
569
diff
changeset
|
25 |
8509
2eede4287841
Increased search_nonblock() to go through 50 messages at a time.
Timo Sirainen <tss@iki.fi>
parents:
8508
diff
changeset
|
26 #define SEARCH_NONBLOCK_COUNT 50 |
4949
a959d4208b54
Moved storage callbacks to struct mail_storage. If searching takes over 10
Timo Sirainen <tss@iki.fi>
parents:
4942
diff
changeset
|
27 #define SEARCH_NOTIFY_INTERVAL_SECS 10 |
4939
ff2272c228cc
Dovecot is now able to execute multiple commands at the same time.
Timo Sirainen <tss@iki.fi>
parents:
4907
diff
changeset
|
28 |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
1845
diff
changeset
|
29 struct index_search_context { |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
1845
diff
changeset
|
30 struct mail_search_context mail_ctx; |
2224
a816e2d88406
Added mail_index_transaction_get_updated_view() which can be used to access
Timo Sirainen <tss@iki.fi>
parents:
2190
diff
changeset
|
31 struct mail_index_view *view; |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
898
diff
changeset
|
32 struct index_mailbox *ibox; |
988
8028c4dcf38f
mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents:
962
diff
changeset
|
33 |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
1845
diff
changeset
|
34 uint32_t seq1, seq2; |
988
8028c4dcf38f
mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents:
962
diff
changeset
|
35 struct mail *mail; |
3209
923ff19873d4
Major mail-storage API changes. It's now a bit cleaner and much more plugin
Timo Sirainen <tss@iki.fi>
parents:
3039
diff
changeset
|
36 struct index_mail *imail; |
7909
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
37 struct mail_thread_context *thread_ctx; |
988
8028c4dcf38f
mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents:
962
diff
changeset
|
38 |
568
f2aa58c2afd0
SEARCH CHARSET support. Currently we do it through iconv() and only ASCII
Timo Sirainen <tss@iki.fi>
parents:
559
diff
changeset
|
39 const char *error; |
924
4f697dde0fca
THREAD=REFERENCES implementation. Doesn't crash, but I'm not sure how
Timo Sirainen <tss@iki.fi>
parents:
903
diff
changeset
|
40 |
4949
a959d4208b54
Moved storage callbacks to struct mail_storage. If searching takes over 10
Timo Sirainen <tss@iki.fi>
parents:
4942
diff
changeset
|
41 struct timeval search_start_time, last_notify; |
a959d4208b54
Moved storage callbacks to struct mail_storage. If searching takes over 10
Timo Sirainen <tss@iki.fi>
parents:
4942
diff
changeset
|
42 |
3325
38eaa792c405
Don't call index_mail_parse_header() twice when searching headers. Caused
Timo Sirainen <tss@iki.fi>
parents:
3301
diff
changeset
|
43 unsigned int failed:1; |
4303
5f03738219a6
Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4259
diff
changeset
|
44 unsigned int sorted:1; |
4196
6ac0d63b297f
Optimized searching a bit for cases where we can restrict search range by
Timo Sirainen <tss@iki.fi>
parents:
4062
diff
changeset
|
45 unsigned int have_seqsets:1; |
7620 | 46 unsigned int have_index_args:1; |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
898
diff
changeset
|
47 }; |
0 | 48 |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
898
diff
changeset
|
49 struct search_header_context { |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
1845
diff
changeset
|
50 struct index_search_context *index_context; |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
898
diff
changeset
|
51 struct mail_search_arg *args; |
0 | 52 |
1322
97f8c00b8d4c
Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents:
1070
diff
changeset
|
53 struct message_header_line *hdr; |
924
4f697dde0fca
THREAD=REFERENCES implementation. Doesn't crash, but I'm not sure how
Timo Sirainen <tss@iki.fi>
parents:
903
diff
changeset
|
54 |
3325
38eaa792c405
Don't call index_mail_parse_header() twice when searching headers. Caused
Timo Sirainen <tss@iki.fi>
parents:
3301
diff
changeset
|
55 unsigned int parse_headers:1; |
924
4f697dde0fca
THREAD=REFERENCES implementation. Doesn't crash, but I'm not sure how
Timo Sirainen <tss@iki.fi>
parents:
903
diff
changeset
|
56 unsigned int custom_header:1; |
4f697dde0fca
THREAD=REFERENCES implementation. Doesn't crash, but I'm not sure how
Timo Sirainen <tss@iki.fi>
parents:
903
diff
changeset
|
57 unsigned int threading:1; |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
898
diff
changeset
|
58 }; |
0 | 59 |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
898
diff
changeset
|
60 struct search_body_context { |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
1845
diff
changeset
|
61 struct index_search_context *index_ctx; |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
898
diff
changeset
|
62 struct istream *input; |
988
8028c4dcf38f
mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents:
962
diff
changeset
|
63 const struct message_part *part; |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
898
diff
changeset
|
64 }; |
0 | 65 |
5522
5dee807e53cf
Header parser has now flags parameter to tell it how to handle linefeeds.
Timo Sirainen <tss@iki.fi>
parents:
5516
diff
changeset
|
66 static const enum message_header_parser_flags hdr_parser_flags = |
5dee807e53cf
Header parser has now flags parameter to tell it how to handle linefeeds.
Timo Sirainen <tss@iki.fi>
parents:
5516
diff
changeset
|
67 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:
5516
diff
changeset
|
68 |
6275
913b188f4dd4
Removed explicit locking from views and maps. They were already locked all
Timo Sirainen <tss@iki.fi>
parents:
5613
diff
changeset
|
69 static void search_parse_msgset_args(const struct mail_index_header *hdr, |
913b188f4dd4
Removed explicit locking from views and maps. They were already locked all
Timo Sirainen <tss@iki.fi>
parents:
5613
diff
changeset
|
70 struct mail_search_arg *args, |
6485
2eff72b212fe
Simplify search tree by canonicalizing message sets, converting NOT away
Timo Sirainen <tss@iki.fi>
parents:
6457
diff
changeset
|
71 uint32_t *seq1_r, uint32_t *seq2_r); |
4431
2461061327ed
NOT condition wasn't handled correctly in SEARCH.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4303
diff
changeset
|
72 |
6966
7bb6ef75715c
Optimize searching flags and keywords.
Timo Sirainen <tss@iki.fi>
parents:
6965
diff
changeset
|
73 static void search_init_arg(struct mail_search_arg *arg, |
7bb6ef75715c
Optimize searching flags and keywords.
Timo Sirainen <tss@iki.fi>
parents:
6965
diff
changeset
|
74 struct index_search_context *ctx) |
7bb6ef75715c
Optimize searching flags and keywords.
Timo Sirainen <tss@iki.fi>
parents:
6965
diff
changeset
|
75 { |
7bb6ef75715c
Optimize searching flags and keywords.
Timo Sirainen <tss@iki.fi>
parents:
6965
diff
changeset
|
76 switch (arg->type) { |
7bb6ef75715c
Optimize searching flags and keywords.
Timo Sirainen <tss@iki.fi>
parents:
6965
diff
changeset
|
77 case SEARCH_SEQSET: |
7bb6ef75715c
Optimize searching flags and keywords.
Timo Sirainen <tss@iki.fi>
parents:
6965
diff
changeset
|
78 ctx->have_seqsets = TRUE; |
7bb6ef75715c
Optimize searching flags and keywords.
Timo Sirainen <tss@iki.fi>
parents:
6965
diff
changeset
|
79 break; |
7618
6dbd70663adf
Added support for SEARCH_UIDSET.
Timo Sirainen <tss@iki.fi>
parents:
7414
diff
changeset
|
80 case SEARCH_UIDSET: |
7909
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
81 case SEARCH_INTHREAD: |
6966
7bb6ef75715c
Optimize searching flags and keywords.
Timo Sirainen <tss@iki.fi>
parents:
6965
diff
changeset
|
82 case SEARCH_FLAGS: |
7bb6ef75715c
Optimize searching flags and keywords.
Timo Sirainen <tss@iki.fi>
parents:
6965
diff
changeset
|
83 case SEARCH_KEYWORDS: |
7620 | 84 case SEARCH_MODSEQ: |
85 if (arg->type == SEARCH_MODSEQ) | |
86 mail_index_modseq_enable(ctx->ibox->index); | |
87 ctx->have_index_args = TRUE; | |
6966
7bb6ef75715c
Optimize searching flags and keywords.
Timo Sirainen <tss@iki.fi>
parents:
6965
diff
changeset
|
88 break; |
7bb6ef75715c
Optimize searching flags and keywords.
Timo Sirainen <tss@iki.fi>
parents:
6965
diff
changeset
|
89 case SEARCH_ALL: |
7bb6ef75715c
Optimize searching flags and keywords.
Timo Sirainen <tss@iki.fi>
parents:
6965
diff
changeset
|
90 if (!arg->not) |
7bb6ef75715c
Optimize searching flags and keywords.
Timo Sirainen <tss@iki.fi>
parents:
6965
diff
changeset
|
91 arg->match_always = TRUE; |
7bb6ef75715c
Optimize searching flags and keywords.
Timo Sirainen <tss@iki.fi>
parents:
6965
diff
changeset
|
92 break; |
7bb6ef75715c
Optimize searching flags and keywords.
Timo Sirainen <tss@iki.fi>
parents:
6965
diff
changeset
|
93 default: |
7bb6ef75715c
Optimize searching flags and keywords.
Timo Sirainen <tss@iki.fi>
parents:
6965
diff
changeset
|
94 break; |
7bb6ef75715c
Optimize searching flags and keywords.
Timo Sirainen <tss@iki.fi>
parents:
6965
diff
changeset
|
95 } |
7bb6ef75715c
Optimize searching flags and keywords.
Timo Sirainen <tss@iki.fi>
parents:
6965
diff
changeset
|
96 } |
7bb6ef75715c
Optimize searching flags and keywords.
Timo Sirainen <tss@iki.fi>
parents:
6965
diff
changeset
|
97 |
7bb6ef75715c
Optimize searching flags and keywords.
Timo Sirainen <tss@iki.fi>
parents:
6965
diff
changeset
|
98 static void search_seqset_arg(struct mail_search_arg *arg, |
7bb6ef75715c
Optimize searching flags and keywords.
Timo Sirainen <tss@iki.fi>
parents:
6965
diff
changeset
|
99 struct index_search_context *ctx) |
7bb6ef75715c
Optimize searching flags and keywords.
Timo Sirainen <tss@iki.fi>
parents:
6965
diff
changeset
|
100 { |
7bb6ef75715c
Optimize searching flags and keywords.
Timo Sirainen <tss@iki.fi>
parents:
6965
diff
changeset
|
101 if (arg->type == SEARCH_SEQSET) { |
7619
56f55bd35aa5
Moved IMAP messageset handling to lib-imap/ and searching to lib-storage/.
Timo Sirainen <tss@iki.fi>
parents:
7618
diff
changeset
|
102 if (seq_range_exists(&arg->value.seqset, ctx->mail_ctx.seq)) |
6966
7bb6ef75715c
Optimize searching flags and keywords.
Timo Sirainen <tss@iki.fi>
parents:
6965
diff
changeset
|
103 ARG_SET_RESULT(arg, 1); |
7bb6ef75715c
Optimize searching flags and keywords.
Timo Sirainen <tss@iki.fi>
parents:
6965
diff
changeset
|
104 else |
7bb6ef75715c
Optimize searching flags and keywords.
Timo Sirainen <tss@iki.fi>
parents:
6965
diff
changeset
|
105 ARG_SET_RESULT(arg, 0); |
7bb6ef75715c
Optimize searching flags and keywords.
Timo Sirainen <tss@iki.fi>
parents:
6965
diff
changeset
|
106 } |
7bb6ef75715c
Optimize searching flags and keywords.
Timo Sirainen <tss@iki.fi>
parents:
6965
diff
changeset
|
107 } |
7bb6ef75715c
Optimize searching flags and keywords.
Timo Sirainen <tss@iki.fi>
parents:
6965
diff
changeset
|
108 |
7bb6ef75715c
Optimize searching flags and keywords.
Timo Sirainen <tss@iki.fi>
parents:
6965
diff
changeset
|
109 static int search_arg_match_keywords(struct index_search_context *ctx, |
6965
ae369569e7de
SEARCH_KEYWORDS now uses struct mail_keywords instead of a string array.
Timo Sirainen <tss@iki.fi>
parents:
6962
diff
changeset
|
110 struct mail_search_arg *arg) |
ae369569e7de
SEARCH_KEYWORDS now uses struct mail_keywords instead of a string array.
Timo Sirainen <tss@iki.fi>
parents:
6962
diff
changeset
|
111 { |
ae369569e7de
SEARCH_KEYWORDS now uses struct mail_keywords instead of a string array.
Timo Sirainen <tss@iki.fi>
parents:
6962
diff
changeset
|
112 ARRAY_TYPE(keyword_indexes) keyword_indexes_arr; |
ae369569e7de
SEARCH_KEYWORDS now uses struct mail_keywords instead of a string array.
Timo Sirainen <tss@iki.fi>
parents:
6962
diff
changeset
|
113 const struct mail_keywords *search_kws = arg->value.keywords; |
ae369569e7de
SEARCH_KEYWORDS now uses struct mail_keywords instead of a string array.
Timo Sirainen <tss@iki.fi>
parents:
6962
diff
changeset
|
114 const unsigned int *keyword_indexes; |
ae369569e7de
SEARCH_KEYWORDS now uses struct mail_keywords instead of a string array.
Timo Sirainen <tss@iki.fi>
parents:
6962
diff
changeset
|
115 unsigned int i, j, count; |
ae369569e7de
SEARCH_KEYWORDS now uses struct mail_keywords instead of a string array.
Timo Sirainen <tss@iki.fi>
parents:
6962
diff
changeset
|
116 |
ae369569e7de
SEARCH_KEYWORDS now uses struct mail_keywords instead of a string array.
Timo Sirainen <tss@iki.fi>
parents:
6962
diff
changeset
|
117 t_array_init(&keyword_indexes_arr, 128); |
6966
7bb6ef75715c
Optimize searching flags and keywords.
Timo Sirainen <tss@iki.fi>
parents:
6965
diff
changeset
|
118 mail_index_lookup_keywords(ctx->view, ctx->mail_ctx.seq, |
6965
ae369569e7de
SEARCH_KEYWORDS now uses struct mail_keywords instead of a string array.
Timo Sirainen <tss@iki.fi>
parents:
6962
diff
changeset
|
119 &keyword_indexes_arr); |
ae369569e7de
SEARCH_KEYWORDS now uses struct mail_keywords instead of a string array.
Timo Sirainen <tss@iki.fi>
parents:
6962
diff
changeset
|
120 keyword_indexes = array_get(&keyword_indexes_arr, &count); |
ae369569e7de
SEARCH_KEYWORDS now uses struct mail_keywords instead of a string array.
Timo Sirainen <tss@iki.fi>
parents:
6962
diff
changeset
|
121 |
ae369569e7de
SEARCH_KEYWORDS now uses struct mail_keywords instead of a string array.
Timo Sirainen <tss@iki.fi>
parents:
6962
diff
changeset
|
122 /* there probably aren't many keywords, so O(n*m) for now */ |
ae369569e7de
SEARCH_KEYWORDS now uses struct mail_keywords instead of a string array.
Timo Sirainen <tss@iki.fi>
parents:
6962
diff
changeset
|
123 for (i = 0; i < search_kws->count; i++) { |
ae369569e7de
SEARCH_KEYWORDS now uses struct mail_keywords instead of a string array.
Timo Sirainen <tss@iki.fi>
parents:
6962
diff
changeset
|
124 for (j = 0; j < count; j++) { |
ae369569e7de
SEARCH_KEYWORDS now uses struct mail_keywords instead of a string array.
Timo Sirainen <tss@iki.fi>
parents:
6962
diff
changeset
|
125 if (search_kws->idx[i] == keyword_indexes[j]) |
ae369569e7de
SEARCH_KEYWORDS now uses struct mail_keywords instead of a string array.
Timo Sirainen <tss@iki.fi>
parents:
6962
diff
changeset
|
126 break; |
ae369569e7de
SEARCH_KEYWORDS now uses struct mail_keywords instead of a string array.
Timo Sirainen <tss@iki.fi>
parents:
6962
diff
changeset
|
127 } |
ae369569e7de
SEARCH_KEYWORDS now uses struct mail_keywords instead of a string array.
Timo Sirainen <tss@iki.fi>
parents:
6962
diff
changeset
|
128 if (j == count) |
ae369569e7de
SEARCH_KEYWORDS now uses struct mail_keywords instead of a string array.
Timo Sirainen <tss@iki.fi>
parents:
6962
diff
changeset
|
129 return 0; |
ae369569e7de
SEARCH_KEYWORDS now uses struct mail_keywords instead of a string array.
Timo Sirainen <tss@iki.fi>
parents:
6962
diff
changeset
|
130 } |
ae369569e7de
SEARCH_KEYWORDS now uses struct mail_keywords instead of a string array.
Timo Sirainen <tss@iki.fi>
parents:
6962
diff
changeset
|
131 return 1; |
ae369569e7de
SEARCH_KEYWORDS now uses struct mail_keywords instead of a string array.
Timo Sirainen <tss@iki.fi>
parents:
6962
diff
changeset
|
132 } |
ae369569e7de
SEARCH_KEYWORDS now uses struct mail_keywords instead of a string array.
Timo Sirainen <tss@iki.fi>
parents:
6962
diff
changeset
|
133 |
0 | 134 /* Returns >0 = matched, 0 = not matched, -1 = unknown */ |
6966
7bb6ef75715c
Optimize searching flags and keywords.
Timo Sirainen <tss@iki.fi>
parents:
6965
diff
changeset
|
135 static int search_arg_match_index(struct index_search_context *ctx, |
7bb6ef75715c
Optimize searching flags and keywords.
Timo Sirainen <tss@iki.fi>
parents:
6965
diff
changeset
|
136 struct mail_search_arg *arg, |
7bb6ef75715c
Optimize searching flags and keywords.
Timo Sirainen <tss@iki.fi>
parents:
6965
diff
changeset
|
137 const struct mail_index_record *rec) |
0 | 138 { |
6962
659e4a606aae
Replaced SEARCH_<flag> with a generic SEARCH_FLAGS. Use value.size for
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
139 enum mail_flags flags; |
7620 | 140 uint64_t modseq; |
6965
ae369569e7de
SEARCH_KEYWORDS now uses struct mail_keywords instead of a string array.
Timo Sirainen <tss@iki.fi>
parents:
6962
diff
changeset
|
141 int ret; |
1947 | 142 |
6962
659e4a606aae
Replaced SEARCH_<flag> with a generic SEARCH_FLAGS. Use value.size for
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
143 switch (arg->type) { |
7618
6dbd70663adf
Added support for SEARCH_UIDSET.
Timo Sirainen <tss@iki.fi>
parents:
7414
diff
changeset
|
144 case SEARCH_UIDSET: |
7909
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
145 case SEARCH_INTHREAD: |
7619
56f55bd35aa5
Moved IMAP messageset handling to lib-imap/ and searching to lib-storage/.
Timo Sirainen <tss@iki.fi>
parents:
7618
diff
changeset
|
146 return seq_range_exists(&arg->value.seqset, rec->uid); |
6962
659e4a606aae
Replaced SEARCH_<flag> with a generic SEARCH_FLAGS. Use value.size for
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
147 case SEARCH_FLAGS: |
7426
11e7ec83665d
Ignore \Recent flag in indexes when searching them (leftovers from v1.0).
Timo Sirainen <tss@iki.fi>
parents:
7414
diff
changeset
|
148 /* recent flag shouldn't be set, but indexes from v1.0.x |
11e7ec83665d
Ignore \Recent flag in indexes when searching them (leftovers from v1.0).
Timo Sirainen <tss@iki.fi>
parents:
7414
diff
changeset
|
149 may contain it. */ |
11e7ec83665d
Ignore \Recent flag in indexes when searching them (leftovers from v1.0).
Timo Sirainen <tss@iki.fi>
parents:
7414
diff
changeset
|
150 flags = rec->flags & ~MAIL_RECENT; |
6962
659e4a606aae
Replaced SEARCH_<flag> with a generic SEARCH_FLAGS. Use value.size for
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
151 if ((arg->value.flags & MAIL_RECENT) != 0 && |
6966
7bb6ef75715c
Optimize searching flags and keywords.
Timo Sirainen <tss@iki.fi>
parents:
6965
diff
changeset
|
152 index_mailbox_is_recent(ctx->ibox, rec->uid)) |
6962
659e4a606aae
Replaced SEARCH_<flag> with a generic SEARCH_FLAGS. Use value.size for
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
153 flags |= MAIL_RECENT; |
659e4a606aae
Replaced SEARCH_<flag> with a generic SEARCH_FLAGS. Use value.size for
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
154 return (flags & arg->value.flags) == arg->value.flags; |
6965
ae369569e7de
SEARCH_KEYWORDS now uses struct mail_keywords instead of a string array.
Timo Sirainen <tss@iki.fi>
parents:
6962
diff
changeset
|
155 case SEARCH_KEYWORDS: |
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
|
156 T_BEGIN { |
6966
7bb6ef75715c
Optimize searching flags and keywords.
Timo Sirainen <tss@iki.fi>
parents:
6965
diff
changeset
|
157 ret = search_arg_match_keywords(ctx, arg); |
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
|
158 } T_END; |
6965
ae369569e7de
SEARCH_KEYWORDS now uses struct mail_keywords instead of a string array.
Timo Sirainen <tss@iki.fi>
parents:
6962
diff
changeset
|
159 return ret; |
7620 | 160 case SEARCH_MODSEQ: { |
161 if (arg->value.flags != 0) { | |
162 modseq = mail_index_modseq_lookup_flags(ctx->view, | |
163 arg->value.flags, ctx->mail_ctx.seq); | |
164 } else if (arg->value.keywords != NULL) { | |
165 modseq = mail_index_modseq_lookup_keywords(ctx->view, | |
166 arg->value.keywords, ctx->mail_ctx.seq); | |
167 } else { | |
7625 | 168 modseq = mail_index_modseq_lookup(ctx->view, |
7620 | 169 ctx->mail_ctx.seq); |
170 } | |
171 return modseq >= arg->value.modseq->modseq; | |
172 } | |
0 | 173 default: |
174 return -1; | |
175 } | |
176 } | |
177 | |
4907
5b4c9b20eba0
Replaced void *context from a lot of callbacks with the actual context
Timo Sirainen <tss@iki.fi>
parents:
4635
diff
changeset
|
178 static void search_index_arg(struct mail_search_arg *arg, |
5b4c9b20eba0
Replaced void *context from a lot of callbacks with the actual context
Timo Sirainen <tss@iki.fi>
parents:
4635
diff
changeset
|
179 struct index_search_context *ctx) |
4196
6ac0d63b297f
Optimized searching a bit for cases where we can restrict search range by
Timo Sirainen <tss@iki.fi>
parents:
4062
diff
changeset
|
180 { |
6966
7bb6ef75715c
Optimize searching flags and keywords.
Timo Sirainen <tss@iki.fi>
parents:
6965
diff
changeset
|
181 const struct mail_index_record *rec; |
7bb6ef75715c
Optimize searching flags and keywords.
Timo Sirainen <tss@iki.fi>
parents:
6965
diff
changeset
|
182 |
7bb6ef75715c
Optimize searching flags and keywords.
Timo Sirainen <tss@iki.fi>
parents:
6965
diff
changeset
|
183 rec = mail_index_lookup(ctx->view, ctx->mail_ctx.seq); |
7bb6ef75715c
Optimize searching flags and keywords.
Timo Sirainen <tss@iki.fi>
parents:
6965
diff
changeset
|
184 switch (search_arg_match_index(ctx, arg, rec)) { |
0 | 185 case -1: |
186 /* unknown */ | |
187 break; | |
188 case 0: | |
1069
8024a2cdc406
Several search fixes, mostly related to matching multiple conditions.
Timo Sirainen <tss@iki.fi>
parents:
1066
diff
changeset
|
189 ARG_SET_RESULT(arg, 0); |
0 | 190 break; |
191 default: | |
192 ARG_SET_RESULT(arg, 1); | |
193 break; | |
194 } | |
195 } | |
196 | |
525
2cb2e0a3423b
Moved several fields from .imap.index file to .imap.index.data file. Fixed
Timo Sirainen <tss@iki.fi>
parents:
505
diff
changeset
|
197 /* Returns >0 = matched, 0 = not matched, -1 = unknown */ |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
1845
diff
changeset
|
198 static int search_arg_match_cached(struct index_search_context *ctx, |
5599
6789ba80419b
Parse search dates already in IMAP code.
Timo Sirainen <tss@iki.fi>
parents:
5527
diff
changeset
|
199 struct mail_search_arg *arg) |
525
2cb2e0a3423b
Moved several fields from .imap.index file to .imap.index.data file. Fixed
Timo Sirainen <tss@iki.fi>
parents:
505
diff
changeset
|
200 { |
7910
c1bbdc2b262e
FETCH X-MAILBOX and SEARCH X-MAILBOX can be used with virtual mailboxes to
Timo Sirainen <tss@iki.fi>
parents:
7909
diff
changeset
|
201 const char *str; |
7279
ef13dd179331
More fixes to SEARCH BEFORE/ON/SINCE timezone handling.
Timo Sirainen <tss@iki.fi>
parents:
7269
diff
changeset
|
202 struct tm *tm; |
6962
659e4a606aae
Replaced SEARCH_<flag> with a generic SEARCH_FLAGS. Use value.size for
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
203 uoff_t virtual_size; |
5599
6789ba80419b
Parse search dates already in IMAP code.
Timo Sirainen <tss@iki.fi>
parents:
5527
diff
changeset
|
204 time_t date; |
1672
8920600a8cfc
Index cache file rewrite. It's not finished yet and mbox support is
Timo Sirainen <tss@iki.fi>
parents:
1638
diff
changeset
|
205 int timezone_offset; |
525
2cb2e0a3423b
Moved several fields from .imap.index file to .imap.index.data file. Fixed
Timo Sirainen <tss@iki.fi>
parents:
505
diff
changeset
|
206 |
5599
6789ba80419b
Parse search dates already in IMAP code.
Timo Sirainen <tss@iki.fi>
parents:
5527
diff
changeset
|
207 switch (arg->type) { |
525
2cb2e0a3423b
Moved several fields from .imap.index file to .imap.index.data file. Fixed
Timo Sirainen <tss@iki.fi>
parents:
505
diff
changeset
|
208 /* internal dates */ |
2cb2e0a3423b
Moved several fields from .imap.index file to .imap.index.data file. Fixed
Timo Sirainen <tss@iki.fi>
parents:
505
diff
changeset
|
209 case SEARCH_BEFORE: |
2cb2e0a3423b
Moved several fields from .imap.index file to .imap.index.data file. Fixed
Timo Sirainen <tss@iki.fi>
parents:
505
diff
changeset
|
210 case SEARCH_ON: |
2cb2e0a3423b
Moved several fields from .imap.index file to .imap.index.data file. Fixed
Timo Sirainen <tss@iki.fi>
parents:
505
diff
changeset
|
211 case SEARCH_SINCE: |
6280
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6277
diff
changeset
|
212 if (mail_get_received_date(ctx->mail, &date) < 0) |
525
2cb2e0a3423b
Moved several fields from .imap.index file to .imap.index.data file. Fixed
Timo Sirainen <tss@iki.fi>
parents:
505
diff
changeset
|
213 return -1; |
7279
ef13dd179331
More fixes to SEARCH BEFORE/ON/SINCE timezone handling.
Timo Sirainen <tss@iki.fi>
parents:
7269
diff
changeset
|
214 |
7640 | 215 if ((arg->value.search_flags & |
216 MAIL_SEARCH_ARG_FLAG_USE_TZ) == 0) { | |
217 tm = localtime(&date); | |
218 date += utc_offset(tm, date)*60; | |
219 } | |
525
2cb2e0a3423b
Moved several fields from .imap.index file to .imap.index.data file. Fixed
Timo Sirainen <tss@iki.fi>
parents:
505
diff
changeset
|
220 |
5599
6789ba80419b
Parse search dates already in IMAP code.
Timo Sirainen <tss@iki.fi>
parents:
5527
diff
changeset
|
221 switch (arg->type) { |
525
2cb2e0a3423b
Moved several fields from .imap.index file to .imap.index.data file. Fixed
Timo Sirainen <tss@iki.fi>
parents:
505
diff
changeset
|
222 case SEARCH_BEFORE: |
5599
6789ba80419b
Parse search dates already in IMAP code.
Timo Sirainen <tss@iki.fi>
parents:
5527
diff
changeset
|
223 return date < arg->value.time; |
525
2cb2e0a3423b
Moved several fields from .imap.index file to .imap.index.data file. Fixed
Timo Sirainen <tss@iki.fi>
parents:
505
diff
changeset
|
224 case SEARCH_ON: |
5599
6789ba80419b
Parse search dates already in IMAP code.
Timo Sirainen <tss@iki.fi>
parents:
5527
diff
changeset
|
225 return date >= arg->value.time && |
6789ba80419b
Parse search dates already in IMAP code.
Timo Sirainen <tss@iki.fi>
parents:
5527
diff
changeset
|
226 date < arg->value.time + 3600*24; |
525
2cb2e0a3423b
Moved several fields from .imap.index file to .imap.index.data file. Fixed
Timo Sirainen <tss@iki.fi>
parents:
505
diff
changeset
|
227 case SEARCH_SINCE: |
5599
6789ba80419b
Parse search dates already in IMAP code.
Timo Sirainen <tss@iki.fi>
parents:
5527
diff
changeset
|
228 return date >= arg->value.time; |
1672
8920600a8cfc
Index cache file rewrite. It's not finished yet and mbox support is
Timo Sirainen <tss@iki.fi>
parents:
1638
diff
changeset
|
229 default: |
8920600a8cfc
Index cache file rewrite. It's not finished yet and mbox support is
Timo Sirainen <tss@iki.fi>
parents:
1638
diff
changeset
|
230 /* unreachable */ |
8920600a8cfc
Index cache file rewrite. It's not finished yet and mbox support is
Timo Sirainen <tss@iki.fi>
parents:
1638
diff
changeset
|
231 break; |
8920600a8cfc
Index cache file rewrite. It's not finished yet and mbox support is
Timo Sirainen <tss@iki.fi>
parents:
1638
diff
changeset
|
232 } |
8920600a8cfc
Index cache file rewrite. It's not finished yet and mbox support is
Timo Sirainen <tss@iki.fi>
parents:
1638
diff
changeset
|
233 |
8920600a8cfc
Index cache file rewrite. It's not finished yet and mbox support is
Timo Sirainen <tss@iki.fi>
parents:
1638
diff
changeset
|
234 /* sent dates */ |
8920600a8cfc
Index cache file rewrite. It's not finished yet and mbox support is
Timo Sirainen <tss@iki.fi>
parents:
1638
diff
changeset
|
235 case SEARCH_SENTBEFORE: |
8920600a8cfc
Index cache file rewrite. It's not finished yet and mbox support is
Timo Sirainen <tss@iki.fi>
parents:
1638
diff
changeset
|
236 case SEARCH_SENTON: |
8920600a8cfc
Index cache file rewrite. It's not finished yet and mbox support is
Timo Sirainen <tss@iki.fi>
parents:
1638
diff
changeset
|
237 case SEARCH_SENTSINCE: |
8920600a8cfc
Index cache file rewrite. It's not finished yet and mbox support is
Timo Sirainen <tss@iki.fi>
parents:
1638
diff
changeset
|
238 /* NOTE: RFC-3501 specifies that timezone is ignored |
8920600a8cfc
Index cache file rewrite. It's not finished yet and mbox support is
Timo Sirainen <tss@iki.fi>
parents:
1638
diff
changeset
|
239 in searches. date is returned as UTC, so change it. */ |
6280
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6277
diff
changeset
|
240 if (mail_get_date(ctx->mail, &date, &timezone_offset) < 0) |
1672
8920600a8cfc
Index cache file rewrite. It's not finished yet and mbox support is
Timo Sirainen <tss@iki.fi>
parents:
1638
diff
changeset
|
241 return -1; |
7640 | 242 if ((arg->value.search_flags & |
243 MAIL_SEARCH_ARG_FLAG_USE_TZ) == 0) | |
244 date += timezone_offset * 60; | |
1672
8920600a8cfc
Index cache file rewrite. It's not finished yet and mbox support is
Timo Sirainen <tss@iki.fi>
parents:
1638
diff
changeset
|
245 |
5599
6789ba80419b
Parse search dates already in IMAP code.
Timo Sirainen <tss@iki.fi>
parents:
5527
diff
changeset
|
246 switch (arg->type) { |
1672
8920600a8cfc
Index cache file rewrite. It's not finished yet and mbox support is
Timo Sirainen <tss@iki.fi>
parents:
1638
diff
changeset
|
247 case SEARCH_SENTBEFORE: |
5599
6789ba80419b
Parse search dates already in IMAP code.
Timo Sirainen <tss@iki.fi>
parents:
5527
diff
changeset
|
248 return date < arg->value.time; |
1672
8920600a8cfc
Index cache file rewrite. It's not finished yet and mbox support is
Timo Sirainen <tss@iki.fi>
parents:
1638
diff
changeset
|
249 case SEARCH_SENTON: |
5599
6789ba80419b
Parse search dates already in IMAP code.
Timo Sirainen <tss@iki.fi>
parents:
5527
diff
changeset
|
250 return date >= arg->value.time && |
6789ba80419b
Parse search dates already in IMAP code.
Timo Sirainen <tss@iki.fi>
parents:
5527
diff
changeset
|
251 date < arg->value.time + 3600*24; |
1672
8920600a8cfc
Index cache file rewrite. It's not finished yet and mbox support is
Timo Sirainen <tss@iki.fi>
parents:
1638
diff
changeset
|
252 case SEARCH_SENTSINCE: |
5599
6789ba80419b
Parse search dates already in IMAP code.
Timo Sirainen <tss@iki.fi>
parents:
5527
diff
changeset
|
253 return date >= arg->value.time; |
525
2cb2e0a3423b
Moved several fields from .imap.index file to .imap.index.data file. Fixed
Timo Sirainen <tss@iki.fi>
parents:
505
diff
changeset
|
254 default: |
2cb2e0a3423b
Moved several fields from .imap.index file to .imap.index.data file. Fixed
Timo Sirainen <tss@iki.fi>
parents:
505
diff
changeset
|
255 /* unreachable */ |
2cb2e0a3423b
Moved several fields from .imap.index file to .imap.index.data file. Fixed
Timo Sirainen <tss@iki.fi>
parents:
505
diff
changeset
|
256 break; |
2cb2e0a3423b
Moved several fields from .imap.index file to .imap.index.data file. Fixed
Timo Sirainen <tss@iki.fi>
parents:
505
diff
changeset
|
257 } |
2cb2e0a3423b
Moved several fields from .imap.index file to .imap.index.data file. Fixed
Timo Sirainen <tss@iki.fi>
parents:
505
diff
changeset
|
258 |
2cb2e0a3423b
Moved several fields from .imap.index file to .imap.index.data file. Fixed
Timo Sirainen <tss@iki.fi>
parents:
505
diff
changeset
|
259 /* sizes */ |
2cb2e0a3423b
Moved several fields from .imap.index file to .imap.index.data file. Fixed
Timo Sirainen <tss@iki.fi>
parents:
505
diff
changeset
|
260 case SEARCH_SMALLER: |
2cb2e0a3423b
Moved several fields from .imap.index file to .imap.index.data file. Fixed
Timo Sirainen <tss@iki.fi>
parents:
505
diff
changeset
|
261 case SEARCH_LARGER: |
6280
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6277
diff
changeset
|
262 if (mail_get_virtual_size(ctx->mail, &virtual_size) < 0) |
525
2cb2e0a3423b
Moved several fields from .imap.index file to .imap.index.data file. Fixed
Timo Sirainen <tss@iki.fi>
parents:
505
diff
changeset
|
263 return -1; |
2cb2e0a3423b
Moved several fields from .imap.index file to .imap.index.data file. Fixed
Timo Sirainen <tss@iki.fi>
parents:
505
diff
changeset
|
264 |
5599
6789ba80419b
Parse search dates already in IMAP code.
Timo Sirainen <tss@iki.fi>
parents:
5527
diff
changeset
|
265 if (arg->type == SEARCH_SMALLER) |
6962
659e4a606aae
Replaced SEARCH_<flag> with a generic SEARCH_FLAGS. Use value.size for
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
266 return virtual_size < arg->value.size; |
525
2cb2e0a3423b
Moved several fields from .imap.index file to .imap.index.data file. Fixed
Timo Sirainen <tss@iki.fi>
parents:
505
diff
changeset
|
267 else |
6962
659e4a606aae
Replaced SEARCH_<flag> with a generic SEARCH_FLAGS. Use value.size for
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
268 return virtual_size > arg->value.size; |
525
2cb2e0a3423b
Moved several fields from .imap.index file to .imap.index.data file. Fixed
Timo Sirainen <tss@iki.fi>
parents:
505
diff
changeset
|
269 |
8077
6d51328896d6
Added the concept of Global UIDs that are preserved across copies.
Timo Sirainen <tss@iki.fi>
parents:
8074
diff
changeset
|
270 case SEARCH_GUID: |
6d51328896d6
Added the concept of Global UIDs that are preserved across copies.
Timo Sirainen <tss@iki.fi>
parents:
8074
diff
changeset
|
271 if (mail_get_special(ctx->mail, MAIL_FETCH_GUID, &str) < 0) |
6d51328896d6
Added the concept of Global UIDs that are preserved across copies.
Timo Sirainen <tss@iki.fi>
parents:
8074
diff
changeset
|
272 return -1; |
6d51328896d6
Added the concept of Global UIDs that are preserved across copies.
Timo Sirainen <tss@iki.fi>
parents:
8074
diff
changeset
|
273 return strcmp(str, arg->value.str) == 0; |
7910
c1bbdc2b262e
FETCH X-MAILBOX and SEARCH X-MAILBOX can be used with virtual mailboxes to
Timo Sirainen <tss@iki.fi>
parents:
7909
diff
changeset
|
274 case SEARCH_MAILBOX: |
c1bbdc2b262e
FETCH X-MAILBOX and SEARCH X-MAILBOX can be used with virtual mailboxes to
Timo Sirainen <tss@iki.fi>
parents:
7909
diff
changeset
|
275 if (mail_get_special(ctx->mail, MAIL_FETCH_MAILBOX_NAME, |
c1bbdc2b262e
FETCH X-MAILBOX and SEARCH X-MAILBOX can be used with virtual mailboxes to
Timo Sirainen <tss@iki.fi>
parents:
7909
diff
changeset
|
276 &str) < 0) |
c1bbdc2b262e
FETCH X-MAILBOX and SEARCH X-MAILBOX can be used with virtual mailboxes to
Timo Sirainen <tss@iki.fi>
parents:
7909
diff
changeset
|
277 return -1; |
c1bbdc2b262e
FETCH X-MAILBOX and SEARCH X-MAILBOX can be used with virtual mailboxes to
Timo Sirainen <tss@iki.fi>
parents:
7909
diff
changeset
|
278 |
c1bbdc2b262e
FETCH X-MAILBOX and SEARCH X-MAILBOX can be used with virtual mailboxes to
Timo Sirainen <tss@iki.fi>
parents:
7909
diff
changeset
|
279 if (strcasecmp(str, "INBOX") == 0) |
c1bbdc2b262e
FETCH X-MAILBOX and SEARCH X-MAILBOX can be used with virtual mailboxes to
Timo Sirainen <tss@iki.fi>
parents:
7909
diff
changeset
|
280 return strcasecmp(arg->value.str, "INBOX") == 0; |
c1bbdc2b262e
FETCH X-MAILBOX and SEARCH X-MAILBOX can be used with virtual mailboxes to
Timo Sirainen <tss@iki.fi>
parents:
7909
diff
changeset
|
281 return strcmp(str, arg->value.str) == 0; |
525
2cb2e0a3423b
Moved several fields from .imap.index file to .imap.index.data file. Fixed
Timo Sirainen <tss@iki.fi>
parents:
505
diff
changeset
|
282 default: |
2cb2e0a3423b
Moved several fields from .imap.index file to .imap.index.data file. Fixed
Timo Sirainen <tss@iki.fi>
parents:
505
diff
changeset
|
283 return -1; |
2cb2e0a3423b
Moved several fields from .imap.index file to .imap.index.data file. Fixed
Timo Sirainen <tss@iki.fi>
parents:
505
diff
changeset
|
284 } |
2cb2e0a3423b
Moved several fields from .imap.index file to .imap.index.data file. Fixed
Timo Sirainen <tss@iki.fi>
parents:
505
diff
changeset
|
285 } |
2cb2e0a3423b
Moved several fields from .imap.index file to .imap.index.data file. Fixed
Timo Sirainen <tss@iki.fi>
parents:
505
diff
changeset
|
286 |
4907
5b4c9b20eba0
Replaced void *context from a lot of callbacks with the actual context
Timo Sirainen <tss@iki.fi>
parents:
4635
diff
changeset
|
287 static void search_cached_arg(struct mail_search_arg *arg, |
5b4c9b20eba0
Replaced void *context from a lot of callbacks with the actual context
Timo Sirainen <tss@iki.fi>
parents:
4635
diff
changeset
|
288 struct index_search_context *ctx) |
525
2cb2e0a3423b
Moved several fields from .imap.index file to .imap.index.data file. Fixed
Timo Sirainen <tss@iki.fi>
parents:
505
diff
changeset
|
289 { |
5599
6789ba80419b
Parse search dates already in IMAP code.
Timo Sirainen <tss@iki.fi>
parents:
5527
diff
changeset
|
290 switch (search_arg_match_cached(ctx, arg)) { |
525
2cb2e0a3423b
Moved several fields from .imap.index file to .imap.index.data file. Fixed
Timo Sirainen <tss@iki.fi>
parents:
505
diff
changeset
|
291 case -1: |
2cb2e0a3423b
Moved several fields from .imap.index file to .imap.index.data file. Fixed
Timo Sirainen <tss@iki.fi>
parents:
505
diff
changeset
|
292 /* unknown */ |
2cb2e0a3423b
Moved several fields from .imap.index file to .imap.index.data file. Fixed
Timo Sirainen <tss@iki.fi>
parents:
505
diff
changeset
|
293 break; |
2cb2e0a3423b
Moved several fields from .imap.index file to .imap.index.data file. Fixed
Timo Sirainen <tss@iki.fi>
parents:
505
diff
changeset
|
294 case 0: |
1069
8024a2cdc406
Several search fixes, mostly related to matching multiple conditions.
Timo Sirainen <tss@iki.fi>
parents:
1066
diff
changeset
|
295 ARG_SET_RESULT(arg, 0); |
525
2cb2e0a3423b
Moved several fields from .imap.index file to .imap.index.data file. Fixed
Timo Sirainen <tss@iki.fi>
parents:
505
diff
changeset
|
296 break; |
2cb2e0a3423b
Moved several fields from .imap.index file to .imap.index.data file. Fixed
Timo Sirainen <tss@iki.fi>
parents:
505
diff
changeset
|
297 default: |
2cb2e0a3423b
Moved several fields from .imap.index file to .imap.index.data file. Fixed
Timo Sirainen <tss@iki.fi>
parents:
505
diff
changeset
|
298 ARG_SET_RESULT(arg, 1); |
2cb2e0a3423b
Moved several fields from .imap.index file to .imap.index.data file. Fixed
Timo Sirainen <tss@iki.fi>
parents:
505
diff
changeset
|
299 break; |
2cb2e0a3423b
Moved several fields from .imap.index file to .imap.index.data file. Fixed
Timo Sirainen <tss@iki.fi>
parents:
505
diff
changeset
|
300 } |
2cb2e0a3423b
Moved several fields from .imap.index file to .imap.index.data file. Fixed
Timo Sirainen <tss@iki.fi>
parents:
505
diff
changeset
|
301 } |
2cb2e0a3423b
Moved several fields from .imap.index file to .imap.index.data file. Fixed
Timo Sirainen <tss@iki.fi>
parents:
505
diff
changeset
|
302 |
5599
6789ba80419b
Parse search dates already in IMAP code.
Timo Sirainen <tss@iki.fi>
parents:
5527
diff
changeset
|
303 static int search_sent(enum mail_search_arg_type type, time_t search_time, |
1322
97f8c00b8d4c
Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents:
1070
diff
changeset
|
304 const unsigned char *sent_value, size_t sent_value_len) |
0 | 305 { |
5599
6789ba80419b
Parse search dates already in IMAP code.
Timo Sirainen <tss@iki.fi>
parents:
5527
diff
changeset
|
306 time_t sent_time; |
408
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
307 int timezone_offset; |
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
308 |
880
d5168cca2052
SEARCHing headers with "" value should always match if the header is found.
Timo Sirainen <tss@iki.fi>
parents:
825
diff
changeset
|
309 if (sent_value == NULL) |
d5168cca2052
SEARCHing headers with "" value should always match if the header is found.
Timo Sirainen <tss@iki.fi>
parents:
825
diff
changeset
|
310 return 0; |
d5168cca2052
SEARCHing headers with "" value should always match if the header is found.
Timo Sirainen <tss@iki.fi>
parents:
825
diff
changeset
|
311 |
1340
087a9f4304ca
s/latest IMAP4rev1 draft/RFC-3501/
Timo Sirainen <tss@iki.fi>
parents:
1322
diff
changeset
|
312 /* NOTE: RFC-3501 specifies that timezone is ignored |
935
bd2d99a3d601
Even more rfc822 date timezone fixes
Timo Sirainen <tss@iki.fi>
parents:
934
diff
changeset
|
313 in searches. sent_time is returned as UTC, so change it. */ |
1322
97f8c00b8d4c
Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents:
1070
diff
changeset
|
314 if (!message_date_parse(sent_value, sent_value_len, |
988
8028c4dcf38f
mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents:
962
diff
changeset
|
315 &sent_time, &timezone_offset)) |
408
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
316 return 0; |
1604 | 317 sent_time += timezone_offset * 60; |
0 | 318 |
408
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
319 switch (type) { |
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
320 case SEARCH_SENTBEFORE: |
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
321 return sent_time < search_time; |
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
322 case SEARCH_SENTON: |
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
323 return sent_time >= search_time && |
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
324 sent_time < search_time + 3600*24; |
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
325 case SEARCH_SENTSINCE: |
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
326 return sent_time >= search_time; |
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
327 default: |
546
e1254b838e0b
Added --enable-asserts (default) and fixed some warnings when building
Timo Sirainen <tss@iki.fi>
parents:
534
diff
changeset
|
328 i_unreached(); |
408
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
329 } |
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
330 } |
0 | 331 |
5525
94bc3fbdecd5
Removed message body/header searchers. They're now combined into one
Timo Sirainen <tss@iki.fi>
parents:
5522
diff
changeset
|
332 static struct message_search_context * |
94bc3fbdecd5
Removed message body/header searchers. They're now combined into one
Timo Sirainen <tss@iki.fi>
parents:
5522
diff
changeset
|
333 msg_search_arg_context(struct index_search_context *ctx, |
94bc3fbdecd5
Removed message body/header searchers. They're now combined into one
Timo Sirainen <tss@iki.fi>
parents:
5522
diff
changeset
|
334 struct mail_search_arg *arg) |
5504
9414946e1eb0
Message body search API changed to init/search/deinit. Searching now builds
Timo Sirainen <tss@iki.fi>
parents:
4949
diff
changeset
|
335 { |
5525
94bc3fbdecd5
Removed message body/header searchers. They're now combined into one
Timo Sirainen <tss@iki.fi>
parents:
5522
diff
changeset
|
336 struct message_search_context *arg_ctx = arg->context; |
94bc3fbdecd5
Removed message body/header searchers. They're now combined into one
Timo Sirainen <tss@iki.fi>
parents:
5522
diff
changeset
|
337 enum message_search_flags flags; |
94bc3fbdecd5
Removed message body/header searchers. They're now combined into one
Timo Sirainen <tss@iki.fi>
parents:
5522
diff
changeset
|
338 int ret; |
5504
9414946e1eb0
Message body search API changed to init/search/deinit. Searching now builds
Timo Sirainen <tss@iki.fi>
parents:
4949
diff
changeset
|
339 |
9414946e1eb0
Message body search API changed to init/search/deinit. Searching now builds
Timo Sirainen <tss@iki.fi>
parents:
4949
diff
changeset
|
340 if (arg_ctx != NULL) |
9414946e1eb0
Message body search API changed to init/search/deinit. Searching now builds
Timo Sirainen <tss@iki.fi>
parents:
4949
diff
changeset
|
341 return arg_ctx; |
9414946e1eb0
Message body search API changed to init/search/deinit. Searching now builds
Timo Sirainen <tss@iki.fi>
parents:
4949
diff
changeset
|
342 |
5525
94bc3fbdecd5
Removed message body/header searchers. They're now combined into one
Timo Sirainen <tss@iki.fi>
parents:
5522
diff
changeset
|
343 flags = (arg->type == SEARCH_BODY || arg->type == SEARCH_BODY_FAST) ? |
94bc3fbdecd5
Removed message body/header searchers. They're now combined into one
Timo Sirainen <tss@iki.fi>
parents:
5522
diff
changeset
|
344 MESSAGE_SEARCH_FLAG_SKIP_HEADERS : 0; |
5504
9414946e1eb0
Message body search API changed to init/search/deinit. Searching now builds
Timo Sirainen <tss@iki.fi>
parents:
4949
diff
changeset
|
345 |
7805
d440b7cad709
Removed pool parameter from message_search_init().
Timo Sirainen <tss@iki.fi>
parents:
7798
diff
changeset
|
346 ret = message_search_init(arg->value.str, |
7642
077bb84e9e77
Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents:
7640
diff
changeset
|
347 ctx->mail_ctx.args->charset, flags, |
5525
94bc3fbdecd5
Removed message body/header searchers. They're now combined into one
Timo Sirainen <tss@iki.fi>
parents:
5522
diff
changeset
|
348 &arg_ctx); |
5527 | 349 if (ret > 0) { |
350 arg->context = arg_ctx; | |
5525
94bc3fbdecd5
Removed message body/header searchers. They're now combined into one
Timo Sirainen <tss@iki.fi>
parents:
5522
diff
changeset
|
351 return arg_ctx; |
5527 | 352 } |
5504
9414946e1eb0
Message body search API changed to init/search/deinit. Searching now builds
Timo Sirainen <tss@iki.fi>
parents:
4949
diff
changeset
|
353 if (ret == 0) |
9414946e1eb0
Message body search API changed to init/search/deinit. Searching now builds
Timo Sirainen <tss@iki.fi>
parents:
4949
diff
changeset
|
354 ctx->error = TXT_UNKNOWN_CHARSET; |
9414946e1eb0
Message body search API changed to init/search/deinit. Searching now builds
Timo Sirainen <tss@iki.fi>
parents:
4949
diff
changeset
|
355 else |
9414946e1eb0
Message body search API changed to init/search/deinit. Searching now builds
Timo Sirainen <tss@iki.fi>
parents:
4949
diff
changeset
|
356 ctx->error = TXT_INVALID_SEARCH_KEY; |
9414946e1eb0
Message body search API changed to init/search/deinit. Searching now builds
Timo Sirainen <tss@iki.fi>
parents:
4949
diff
changeset
|
357 return NULL; |
0 | 358 } |
359 | |
7284
346d4a44c2f4
SEARCH SUBJECT now changes LWSP to spaces to match ENVELOPE's subject field.
Timo Sirainen <tss@iki.fi>
parents:
7281
diff
changeset
|
360 static void compress_lwsp(string_t *dest, const unsigned char *src, |
346d4a44c2f4
SEARCH SUBJECT now changes LWSP to spaces to match ENVELOPE's subject field.
Timo Sirainen <tss@iki.fi>
parents:
7281
diff
changeset
|
361 unsigned int src_len) |
346d4a44c2f4
SEARCH SUBJECT now changes LWSP to spaces to match ENVELOPE's subject field.
Timo Sirainen <tss@iki.fi>
parents:
7281
diff
changeset
|
362 { |
346d4a44c2f4
SEARCH SUBJECT now changes LWSP to spaces to match ENVELOPE's subject field.
Timo Sirainen <tss@iki.fi>
parents:
7281
diff
changeset
|
363 unsigned int i; |
346d4a44c2f4
SEARCH SUBJECT now changes LWSP to spaces to match ENVELOPE's subject field.
Timo Sirainen <tss@iki.fi>
parents:
7281
diff
changeset
|
364 bool prev_lwsp = TRUE; |
346d4a44c2f4
SEARCH SUBJECT now changes LWSP to spaces to match ENVELOPE's subject field.
Timo Sirainen <tss@iki.fi>
parents:
7281
diff
changeset
|
365 |
346d4a44c2f4
SEARCH SUBJECT now changes LWSP to spaces to match ENVELOPE's subject field.
Timo Sirainen <tss@iki.fi>
parents:
7281
diff
changeset
|
366 for (i = 0; i < src_len; i++) { |
346d4a44c2f4
SEARCH SUBJECT now changes LWSP to spaces to match ENVELOPE's subject field.
Timo Sirainen <tss@iki.fi>
parents:
7281
diff
changeset
|
367 if (IS_LWSP(src[i])) { |
346d4a44c2f4
SEARCH SUBJECT now changes LWSP to spaces to match ENVELOPE's subject field.
Timo Sirainen <tss@iki.fi>
parents:
7281
diff
changeset
|
368 if (!prev_lwsp) { |
346d4a44c2f4
SEARCH SUBJECT now changes LWSP to spaces to match ENVELOPE's subject field.
Timo Sirainen <tss@iki.fi>
parents:
7281
diff
changeset
|
369 prev_lwsp = TRUE; |
346d4a44c2f4
SEARCH SUBJECT now changes LWSP to spaces to match ENVELOPE's subject field.
Timo Sirainen <tss@iki.fi>
parents:
7281
diff
changeset
|
370 str_append_c(dest, ' '); |
346d4a44c2f4
SEARCH SUBJECT now changes LWSP to spaces to match ENVELOPE's subject field.
Timo Sirainen <tss@iki.fi>
parents:
7281
diff
changeset
|
371 } |
346d4a44c2f4
SEARCH SUBJECT now changes LWSP to spaces to match ENVELOPE's subject field.
Timo Sirainen <tss@iki.fi>
parents:
7281
diff
changeset
|
372 } else { |
346d4a44c2f4
SEARCH SUBJECT now changes LWSP to spaces to match ENVELOPE's subject field.
Timo Sirainen <tss@iki.fi>
parents:
7281
diff
changeset
|
373 prev_lwsp = FALSE; |
346d4a44c2f4
SEARCH SUBJECT now changes LWSP to spaces to match ENVELOPE's subject field.
Timo Sirainen <tss@iki.fi>
parents:
7281
diff
changeset
|
374 str_append_c(dest, src[i]); |
346d4a44c2f4
SEARCH SUBJECT now changes LWSP to spaces to match ENVELOPE's subject field.
Timo Sirainen <tss@iki.fi>
parents:
7281
diff
changeset
|
375 } |
346d4a44c2f4
SEARCH SUBJECT now changes LWSP to spaces to match ENVELOPE's subject field.
Timo Sirainen <tss@iki.fi>
parents:
7281
diff
changeset
|
376 } |
346d4a44c2f4
SEARCH SUBJECT now changes LWSP to spaces to match ENVELOPE's subject field.
Timo Sirainen <tss@iki.fi>
parents:
7281
diff
changeset
|
377 } |
346d4a44c2f4
SEARCH SUBJECT now changes LWSP to spaces to match ENVELOPE's subject field.
Timo Sirainen <tss@iki.fi>
parents:
7281
diff
changeset
|
378 |
4907
5b4c9b20eba0
Replaced void *context from a lot of callbacks with the actual context
Timo Sirainen <tss@iki.fi>
parents:
4635
diff
changeset
|
379 static void search_header_arg(struct mail_search_arg *arg, |
5b4c9b20eba0
Replaced void *context from a lot of callbacks with the actual context
Timo Sirainen <tss@iki.fi>
parents:
4635
diff
changeset
|
380 struct search_header_context *ctx) |
0 | 381 { |
5525
94bc3fbdecd5
Removed message body/header searchers. They're now combined into one
Timo Sirainen <tss@iki.fi>
parents:
5522
diff
changeset
|
382 struct message_search_context *msg_search_ctx; |
94bc3fbdecd5
Removed message body/header searchers. They're now combined into one
Timo Sirainen <tss@iki.fi>
parents:
5522
diff
changeset
|
383 struct message_block block; |
6574
ab3a1a8ade55
Header searches didn't decode MIME encoded words.
Timo Sirainen <tss@iki.fi>
parents:
6492
diff
changeset
|
384 struct message_header_line hdr; |
0 | 385 int ret; |
386 | |
387 /* first check that the field name matches to argument. */ | |
388 switch (arg->type) { | |
408
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
389 case SEARCH_SENTBEFORE: |
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
390 case SEARCH_SENTON: |
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
391 case SEARCH_SENTSINCE: |
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
392 /* date is handled differently than others */ |
1322
97f8c00b8d4c
Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents:
1070
diff
changeset
|
393 if (strcasecmp(ctx->hdr->name, "Date") == 0) { |
97f8c00b8d4c
Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents:
1070
diff
changeset
|
394 if (ctx->hdr->continues) { |
97f8c00b8d4c
Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents:
1070
diff
changeset
|
395 ctx->hdr->use_full_value = TRUE; |
97f8c00b8d4c
Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents:
1070
diff
changeset
|
396 return; |
97f8c00b8d4c
Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents:
1070
diff
changeset
|
397 } |
5599
6789ba80419b
Parse search dates already in IMAP code.
Timo Sirainen <tss@iki.fi>
parents:
5527
diff
changeset
|
398 ret = search_sent(arg->type, arg->value.time, |
1322
97f8c00b8d4c
Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents:
1070
diff
changeset
|
399 ctx->hdr->full_value, |
97f8c00b8d4c
Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents:
1070
diff
changeset
|
400 ctx->hdr->full_value_len); |
1070 | 401 ARG_SET_RESULT(arg, ret); |
408
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
402 } |
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
403 return; |
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
404 |
0 | 405 case SEARCH_HEADER: |
1672
8920600a8cfc
Index cache file rewrite. It's not finished yet and mbox support is
Timo Sirainen <tss@iki.fi>
parents:
1638
diff
changeset
|
406 case SEARCH_HEADER_ADDRESS: |
7284
346d4a44c2f4
SEARCH SUBJECT now changes LWSP to spaces to match ENVELOPE's subject field.
Timo Sirainen <tss@iki.fi>
parents:
7281
diff
changeset
|
407 case SEARCH_HEADER_COMPRESS_LWSP: |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
408 ctx->custom_header = TRUE; |
0 | 409 |
1322
97f8c00b8d4c
Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents:
1070
diff
changeset
|
410 if (strcasecmp(ctx->hdr->name, arg->hdr_field_name) != 0) |
0 | 411 return; |
5513 | 412 break; |
0 | 413 default: |
414 return; | |
415 } | |
416 | |
880
d5168cca2052
SEARCHing headers with "" value should always match if the header is found.
Timo Sirainen <tss@iki.fi>
parents:
825
diff
changeset
|
417 if (arg->value.str[0] == '\0') { |
d5168cca2052
SEARCHing headers with "" value should always match if the header is found.
Timo Sirainen <tss@iki.fi>
parents:
825
diff
changeset
|
418 /* we're just testing existence of the field. always matches. */ |
5525
94bc3fbdecd5
Removed message body/header searchers. They're now combined into one
Timo Sirainen <tss@iki.fi>
parents:
5522
diff
changeset
|
419 ARG_SET_RESULT(arg, 1); |
94bc3fbdecd5
Removed message body/header searchers. They're now combined into one
Timo Sirainen <tss@iki.fi>
parents:
5522
diff
changeset
|
420 return; |
94bc3fbdecd5
Removed message body/header searchers. They're now combined into one
Timo Sirainen <tss@iki.fi>
parents:
5522
diff
changeset
|
421 } |
94bc3fbdecd5
Removed message body/header searchers. They're now combined into one
Timo Sirainen <tss@iki.fi>
parents:
5522
diff
changeset
|
422 |
94bc3fbdecd5
Removed message body/header searchers. They're now combined into one
Timo Sirainen <tss@iki.fi>
parents:
5522
diff
changeset
|
423 if (ctx->hdr->continues) { |
94bc3fbdecd5
Removed message body/header searchers. They're now combined into one
Timo Sirainen <tss@iki.fi>
parents:
5522
diff
changeset
|
424 ctx->hdr->use_full_value = TRUE; |
94bc3fbdecd5
Removed message body/header searchers. They're now combined into one
Timo Sirainen <tss@iki.fi>
parents:
5522
diff
changeset
|
425 return; |
94bc3fbdecd5
Removed message body/header searchers. They're now combined into one
Timo Sirainen <tss@iki.fi>
parents:
5522
diff
changeset
|
426 } |
94bc3fbdecd5
Removed message body/header searchers. They're now combined into one
Timo Sirainen <tss@iki.fi>
parents:
5522
diff
changeset
|
427 |
94bc3fbdecd5
Removed message body/header searchers. They're now combined into one
Timo Sirainen <tss@iki.fi>
parents:
5522
diff
changeset
|
428 memset(&block, 0, sizeof(block)); |
7281
e5b840b3c5c2
Header searches shouldn't include the header name or ":" in matching.
Timo Sirainen <tss@iki.fi>
parents:
7279
diff
changeset
|
429 |
e5b840b3c5c2
Header searches shouldn't include the header name or ":" in matching.
Timo Sirainen <tss@iki.fi>
parents:
7279
diff
changeset
|
430 /* We're searching only for values, so drop header name and middle |
e5b840b3c5c2
Header searches shouldn't include the header name or ":" in matching.
Timo Sirainen <tss@iki.fi>
parents:
7279
diff
changeset
|
431 parts. We use header searching so that MIME words will be decoded. */ |
e5b840b3c5c2
Header searches shouldn't include the header name or ":" in matching.
Timo Sirainen <tss@iki.fi>
parents:
7279
diff
changeset
|
432 hdr = *ctx->hdr; |
e5b840b3c5c2
Header searches shouldn't include the header name or ":" in matching.
Timo Sirainen <tss@iki.fi>
parents:
7279
diff
changeset
|
433 hdr.name = ""; hdr.name_len = 0; |
e5b840b3c5c2
Header searches shouldn't include the header name or ":" in matching.
Timo Sirainen <tss@iki.fi>
parents:
7279
diff
changeset
|
434 hdr.middle_len = 0; |
e5b840b3c5c2
Header searches shouldn't include the header name or ":" in matching.
Timo Sirainen <tss@iki.fi>
parents:
7279
diff
changeset
|
435 block.hdr = &hdr; |
e5b840b3c5c2
Header searches shouldn't include the header name or ":" in matching.
Timo Sirainen <tss@iki.fi>
parents:
7279
diff
changeset
|
436 |
5525
94bc3fbdecd5
Removed message body/header searchers. They're now combined into one
Timo Sirainen <tss@iki.fi>
parents:
5522
diff
changeset
|
437 msg_search_ctx = msg_search_arg_context(ctx->index_context, arg); |
94bc3fbdecd5
Removed message body/header searchers. They're now combined into one
Timo Sirainen <tss@iki.fi>
parents:
5522
diff
changeset
|
438 if (msg_search_ctx == NULL) |
7284
346d4a44c2f4
SEARCH SUBJECT now changes LWSP to spaces to match ENVELOPE's subject field.
Timo Sirainen <tss@iki.fi>
parents:
7281
diff
changeset
|
439 return; |
346d4a44c2f4
SEARCH SUBJECT now changes LWSP to spaces to match ENVELOPE's subject field.
Timo Sirainen <tss@iki.fi>
parents:
7281
diff
changeset
|
440 |
346d4a44c2f4
SEARCH SUBJECT now changes LWSP to spaces to match ENVELOPE's subject field.
Timo Sirainen <tss@iki.fi>
parents:
7281
diff
changeset
|
441 T_BEGIN { |
346d4a44c2f4
SEARCH SUBJECT now changes LWSP to spaces to match ENVELOPE's subject field.
Timo Sirainen <tss@iki.fi>
parents:
7281
diff
changeset
|
442 struct message_address *addr; |
346d4a44c2f4
SEARCH SUBJECT now changes LWSP to spaces to match ENVELOPE's subject field.
Timo Sirainen <tss@iki.fi>
parents:
7281
diff
changeset
|
443 string_t *str; |
1322
97f8c00b8d4c
Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents:
1070
diff
changeset
|
444 |
7284
346d4a44c2f4
SEARCH SUBJECT now changes LWSP to spaces to match ENVELOPE's subject field.
Timo Sirainen <tss@iki.fi>
parents:
7281
diff
changeset
|
445 switch (arg->type) { |
346d4a44c2f4
SEARCH SUBJECT now changes LWSP to spaces to match ENVELOPE's subject field.
Timo Sirainen <tss@iki.fi>
parents:
7281
diff
changeset
|
446 case SEARCH_HEADER: |
346d4a44c2f4
SEARCH SUBJECT now changes LWSP to spaces to match ENVELOPE's subject field.
Timo Sirainen <tss@iki.fi>
parents:
7281
diff
changeset
|
447 /* simple match */ |
346d4a44c2f4
SEARCH SUBJECT now changes LWSP to spaces to match ENVELOPE's subject field.
Timo Sirainen <tss@iki.fi>
parents:
7281
diff
changeset
|
448 break; |
346d4a44c2f4
SEARCH SUBJECT now changes LWSP to spaces to match ENVELOPE's subject field.
Timo Sirainen <tss@iki.fi>
parents:
7281
diff
changeset
|
449 case SEARCH_HEADER_ADDRESS: |
346d4a44c2f4
SEARCH SUBJECT now changes LWSP to spaces to match ENVELOPE's subject field.
Timo Sirainen <tss@iki.fi>
parents:
7281
diff
changeset
|
450 /* we have to match against normalized address */ |
6940
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6899
diff
changeset
|
451 addr = message_address_parse(pool_datastack_create(), |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6899
diff
changeset
|
452 ctx->hdr->full_value, |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6899
diff
changeset
|
453 ctx->hdr->full_value_len, |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6899
diff
changeset
|
454 (unsigned int)-1, TRUE); |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6899
diff
changeset
|
455 str = t_str_new(ctx->hdr->value_len); |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6899
diff
changeset
|
456 message_address_write(str, addr); |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6899
diff
changeset
|
457 hdr.value = hdr.full_value = str_data(str); |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6899
diff
changeset
|
458 hdr.value_len = hdr.full_value_len = str_len(str); |
7284
346d4a44c2f4
SEARCH SUBJECT now changes LWSP to spaces to match ENVELOPE's subject field.
Timo Sirainen <tss@iki.fi>
parents:
7281
diff
changeset
|
459 break; |
346d4a44c2f4
SEARCH SUBJECT now changes LWSP to spaces to match ENVELOPE's subject field.
Timo Sirainen <tss@iki.fi>
parents:
7281
diff
changeset
|
460 case SEARCH_HEADER_COMPRESS_LWSP: |
346d4a44c2f4
SEARCH SUBJECT now changes LWSP to spaces to match ENVELOPE's subject field.
Timo Sirainen <tss@iki.fi>
parents:
7281
diff
changeset
|
461 /* convert LWSP to single spaces */ |
346d4a44c2f4
SEARCH SUBJECT now changes LWSP to spaces to match ENVELOPE's subject field.
Timo Sirainen <tss@iki.fi>
parents:
7281
diff
changeset
|
462 str = t_str_new(hdr.full_value_len); |
346d4a44c2f4
SEARCH SUBJECT now changes LWSP to spaces to match ENVELOPE's subject field.
Timo Sirainen <tss@iki.fi>
parents:
7281
diff
changeset
|
463 compress_lwsp(str, hdr.full_value, hdr.full_value_len); |
346d4a44c2f4
SEARCH SUBJECT now changes LWSP to spaces to match ENVELOPE's subject field.
Timo Sirainen <tss@iki.fi>
parents:
7281
diff
changeset
|
464 hdr.value = hdr.full_value = str_data(str); |
346d4a44c2f4
SEARCH SUBJECT now changes LWSP to spaces to match ENVELOPE's subject field.
Timo Sirainen <tss@iki.fi>
parents:
7281
diff
changeset
|
465 hdr.value_len = hdr.full_value_len = str_len(str); |
346d4a44c2f4
SEARCH SUBJECT now changes LWSP to spaces to match ENVELOPE's subject field.
Timo Sirainen <tss@iki.fi>
parents:
7281
diff
changeset
|
466 break; |
346d4a44c2f4
SEARCH SUBJECT now changes LWSP to spaces to match ENVELOPE's subject field.
Timo Sirainen <tss@iki.fi>
parents:
7281
diff
changeset
|
467 default: |
346d4a44c2f4
SEARCH SUBJECT now changes LWSP to spaces to match ENVELOPE's subject field.
Timo Sirainen <tss@iki.fi>
parents:
7281
diff
changeset
|
468 i_unreached(); |
346d4a44c2f4
SEARCH SUBJECT now changes LWSP to spaces to match ENVELOPE's subject field.
Timo Sirainen <tss@iki.fi>
parents:
7281
diff
changeset
|
469 } |
346d4a44c2f4
SEARCH SUBJECT now changes LWSP to spaces to match ENVELOPE's subject field.
Timo Sirainen <tss@iki.fi>
parents:
7281
diff
changeset
|
470 ret = message_search_more(msg_search_ctx, &block) ? 1 : 0; |
346d4a44c2f4
SEARCH SUBJECT now changes LWSP to spaces to match ENVELOPE's subject field.
Timo Sirainen <tss@iki.fi>
parents:
7281
diff
changeset
|
471 } T_END; |
568
f2aa58c2afd0
SEARCH CHARSET support. Currently we do it through iconv() and only ASCII
Timo Sirainen <tss@iki.fi>
parents:
559
diff
changeset
|
472 |
7284
346d4a44c2f4
SEARCH SUBJECT now changes LWSP to spaces to match ENVELOPE's subject field.
Timo Sirainen <tss@iki.fi>
parents:
7281
diff
changeset
|
473 ARG_SET_RESULT(arg, ret); |
1069
8024a2cdc406
Several search fixes, mostly related to matching multiple conditions.
Timo Sirainen <tss@iki.fi>
parents:
1066
diff
changeset
|
474 } |
8024a2cdc406
Several search fixes, mostly related to matching multiple conditions.
Timo Sirainen <tss@iki.fi>
parents:
1066
diff
changeset
|
475 |
8024a2cdc406
Several search fixes, mostly related to matching multiple conditions.
Timo Sirainen <tss@iki.fi>
parents:
1066
diff
changeset
|
476 static void search_header_unmatch(struct mail_search_arg *arg, |
6411
6a64e64fa3a3
Renamed __attr_*__ to ATTR_*. Renamed __attrs_used__ to ATTRS_DEFINED.
Timo Sirainen <tss@iki.fi>
parents:
6280
diff
changeset
|
477 void *context ATTR_UNUSED) |
1069
8024a2cdc406
Several search fixes, mostly related to matching multiple conditions.
Timo Sirainen <tss@iki.fi>
parents:
1066
diff
changeset
|
478 { |
8024a2cdc406
Several search fixes, mostly related to matching multiple conditions.
Timo Sirainen <tss@iki.fi>
parents:
1066
diff
changeset
|
479 switch (arg->type) { |
1070 | 480 case SEARCH_SENTBEFORE: |
481 case SEARCH_SENTON: | |
482 case SEARCH_SENTSINCE: | |
483 if (arg->not) { | |
484 /* date header not found, so we match only for | |
485 NOT searches */ | |
486 ARG_SET_RESULT(arg, 0); | |
487 } | |
488 break; | |
1069
8024a2cdc406
Several search fixes, mostly related to matching multiple conditions.
Timo Sirainen <tss@iki.fi>
parents:
1066
diff
changeset
|
489 case SEARCH_HEADER: |
1672
8920600a8cfc
Index cache file rewrite. It's not finished yet and mbox support is
Timo Sirainen <tss@iki.fi>
parents:
1638
diff
changeset
|
490 case SEARCH_HEADER_ADDRESS: |
7328
e0e212e7deeb
SEARCH NOT SUBJECT didn't work correctly.
Timo Sirainen <tss@iki.fi>
parents:
7284
diff
changeset
|
491 case SEARCH_HEADER_COMPRESS_LWSP: |
1069
8024a2cdc406
Several search fixes, mostly related to matching multiple conditions.
Timo Sirainen <tss@iki.fi>
parents:
1066
diff
changeset
|
492 ARG_SET_RESULT(arg, 0); |
8024a2cdc406
Several search fixes, mostly related to matching multiple conditions.
Timo Sirainen <tss@iki.fi>
parents:
1066
diff
changeset
|
493 break; |
8024a2cdc406
Several search fixes, mostly related to matching multiple conditions.
Timo Sirainen <tss@iki.fi>
parents:
1066
diff
changeset
|
494 default: |
8024a2cdc406
Several search fixes, mostly related to matching multiple conditions.
Timo Sirainen <tss@iki.fi>
parents:
1066
diff
changeset
|
495 break; |
8024a2cdc406
Several search fixes, mostly related to matching multiple conditions.
Timo Sirainen <tss@iki.fi>
parents:
1066
diff
changeset
|
496 } |
0 | 497 } |
498 | |
4907
5b4c9b20eba0
Replaced void *context from a lot of callbacks with the actual context
Timo Sirainen <tss@iki.fi>
parents:
4635
diff
changeset
|
499 static void search_header(struct message_header_line *hdr, |
5b4c9b20eba0
Replaced void *context from a lot of callbacks with the actual context
Timo Sirainen <tss@iki.fi>
parents:
4635
diff
changeset
|
500 struct search_header_context *ctx) |
0 | 501 { |
1322
97f8c00b8d4c
Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents:
1070
diff
changeset
|
502 if (hdr == NULL) { |
97f8c00b8d4c
Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents:
1070
diff
changeset
|
503 /* end of headers, mark all unknown SEARCH_HEADERs unmatched */ |
97f8c00b8d4c
Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents:
1070
diff
changeset
|
504 mail_search_args_foreach(ctx->args, search_header_unmatch, ctx); |
97f8c00b8d4c
Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents:
1070
diff
changeset
|
505 return; |
97f8c00b8d4c
Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents:
1070
diff
changeset
|
506 } |
97f8c00b8d4c
Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents:
1070
diff
changeset
|
507 |
97f8c00b8d4c
Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents:
1070
diff
changeset
|
508 if (hdr->eoh) |
97f8c00b8d4c
Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents:
1070
diff
changeset
|
509 return; |
97f8c00b8d4c
Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents:
1070
diff
changeset
|
510 |
3325
38eaa792c405
Don't call index_mail_parse_header() twice when searching headers. Caused
Timo Sirainen <tss@iki.fi>
parents:
3301
diff
changeset
|
511 if (ctx->parse_headers) |
38eaa792c405
Don't call index_mail_parse_header() twice when searching headers. Caused
Timo Sirainen <tss@iki.fi>
parents:
3301
diff
changeset
|
512 index_mail_parse_header(NULL, hdr, ctx->index_context->imail); |
924
4f697dde0fca
THREAD=REFERENCES implementation. Doesn't crash, but I'm not sure how
Timo Sirainen <tss@iki.fi>
parents:
903
diff
changeset
|
513 |
1672
8920600a8cfc
Index cache file rewrite. It's not finished yet and mbox support is
Timo Sirainen <tss@iki.fi>
parents:
1638
diff
changeset
|
514 if (ctx->custom_header || strcasecmp(hdr->name, "Date") == 0) { |
1322
97f8c00b8d4c
Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents:
1070
diff
changeset
|
515 ctx->hdr = hdr; |
0 | 516 |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
517 ctx->custom_header = FALSE; |
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
518 mail_search_args_foreach(ctx->args, search_header_arg, ctx); |
0 | 519 } |
520 } | |
521 | |
4907
5b4c9b20eba0
Replaced void *context from a lot of callbacks with the actual context
Timo Sirainen <tss@iki.fi>
parents:
4635
diff
changeset
|
522 static void search_body(struct mail_search_arg *arg, |
5b4c9b20eba0
Replaced void *context from a lot of callbacks with the actual context
Timo Sirainen <tss@iki.fi>
parents:
4635
diff
changeset
|
523 struct search_body_context *ctx) |
0 | 524 { |
5525
94bc3fbdecd5
Removed message body/header searchers. They're now combined into one
Timo Sirainen <tss@iki.fi>
parents:
5522
diff
changeset
|
525 struct message_search_context *msg_search_ctx; |
3863
55df57c028d4
Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents:
3795
diff
changeset
|
526 int ret; |
0 | 527 |
608
debb8468514e
SEARCH CHARSET now works properly with message bodies, and in general body
Timo Sirainen <tss@iki.fi>
parents:
569
diff
changeset
|
528 if (ctx->index_ctx->error != NULL) |
0 | 529 return; |
530 | |
4942
b382b21409b5
Added support for X-BODY-FAST and X-TEXT-FAST SEARCH arguments. FTS plugin
Timo Sirainen <tss@iki.fi>
parents:
4939
diff
changeset
|
531 switch (arg->type) { |
b382b21409b5
Added support for X-BODY-FAST and X-TEXT-FAST SEARCH arguments. FTS plugin
Timo Sirainen <tss@iki.fi>
parents:
4939
diff
changeset
|
532 case SEARCH_BODY: |
b382b21409b5
Added support for X-BODY-FAST and X-TEXT-FAST SEARCH arguments. FTS plugin
Timo Sirainen <tss@iki.fi>
parents:
4939
diff
changeset
|
533 case SEARCH_BODY_FAST: |
b382b21409b5
Added support for X-BODY-FAST and X-TEXT-FAST SEARCH arguments. FTS plugin
Timo Sirainen <tss@iki.fi>
parents:
4939
diff
changeset
|
534 case SEARCH_TEXT: |
b382b21409b5
Added support for X-BODY-FAST and X-TEXT-FAST SEARCH arguments. FTS plugin
Timo Sirainen <tss@iki.fi>
parents:
4939
diff
changeset
|
535 case SEARCH_TEXT_FAST: |
b382b21409b5
Added support for X-BODY-FAST and X-TEXT-FAST SEARCH arguments. FTS plugin
Timo Sirainen <tss@iki.fi>
parents:
4939
diff
changeset
|
536 break; |
b382b21409b5
Added support for X-BODY-FAST and X-TEXT-FAST SEARCH arguments. FTS plugin
Timo Sirainen <tss@iki.fi>
parents:
4939
diff
changeset
|
537 default: |
3795
e6c42de08336
Allow message_body_search() to return "message_part is broken" error. If it
Timo Sirainen <tss@iki.fi>
parents:
3467
diff
changeset
|
538 return; |
4942
b382b21409b5
Added support for X-BODY-FAST and X-TEXT-FAST SEARCH arguments. FTS plugin
Timo Sirainen <tss@iki.fi>
parents:
4939
diff
changeset
|
539 } |
3795
e6c42de08336
Allow message_body_search() to return "message_part is broken" error. If it
Timo Sirainen <tss@iki.fi>
parents:
3467
diff
changeset
|
540 |
5525
94bc3fbdecd5
Removed message body/header searchers. They're now combined into one
Timo Sirainen <tss@iki.fi>
parents:
5522
diff
changeset
|
541 msg_search_ctx = msg_search_arg_context(ctx->index_ctx, arg); |
94bc3fbdecd5
Removed message body/header searchers. They're now combined into one
Timo Sirainen <tss@iki.fi>
parents:
5522
diff
changeset
|
542 if (msg_search_ctx == NULL) { |
5504
9414946e1eb0
Message body search API changed to init/search/deinit. Searching now builds
Timo Sirainen <tss@iki.fi>
parents:
4949
diff
changeset
|
543 ARG_SET_RESULT(arg, 0); |
9414946e1eb0
Message body search API changed to init/search/deinit. Searching now builds
Timo Sirainen <tss@iki.fi>
parents:
4949
diff
changeset
|
544 return; |
9414946e1eb0
Message body search API changed to init/search/deinit. Searching now builds
Timo Sirainen <tss@iki.fi>
parents:
4949
diff
changeset
|
545 } |
9414946e1eb0
Message body search API changed to init/search/deinit. Searching now builds
Timo Sirainen <tss@iki.fi>
parents:
4949
diff
changeset
|
546 |
3795
e6c42de08336
Allow message_body_search() to return "message_part is broken" error. If it
Timo Sirainen <tss@iki.fi>
parents:
3467
diff
changeset
|
547 i_stream_seek(ctx->input, 0); |
5525
94bc3fbdecd5
Removed message body/header searchers. They're now combined into one
Timo Sirainen <tss@iki.fi>
parents:
5522
diff
changeset
|
548 ret = message_search_msg(msg_search_ctx, ctx->input, ctx->part); |
7241
a6c066f50877
Added mail_set_cache_corrupted() to rebuild the cache file and force
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
549 if (ret < 0 && ctx->input->stream_errno == 0) { |
a6c066f50877
Added mail_set_cache_corrupted() to rebuild the cache file and force
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
550 /* try again without cached parts */ |
a6c066f50877
Added mail_set_cache_corrupted() to rebuild the cache file and force
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
551 mail_set_cache_corrupted(ctx->index_ctx->mail, |
a6c066f50877
Added mail_set_cache_corrupted() to rebuild the cache file and force
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
552 MAIL_FETCH_MESSAGE_PARTS); |
3795
e6c42de08336
Allow message_body_search() to return "message_part is broken" error. If it
Timo Sirainen <tss@iki.fi>
parents:
3467
diff
changeset
|
553 |
5504
9414946e1eb0
Message body search API changed to init/search/deinit. Searching now builds
Timo Sirainen <tss@iki.fi>
parents:
4949
diff
changeset
|
554 i_stream_seek(ctx->input, 0); |
5525
94bc3fbdecd5
Removed message body/header searchers. They're now combined into one
Timo Sirainen <tss@iki.fi>
parents:
5522
diff
changeset
|
555 ret = message_search_msg(msg_search_ctx, ctx->input, NULL); |
7241
a6c066f50877
Added mail_set_cache_corrupted() to rebuild the cache file and force
Timo Sirainen <tss@iki.fi>
parents:
7226
diff
changeset
|
556 i_assert(ret >= 0 || ctx->input->stream_errno != 0); |
3795
e6c42de08336
Allow message_body_search() to return "message_part is broken" error. If it
Timo Sirainen <tss@iki.fi>
parents:
3467
diff
changeset
|
557 } |
290
3dcc2275b4ca
IOBuffer cleanup, hopefully fixes some mbox problems.
Timo Sirainen <tss@iki.fi>
parents:
223
diff
changeset
|
558 |
3795
e6c42de08336
Allow message_body_search() to return "message_part is broken" error. If it
Timo Sirainen <tss@iki.fi>
parents:
3467
diff
changeset
|
559 ARG_SET_RESULT(arg, ret > 0); |
5
1b34ec11fff8
Message data is parsed in blocks (no longer entirely mmap()ed). Several
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
560 } |
1b34ec11fff8
Message data is parsed in blocks (no longer entirely mmap()ed). Several
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
561 |
8982
947fab5a8992
Search: Perform all lookups from cache before attempting any uncached lookups.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
562 static int search_arg_match_text(struct mail_search_arg *args, |
947fab5a8992
Search: Perform all lookups from cache before attempting any uncached lookups.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
563 struct index_search_context *ctx) |
0 | 564 { |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
898
diff
changeset
|
565 struct istream *input; |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2298
diff
changeset
|
566 struct mailbox_header_lookup_ctx *headers_ctx; |
8982
947fab5a8992
Search: Perform all lookups from cache before attempting any uncached lookups.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
567 struct mail_search_arg *arg; |
1672
8920600a8cfc
Index cache file rewrite. It's not finished yet and mbox support is
Timo Sirainen <tss@iki.fi>
parents:
1638
diff
changeset
|
568 const char *const *headers; |
3863
55df57c028d4
Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents:
3795
diff
changeset
|
569 bool have_headers, have_body; |
8982
947fab5a8992
Search: Perform all lookups from cache before attempting any uncached lookups.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
570 int ret; |
0 | 571 |
572 /* first check what we need to use */ | |
1672
8920600a8cfc
Index cache file rewrite. It's not finished yet and mbox support is
Timo Sirainen <tss@iki.fi>
parents:
1638
diff
changeset
|
573 headers = mail_search_args_analyze(args, &have_headers, &have_body); |
8920600a8cfc
Index cache file rewrite. It's not finished yet and mbox support is
Timo Sirainen <tss@iki.fi>
parents:
1638
diff
changeset
|
574 if (!have_headers && !have_body) |
8982
947fab5a8992
Search: Perform all lookups from cache before attempting any uncached lookups.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
575 return 1; |
0 | 576 |
1672
8920600a8cfc
Index cache file rewrite. It's not finished yet and mbox support is
Timo Sirainen <tss@iki.fi>
parents:
1638
diff
changeset
|
577 if (have_headers) { |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
898
diff
changeset
|
578 struct search_header_context hdr_ctx; |
5
1b34ec11fff8
Message data is parsed in blocks (no longer entirely mmap()ed). Several
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
579 |
8982
947fab5a8992
Search: Perform all lookups from cache before attempting any uncached lookups.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
580 if (have_body && |
947fab5a8992
Search: Perform all lookups from cache before attempting any uncached lookups.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
581 ctx->mail->lookup_abort == MAIL_LOOKUP_ABORT_NEVER) { |
947fab5a8992
Search: Perform all lookups from cache before attempting any uncached lookups.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
582 /* just open the mail bypassing any caching, since |
947fab5a8992
Search: Perform all lookups from cache before attempting any uncached lookups.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
583 we're going to read through the body anyway */ |
1672
8920600a8cfc
Index cache file rewrite. It's not finished yet and mbox support is
Timo Sirainen <tss@iki.fi>
parents:
1638
diff
changeset
|
584 headers = NULL; |
8982
947fab5a8992
Search: Perform all lookups from cache before attempting any uncached lookups.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
585 } |
1672
8920600a8cfc
Index cache file rewrite. It's not finished yet and mbox support is
Timo Sirainen <tss@iki.fi>
parents:
1638
diff
changeset
|
586 |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2298
diff
changeset
|
587 if (headers == NULL) { |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2298
diff
changeset
|
588 headers_ctx = NULL; |
6280
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6277
diff
changeset
|
589 if (mail_get_stream(ctx->mail, NULL, NULL, &input) < 0) |
8982
947fab5a8992
Search: Perform all lookups from cache before attempting any uncached lookups.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
590 return -1; |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2298
diff
changeset
|
591 } else { |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2298
diff
changeset
|
592 /* FIXME: do this once in init */ |
3301
dd19f2e8575f
Don't even try to allow searching zero number of headers.
Timo Sirainen <tss@iki.fi>
parents:
3248
diff
changeset
|
593 i_assert(*headers != NULL); |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2298
diff
changeset
|
594 headers_ctx = |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2298
diff
changeset
|
595 mailbox_header_lookup_init(&ctx->ibox->box, |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2298
diff
changeset
|
596 headers); |
6280
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6277
diff
changeset
|
597 if (mail_get_header_stream(ctx->mail, headers_ctx, |
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6277
diff
changeset
|
598 &input) < 0) { |
8011
2d902d1f8bea
struct mailbox_header_lookup_ctx can now be referenced/unreferenced so it
Timo Sirainen <tss@iki.fi>
parents:
7910
diff
changeset
|
599 mailbox_header_lookup_unref(&headers_ctx); |
8982
947fab5a8992
Search: Perform all lookups from cache before attempting any uncached lookups.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
600 return -1; |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2298
diff
changeset
|
601 } |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2298
diff
changeset
|
602 } |
715
3e952f64b2ec
Non-envelope-cached header searching wasn't working. Also now search works
Timo Sirainen <tss@iki.fi>
parents:
678
diff
changeset
|
603 |
568
f2aa58c2afd0
SEARCH CHARSET support. Currently we do it through iconv() and only ASCII
Timo Sirainen <tss@iki.fi>
parents:
559
diff
changeset
|
604 memset(&hdr_ctx, 0, sizeof(hdr_ctx)); |
f2aa58c2afd0
SEARCH CHARSET support. Currently we do it through iconv() and only ASCII
Timo Sirainen <tss@iki.fi>
parents:
559
diff
changeset
|
605 hdr_ctx.index_context = ctx; |
f2aa58c2afd0
SEARCH CHARSET support. Currently we do it through iconv() and only ASCII
Timo Sirainen <tss@iki.fi>
parents:
559
diff
changeset
|
606 hdr_ctx.custom_header = TRUE; |
f2aa58c2afd0
SEARCH CHARSET support. Currently we do it through iconv() and only ASCII
Timo Sirainen <tss@iki.fi>
parents:
559
diff
changeset
|
607 hdr_ctx.args = args; |
5516
96f0b56489a2
Don't feed index_mail_parser headers while searching message bodies, unless
Timo Sirainen <tss@iki.fi>
parents:
5513
diff
changeset
|
608 hdr_ctx.parse_headers = headers == NULL && |
96f0b56489a2
Don't feed index_mail_parser headers while searching message bodies, unless
Timo Sirainen <tss@iki.fi>
parents:
5513
diff
changeset
|
609 index_mail_want_parse_headers(ctx->imail); |
608
debb8468514e
SEARCH CHARSET now works properly with message bodies, and in general body
Timo Sirainen <tss@iki.fi>
parents:
569
diff
changeset
|
610 |
5516
96f0b56489a2
Don't feed index_mail_parser headers while searching message bodies, unless
Timo Sirainen <tss@iki.fi>
parents:
5513
diff
changeset
|
611 if (hdr_ctx.parse_headers) |
96f0b56489a2
Don't feed index_mail_parser headers while searching message bodies, unless
Timo Sirainen <tss@iki.fi>
parents:
5513
diff
changeset
|
612 index_mail_parse_header_init(ctx->imail, headers_ctx); |
5522
5dee807e53cf
Header parser has now flags parameter to tell it how to handle linefeeds.
Timo Sirainen <tss@iki.fi>
parents:
5516
diff
changeset
|
613 message_parse_header(input, NULL, hdr_parser_flags, |
5dee807e53cf
Header parser has now flags parameter to tell it how to handle linefeeds.
Timo Sirainen <tss@iki.fi>
parents:
5516
diff
changeset
|
614 search_header, &hdr_ctx); |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2298
diff
changeset
|
615 if (headers_ctx != NULL) |
8011
2d902d1f8bea
struct mailbox_header_lookup_ctx can now be referenced/unreferenced so it
Timo Sirainen <tss@iki.fi>
parents:
7910
diff
changeset
|
616 mailbox_header_lookup_unref(&headers_ctx); |
715
3e952f64b2ec
Non-envelope-cached header searching wasn't working. Also now search works
Timo Sirainen <tss@iki.fi>
parents:
678
diff
changeset
|
617 } else { |
988
8028c4dcf38f
mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents:
962
diff
changeset
|
618 struct message_size hdr_size; |
8028c4dcf38f
mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents:
962
diff
changeset
|
619 |
6280
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6277
diff
changeset
|
620 if (mail_get_stream(ctx->mail, &hdr_size, NULL, &input) < 0) |
8982
947fab5a8992
Search: Perform all lookups from cache before attempting any uncached lookups.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
621 return -1; |
988
8028c4dcf38f
mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents:
962
diff
changeset
|
622 |
8028c4dcf38f
mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents:
962
diff
changeset
|
623 i_stream_seek(input, hdr_size.physical_size); |
5
1b34ec11fff8
Message data is parsed in blocks (no longer entirely mmap()ed). Several
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
624 } |
0 | 625 |
1672
8920600a8cfc
Index cache file rewrite. It's not finished yet and mbox support is
Timo Sirainen <tss@iki.fi>
parents:
1638
diff
changeset
|
626 if (have_body) { |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
898
diff
changeset
|
627 struct search_body_context body_ctx; |
0 | 628 |
608
debb8468514e
SEARCH CHARSET now works properly with message bodies, and in general body
Timo Sirainen <tss@iki.fi>
parents:
569
diff
changeset
|
629 memset(&body_ctx, 0, sizeof(body_ctx)); |
debb8468514e
SEARCH CHARSET now works properly with message bodies, and in general body
Timo Sirainen <tss@iki.fi>
parents:
569
diff
changeset
|
630 body_ctx.index_ctx = ctx; |
764
f57c52738f90
Renamed IBuffer and OBuffer to IStream and OStream which describes their
Timo Sirainen <tss@iki.fi>
parents:
761
diff
changeset
|
631 body_ctx.input = input; |
6280
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6277
diff
changeset
|
632 (void)mail_get_parts(ctx->mail, &body_ctx.part); |
608
debb8468514e
SEARCH CHARSET now works properly with message bodies, and in general body
Timo Sirainen <tss@iki.fi>
parents:
569
diff
changeset
|
633 |
8982
947fab5a8992
Search: Perform all lookups from cache before attempting any uncached lookups.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
634 ret = mail_search_args_foreach(args, search_body, &body_ctx); |
947fab5a8992
Search: Perform all lookups from cache before attempting any uncached lookups.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
635 } else { |
947fab5a8992
Search: Perform all lookups from cache before attempting any uncached lookups.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
636 /* see if we have a decision */ |
947fab5a8992
Search: Perform all lookups from cache before attempting any uncached lookups.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
637 ret = 1; |
947fab5a8992
Search: Perform all lookups from cache before attempting any uncached lookups.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
638 arg = ctx->mail_ctx.args->args; |
947fab5a8992
Search: Perform all lookups from cache before attempting any uncached lookups.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
639 for (; arg != NULL; arg = arg->next) { |
947fab5a8992
Search: Perform all lookups from cache before attempting any uncached lookups.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
640 if (arg->result == 0) { |
947fab5a8992
Search: Perform all lookups from cache before attempting any uncached lookups.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
641 ret = 0; |
947fab5a8992
Search: Perform all lookups from cache before attempting any uncached lookups.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
642 break; |
947fab5a8992
Search: Perform all lookups from cache before attempting any uncached lookups.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
643 } |
947fab5a8992
Search: Perform all lookups from cache before attempting any uncached lookups.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
644 if (arg->result < 0) |
947fab5a8992
Search: Perform all lookups from cache before attempting any uncached lookups.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
645 ret = -1; |
947fab5a8992
Search: Perform all lookups from cache before attempting any uncached lookups.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
646 } |
0 | 647 } |
8982
947fab5a8992
Search: Perform all lookups from cache before attempting any uncached lookups.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
648 return ret; |
0 | 649 } |
650 | |
6485
2eff72b212fe
Simplify search tree by canonicalizing message sets, converting NOT away
Timo Sirainen <tss@iki.fi>
parents:
6457
diff
changeset
|
651 static bool search_msgset_fix_limits(const struct mail_index_header *hdr, |
7619
56f55bd35aa5
Moved IMAP messageset handling to lib-imap/ and searching to lib-storage/.
Timo Sirainen <tss@iki.fi>
parents:
7618
diff
changeset
|
652 ARRAY_TYPE(seq_range) *seqset, bool not) |
4431
2461061327ed
NOT condition wasn't handled correctly in SEARCH.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4303
diff
changeset
|
653 { |
7619
56f55bd35aa5
Moved IMAP messageset handling to lib-imap/ and searching to lib-storage/.
Timo Sirainen <tss@iki.fi>
parents:
7618
diff
changeset
|
654 struct seq_range *range; |
56f55bd35aa5
Moved IMAP messageset handling to lib-imap/ and searching to lib-storage/.
Timo Sirainen <tss@iki.fi>
parents:
7618
diff
changeset
|
655 unsigned int count; |
4431
2461061327ed
NOT condition wasn't handled correctly in SEARCH.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4303
diff
changeset
|
656 |
7619
56f55bd35aa5
Moved IMAP messageset handling to lib-imap/ and searching to lib-storage/.
Timo Sirainen <tss@iki.fi>
parents:
7618
diff
changeset
|
657 i_assert(hdr->messages_count > 0); |
6485
2eff72b212fe
Simplify search tree by canonicalizing message sets, converting NOT away
Timo Sirainen <tss@iki.fi>
parents:
6457
diff
changeset
|
658 |
7619
56f55bd35aa5
Moved IMAP messageset handling to lib-imap/ and searching to lib-storage/.
Timo Sirainen <tss@iki.fi>
parents:
7618
diff
changeset
|
659 range = array_get_modifiable(seqset, &count); |
56f55bd35aa5
Moved IMAP messageset handling to lib-imap/ and searching to lib-storage/.
Timo Sirainen <tss@iki.fi>
parents:
7618
diff
changeset
|
660 if (count > 0) { |
56f55bd35aa5
Moved IMAP messageset handling to lib-imap/ and searching to lib-storage/.
Timo Sirainen <tss@iki.fi>
parents:
7618
diff
changeset
|
661 i_assert(range[0].seq1 != 0); |
56f55bd35aa5
Moved IMAP messageset handling to lib-imap/ and searching to lib-storage/.
Timo Sirainen <tss@iki.fi>
parents:
7618
diff
changeset
|
662 if (range[count-1].seq2 == (uint32_t)-1) { |
56f55bd35aa5
Moved IMAP messageset handling to lib-imap/ and searching to lib-storage/.
Timo Sirainen <tss@iki.fi>
parents:
7618
diff
changeset
|
663 /* "*" used, make sure the last message is in the range |
56f55bd35aa5
Moved IMAP messageset handling to lib-imap/ and searching to lib-storage/.
Timo Sirainen <tss@iki.fi>
parents:
7618
diff
changeset
|
664 (e.g. with count+1:* we still want to include it) */ |
56f55bd35aa5
Moved IMAP messageset handling to lib-imap/ and searching to lib-storage/.
Timo Sirainen <tss@iki.fi>
parents:
7618
diff
changeset
|
665 seq_range_array_add(seqset, 0, hdr->messages_count); |
6485
2eff72b212fe
Simplify search tree by canonicalizing message sets, converting NOT away
Timo Sirainen <tss@iki.fi>
parents:
6457
diff
changeset
|
666 } |
7619
56f55bd35aa5
Moved IMAP messageset handling to lib-imap/ and searching to lib-storage/.
Timo Sirainen <tss@iki.fi>
parents:
7618
diff
changeset
|
667 /* remove all non-existing messages */ |
56f55bd35aa5
Moved IMAP messageset handling to lib-imap/ and searching to lib-storage/.
Timo Sirainen <tss@iki.fi>
parents:
7618
diff
changeset
|
668 seq_range_array_remove_range(seqset, hdr->messages_count + 1, |
56f55bd35aa5
Moved IMAP messageset handling to lib-imap/ and searching to lib-storage/.
Timo Sirainen <tss@iki.fi>
parents:
7618
diff
changeset
|
669 (uint32_t)-1); |
6485
2eff72b212fe
Simplify search tree by canonicalizing message sets, converting NOT away
Timo Sirainen <tss@iki.fi>
parents:
6457
diff
changeset
|
670 } |
7619
56f55bd35aa5
Moved IMAP messageset handling to lib-imap/ and searching to lib-storage/.
Timo Sirainen <tss@iki.fi>
parents:
7618
diff
changeset
|
671 if (!not) |
56f55bd35aa5
Moved IMAP messageset handling to lib-imap/ and searching to lib-storage/.
Timo Sirainen <tss@iki.fi>
parents:
7618
diff
changeset
|
672 return array_count(seqset) > 0; |
56f55bd35aa5
Moved IMAP messageset handling to lib-imap/ and searching to lib-storage/.
Timo Sirainen <tss@iki.fi>
parents:
7618
diff
changeset
|
673 else { |
56f55bd35aa5
Moved IMAP messageset handling to lib-imap/ and searching to lib-storage/.
Timo Sirainen <tss@iki.fi>
parents:
7618
diff
changeset
|
674 /* if all messages are in the range, it can't match */ |
56f55bd35aa5
Moved IMAP messageset handling to lib-imap/ and searching to lib-storage/.
Timo Sirainen <tss@iki.fi>
parents:
7618
diff
changeset
|
675 range = array_get_modifiable(seqset, &count); |
7828
7caab06fb890
SEARCH: Fixed NOT <seqset> not matching anything.
Timo Sirainen <tss@iki.fi>
parents:
7805
diff
changeset
|
676 return range[0].seq1 != 1 || |
7caab06fb890
SEARCH: Fixed NOT <seqset> not matching anything.
Timo Sirainen <tss@iki.fi>
parents:
7805
diff
changeset
|
677 range[count-1].seq2 != hdr->messages_count; |
7619
56f55bd35aa5
Moved IMAP messageset handling to lib-imap/ and searching to lib-storage/.
Timo Sirainen <tss@iki.fi>
parents:
7618
diff
changeset
|
678 } |
6485
2eff72b212fe
Simplify search tree by canonicalizing message sets, converting NOT away
Timo Sirainen <tss@iki.fi>
parents:
6457
diff
changeset
|
679 } |
2eff72b212fe
Simplify search tree by canonicalizing message sets, converting NOT away
Timo Sirainen <tss@iki.fi>
parents:
6457
diff
changeset
|
680 |
2eff72b212fe
Simplify search tree by canonicalizing message sets, converting NOT away
Timo Sirainen <tss@iki.fi>
parents:
6457
diff
changeset
|
681 static void search_msgset_fix(const struct mail_index_header *hdr, |
7619
56f55bd35aa5
Moved IMAP messageset handling to lib-imap/ and searching to lib-storage/.
Timo Sirainen <tss@iki.fi>
parents:
7618
diff
changeset
|
682 ARRAY_TYPE(seq_range) *seqset, |
6485
2eff72b212fe
Simplify search tree by canonicalizing message sets, converting NOT away
Timo Sirainen <tss@iki.fi>
parents:
6457
diff
changeset
|
683 uint32_t *seq1_r, uint32_t *seq2_r, bool not) |
2eff72b212fe
Simplify search tree by canonicalizing message sets, converting NOT away
Timo Sirainen <tss@iki.fi>
parents:
6457
diff
changeset
|
684 { |
7619
56f55bd35aa5
Moved IMAP messageset handling to lib-imap/ and searching to lib-storage/.
Timo Sirainen <tss@iki.fi>
parents:
7618
diff
changeset
|
685 const struct seq_range *range; |
56f55bd35aa5
Moved IMAP messageset handling to lib-imap/ and searching to lib-storage/.
Timo Sirainen <tss@iki.fi>
parents:
7618
diff
changeset
|
686 unsigned int count; |
6485
2eff72b212fe
Simplify search tree by canonicalizing message sets, converting NOT away
Timo Sirainen <tss@iki.fi>
parents:
6457
diff
changeset
|
687 uint32_t min_seq, max_seq; |
2eff72b212fe
Simplify search tree by canonicalizing message sets, converting NOT away
Timo Sirainen <tss@iki.fi>
parents:
6457
diff
changeset
|
688 |
7619
56f55bd35aa5
Moved IMAP messageset handling to lib-imap/ and searching to lib-storage/.
Timo Sirainen <tss@iki.fi>
parents:
7618
diff
changeset
|
689 if (!search_msgset_fix_limits(hdr, seqset, not)) { |
6485
2eff72b212fe
Simplify search tree by canonicalizing message sets, converting NOT away
Timo Sirainen <tss@iki.fi>
parents:
6457
diff
changeset
|
690 *seq1_r = (uint32_t)-1; |
2eff72b212fe
Simplify search tree by canonicalizing message sets, converting NOT away
Timo Sirainen <tss@iki.fi>
parents:
6457
diff
changeset
|
691 *seq2_r = 0; |
2eff72b212fe
Simplify search tree by canonicalizing message sets, converting NOT away
Timo Sirainen <tss@iki.fi>
parents:
6457
diff
changeset
|
692 return; |
2eff72b212fe
Simplify search tree by canonicalizing message sets, converting NOT away
Timo Sirainen <tss@iki.fi>
parents:
6457
diff
changeset
|
693 } |
2eff72b212fe
Simplify search tree by canonicalizing message sets, converting NOT away
Timo Sirainen <tss@iki.fi>
parents:
6457
diff
changeset
|
694 |
7619
56f55bd35aa5
Moved IMAP messageset handling to lib-imap/ and searching to lib-storage/.
Timo Sirainen <tss@iki.fi>
parents:
7618
diff
changeset
|
695 range = array_get(seqset, &count); |
6485
2eff72b212fe
Simplify search tree by canonicalizing message sets, converting NOT away
Timo Sirainen <tss@iki.fi>
parents:
6457
diff
changeset
|
696 if (!not) { |
7619
56f55bd35aa5
Moved IMAP messageset handling to lib-imap/ and searching to lib-storage/.
Timo Sirainen <tss@iki.fi>
parents:
7618
diff
changeset
|
697 min_seq = range[0].seq1; |
56f55bd35aa5
Moved IMAP messageset handling to lib-imap/ and searching to lib-storage/.
Timo Sirainen <tss@iki.fi>
parents:
7618
diff
changeset
|
698 max_seq = range[count-1].seq2; |
6485
2eff72b212fe
Simplify search tree by canonicalizing message sets, converting NOT away
Timo Sirainen <tss@iki.fi>
parents:
6457
diff
changeset
|
699 } else { |
7619
56f55bd35aa5
Moved IMAP messageset handling to lib-imap/ and searching to lib-storage/.
Timo Sirainen <tss@iki.fi>
parents:
7618
diff
changeset
|
700 min_seq = range[0].seq1 > 1 ? 1 : range[0].seq2 + 1; |
56f55bd35aa5
Moved IMAP messageset handling to lib-imap/ and searching to lib-storage/.
Timo Sirainen <tss@iki.fi>
parents:
7618
diff
changeset
|
701 max_seq = range[count-1].seq2 < hdr->messages_count ? |
56f55bd35aa5
Moved IMAP messageset handling to lib-imap/ and searching to lib-storage/.
Timo Sirainen <tss@iki.fi>
parents:
7618
diff
changeset
|
702 hdr->messages_count : range[count-1].seq1 - 1; |
6485
2eff72b212fe
Simplify search tree by canonicalizing message sets, converting NOT away
Timo Sirainen <tss@iki.fi>
parents:
6457
diff
changeset
|
703 if (min_seq > max_seq) { |
5605
8b97d6bbff35
Don't try to handle 0 in messagesets by returning a nice error message.
Timo Sirainen <tss@iki.fi>
parents:
5599
diff
changeset
|
704 *seq1_r = (uint32_t)-1; |
8b97d6bbff35
Don't try to handle 0 in messagesets by returning a nice error message.
Timo Sirainen <tss@iki.fi>
parents:
5599
diff
changeset
|
705 *seq2_r = 0; |
8b97d6bbff35
Don't try to handle 0 in messagesets by returning a nice error message.
Timo Sirainen <tss@iki.fi>
parents:
5599
diff
changeset
|
706 return; |
0 | 707 } |
962
3b139ccc1858
SEARCH didn't properly complain about invalid messagesets. high:low never
Timo Sirainen <tss@iki.fi>
parents:
951
diff
changeset
|
708 } |
4439
12b5fbb3a05c
Searching (storing, fetching) with sequence sets containing commas was
Timo Sirainen <tss@iki.fi>
parents:
4438
diff
changeset
|
709 |
6485
2eff72b212fe
Simplify search tree by canonicalizing message sets, converting NOT away
Timo Sirainen <tss@iki.fi>
parents:
6457
diff
changeset
|
710 if (*seq1_r < min_seq || *seq1_r == 0) |
2eff72b212fe
Simplify search tree by canonicalizing message sets, converting NOT away
Timo Sirainen <tss@iki.fi>
parents:
6457
diff
changeset
|
711 *seq1_r = min_seq; |
2eff72b212fe
Simplify search tree by canonicalizing message sets, converting NOT away
Timo Sirainen <tss@iki.fi>
parents:
6457
diff
changeset
|
712 if (*seq2_r > max_seq) |
2eff72b212fe
Simplify search tree by canonicalizing message sets, converting NOT away
Timo Sirainen <tss@iki.fi>
parents:
6457
diff
changeset
|
713 *seq2_r = max_seq; |
0 | 714 } |
715 | |
6275
913b188f4dd4
Removed explicit locking from views and maps. They were already locked all
Timo Sirainen <tss@iki.fi>
parents:
5613
diff
changeset
|
716 static void search_or_parse_msgset_args(const struct mail_index_header *hdr, |
913b188f4dd4
Removed explicit locking from views and maps. They were already locked all
Timo Sirainen <tss@iki.fi>
parents:
5613
diff
changeset
|
717 struct mail_search_arg *args, |
6485
2eff72b212fe
Simplify search tree by canonicalizing message sets, converting NOT away
Timo Sirainen <tss@iki.fi>
parents:
6457
diff
changeset
|
718 uint32_t *seq1_r, uint32_t *seq2_r) |
4431
2461061327ed
NOT condition wasn't handled correctly in SEARCH.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4303
diff
changeset
|
719 { |
2461061327ed
NOT condition wasn't handled correctly in SEARCH.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4303
diff
changeset
|
720 uint32_t seq1, seq2, min_seq1 = 0, max_seq2 = 0; |
2461061327ed
NOT condition wasn't handled correctly in SEARCH.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4303
diff
changeset
|
721 |
2461061327ed
NOT condition wasn't handled correctly in SEARCH.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4303
diff
changeset
|
722 for (; args != NULL; args = args->next) { |
2461061327ed
NOT condition wasn't handled correctly in SEARCH.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4303
diff
changeset
|
723 seq1 = 1; seq2 = hdr->messages_count; |
2461061327ed
NOT condition wasn't handled correctly in SEARCH.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4303
diff
changeset
|
724 |
7908
1e69c84a1e5a
Search code cleanups and minor optimizations.
Timo Sirainen <tss@iki.fi>
parents:
7828
diff
changeset
|
725 switch (args->type) { |
1e69c84a1e5a
Search code cleanups and minor optimizations.
Timo Sirainen <tss@iki.fi>
parents:
7828
diff
changeset
|
726 case SEARCH_SUB: |
6485
2eff72b212fe
Simplify search tree by canonicalizing message sets, converting NOT away
Timo Sirainen <tss@iki.fi>
parents:
6457
diff
changeset
|
727 i_assert(!args->not); |
6275
913b188f4dd4
Removed explicit locking from views and maps. They were already locked all
Timo Sirainen <tss@iki.fi>
parents:
5613
diff
changeset
|
728 search_parse_msgset_args(hdr, args->value.subargs, |
6485
2eff72b212fe
Simplify search tree by canonicalizing message sets, converting NOT away
Timo Sirainen <tss@iki.fi>
parents:
6457
diff
changeset
|
729 &seq1, &seq2); |
7908
1e69c84a1e5a
Search code cleanups and minor optimizations.
Timo Sirainen <tss@iki.fi>
parents:
7828
diff
changeset
|
730 break; |
1e69c84a1e5a
Search code cleanups and minor optimizations.
Timo Sirainen <tss@iki.fi>
parents:
7828
diff
changeset
|
731 case SEARCH_OR: |
6485
2eff72b212fe
Simplify search tree by canonicalizing message sets, converting NOT away
Timo Sirainen <tss@iki.fi>
parents:
6457
diff
changeset
|
732 i_assert(!args->not); |
6275
913b188f4dd4
Removed explicit locking from views and maps. They were already locked all
Timo Sirainen <tss@iki.fi>
parents:
5613
diff
changeset
|
733 search_or_parse_msgset_args(hdr, args->value.subargs, |
6485
2eff72b212fe
Simplify search tree by canonicalizing message sets, converting NOT away
Timo Sirainen <tss@iki.fi>
parents:
6457
diff
changeset
|
734 &seq1, &seq2); |
7908
1e69c84a1e5a
Search code cleanups and minor optimizations.
Timo Sirainen <tss@iki.fi>
parents:
7828
diff
changeset
|
735 break; |
1e69c84a1e5a
Search code cleanups and minor optimizations.
Timo Sirainen <tss@iki.fi>
parents:
7828
diff
changeset
|
736 case SEARCH_SEQSET: |
6485
2eff72b212fe
Simplify search tree by canonicalizing message sets, converting NOT away
Timo Sirainen <tss@iki.fi>
parents:
6457
diff
changeset
|
737 search_msgset_fix(hdr, &args->value.seqset, |
2eff72b212fe
Simplify search tree by canonicalizing message sets, converting NOT away
Timo Sirainen <tss@iki.fi>
parents:
6457
diff
changeset
|
738 &seq1, &seq2, args->not); |
7908
1e69c84a1e5a
Search code cleanups and minor optimizations.
Timo Sirainen <tss@iki.fi>
parents:
7828
diff
changeset
|
739 break; |
1e69c84a1e5a
Search code cleanups and minor optimizations.
Timo Sirainen <tss@iki.fi>
parents:
7828
diff
changeset
|
740 default: |
1e69c84a1e5a
Search code cleanups and minor optimizations.
Timo Sirainen <tss@iki.fi>
parents:
7828
diff
changeset
|
741 break; |
4431
2461061327ed
NOT condition wasn't handled correctly in SEARCH.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4303
diff
changeset
|
742 } |
2461061327ed
NOT condition wasn't handled correctly in SEARCH.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4303
diff
changeset
|
743 |
2461061327ed
NOT condition wasn't handled correctly in SEARCH.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4303
diff
changeset
|
744 if (min_seq1 == 0) { |
2461061327ed
NOT condition wasn't handled correctly in SEARCH.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4303
diff
changeset
|
745 min_seq1 = seq1; |
2461061327ed
NOT condition wasn't handled correctly in SEARCH.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4303
diff
changeset
|
746 max_seq2 = seq2; |
2461061327ed
NOT condition wasn't handled correctly in SEARCH.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4303
diff
changeset
|
747 } else { |
2461061327ed
NOT condition wasn't handled correctly in SEARCH.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4303
diff
changeset
|
748 if (seq1 < min_seq1) |
2461061327ed
NOT condition wasn't handled correctly in SEARCH.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4303
diff
changeset
|
749 min_seq1 = seq1; |
2461061327ed
NOT condition wasn't handled correctly in SEARCH.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4303
diff
changeset
|
750 if (seq2 > max_seq2) |
2461061327ed
NOT condition wasn't handled correctly in SEARCH.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4303
diff
changeset
|
751 max_seq2 = seq2; |
2461061327ed
NOT condition wasn't handled correctly in SEARCH.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4303
diff
changeset
|
752 } |
2461061327ed
NOT condition wasn't handled correctly in SEARCH.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4303
diff
changeset
|
753 } |
2461061327ed
NOT condition wasn't handled correctly in SEARCH.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4303
diff
changeset
|
754 i_assert(min_seq1 != 0); |
2461061327ed
NOT condition wasn't handled correctly in SEARCH.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4303
diff
changeset
|
755 |
2461061327ed
NOT condition wasn't handled correctly in SEARCH.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4303
diff
changeset
|
756 if (min_seq1 > *seq1_r) |
2461061327ed
NOT condition wasn't handled correctly in SEARCH.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4303
diff
changeset
|
757 *seq1_r = min_seq1; |
2461061327ed
NOT condition wasn't handled correctly in SEARCH.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4303
diff
changeset
|
758 if (max_seq2 < *seq2_r) |
2461061327ed
NOT condition wasn't handled correctly in SEARCH.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4303
diff
changeset
|
759 *seq2_r = max_seq2; |
2461061327ed
NOT condition wasn't handled correctly in SEARCH.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4303
diff
changeset
|
760 } |
2461061327ed
NOT condition wasn't handled correctly in SEARCH.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4303
diff
changeset
|
761 |
6275
913b188f4dd4
Removed explicit locking from views and maps. They were already locked all
Timo Sirainen <tss@iki.fi>
parents:
5613
diff
changeset
|
762 static void search_parse_msgset_args(const struct mail_index_header *hdr, |
913b188f4dd4
Removed explicit locking from views and maps. They were already locked all
Timo Sirainen <tss@iki.fi>
parents:
5613
diff
changeset
|
763 struct mail_search_arg *args, |
6485
2eff72b212fe
Simplify search tree by canonicalizing message sets, converting NOT away
Timo Sirainen <tss@iki.fi>
parents:
6457
diff
changeset
|
764 uint32_t *seq1_r, uint32_t *seq2_r) |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
1845
diff
changeset
|
765 { |
4431
2461061327ed
NOT condition wasn't handled correctly in SEARCH.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4303
diff
changeset
|
766 for (; args != NULL; args = args->next) { |
7908
1e69c84a1e5a
Search code cleanups and minor optimizations.
Timo Sirainen <tss@iki.fi>
parents:
7828
diff
changeset
|
767 switch (args->type) { |
1e69c84a1e5a
Search code cleanups and minor optimizations.
Timo Sirainen <tss@iki.fi>
parents:
7828
diff
changeset
|
768 case SEARCH_SUB: |
6485
2eff72b212fe
Simplify search tree by canonicalizing message sets, converting NOT away
Timo Sirainen <tss@iki.fi>
parents:
6457
diff
changeset
|
769 i_assert(!args->not); |
6275
913b188f4dd4
Removed explicit locking from views and maps. They were already locked all
Timo Sirainen <tss@iki.fi>
parents:
5613
diff
changeset
|
770 search_parse_msgset_args(hdr, args->value.subargs, |
6485
2eff72b212fe
Simplify search tree by canonicalizing message sets, converting NOT away
Timo Sirainen <tss@iki.fi>
parents:
6457
diff
changeset
|
771 seq1_r, seq2_r); |
7908
1e69c84a1e5a
Search code cleanups and minor optimizations.
Timo Sirainen <tss@iki.fi>
parents:
7828
diff
changeset
|
772 break; |
1e69c84a1e5a
Search code cleanups and minor optimizations.
Timo Sirainen <tss@iki.fi>
parents:
7828
diff
changeset
|
773 case SEARCH_OR: |
4431
2461061327ed
NOT condition wasn't handled correctly in SEARCH.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4303
diff
changeset
|
774 /* go through our children and use the widest seqset |
2461061327ed
NOT condition wasn't handled correctly in SEARCH.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4303
diff
changeset
|
775 range */ |
6485
2eff72b212fe
Simplify search tree by canonicalizing message sets, converting NOT away
Timo Sirainen <tss@iki.fi>
parents:
6457
diff
changeset
|
776 i_assert(!args->not); |
6275
913b188f4dd4
Removed explicit locking from views and maps. They were already locked all
Timo Sirainen <tss@iki.fi>
parents:
5613
diff
changeset
|
777 search_or_parse_msgset_args(hdr, args->value.subargs, |
6485
2eff72b212fe
Simplify search tree by canonicalizing message sets, converting NOT away
Timo Sirainen <tss@iki.fi>
parents:
6457
diff
changeset
|
778 seq1_r, seq2_r); |
7908
1e69c84a1e5a
Search code cleanups and minor optimizations.
Timo Sirainen <tss@iki.fi>
parents:
7828
diff
changeset
|
779 break; |
1e69c84a1e5a
Search code cleanups and minor optimizations.
Timo Sirainen <tss@iki.fi>
parents:
7828
diff
changeset
|
780 case SEARCH_SEQSET: |
6485
2eff72b212fe
Simplify search tree by canonicalizing message sets, converting NOT away
Timo Sirainen <tss@iki.fi>
parents:
6457
diff
changeset
|
781 search_msgset_fix(hdr, &args->value.seqset, |
2eff72b212fe
Simplify search tree by canonicalizing message sets, converting NOT away
Timo Sirainen <tss@iki.fi>
parents:
6457
diff
changeset
|
782 seq1_r, seq2_r, args->not); |
7908
1e69c84a1e5a
Search code cleanups and minor optimizations.
Timo Sirainen <tss@iki.fi>
parents:
7828
diff
changeset
|
783 break; |
1e69c84a1e5a
Search code cleanups and minor optimizations.
Timo Sirainen <tss@iki.fi>
parents:
7828
diff
changeset
|
784 default: |
1e69c84a1e5a
Search code cleanups and minor optimizations.
Timo Sirainen <tss@iki.fi>
parents:
7828
diff
changeset
|
785 break; |
0 | 786 } |
787 } | |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
1845
diff
changeset
|
788 } |
962
3b139ccc1858
SEARCH didn't properly complain about invalid messagesets. high:low never
Timo Sirainen <tss@iki.fi>
parents:
951
diff
changeset
|
789 |
6275
913b188f4dd4
Removed explicit locking from views and maps. They were already locked all
Timo Sirainen <tss@iki.fi>
parents:
5613
diff
changeset
|
790 static void search_limit_lowwater(struct index_search_context *ctx, |
913b188f4dd4
Removed explicit locking from views and maps. They were already locked all
Timo Sirainen <tss@iki.fi>
parents:
5613
diff
changeset
|
791 uint32_t uid_lowwater, uint32_t *first_seq) |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
1845
diff
changeset
|
792 { |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
1845
diff
changeset
|
793 uint32_t seq1, seq2; |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
1845
diff
changeset
|
794 |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
1845
diff
changeset
|
795 if (uid_lowwater == 0) |
6275
913b188f4dd4
Removed explicit locking from views and maps. They were already locked all
Timo Sirainen <tss@iki.fi>
parents:
5613
diff
changeset
|
796 return; |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
1845
diff
changeset
|
797 |
6677
90bcf480312d
Renamed mail_index_lookup_uid_range() to mail_index_lookup_seq_range(), made
Timo Sirainen <tss@iki.fi>
parents:
6574
diff
changeset
|
798 mail_index_lookup_seq_range(ctx->view, uid_lowwater, (uint32_t)-1, |
6275
913b188f4dd4
Removed explicit locking from views and maps. They were already locked all
Timo Sirainen <tss@iki.fi>
parents:
5613
diff
changeset
|
799 &seq1, &seq2); |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
1845
diff
changeset
|
800 if (*first_seq < seq1) |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
1845
diff
changeset
|
801 *first_seq = seq1; |
0 | 802 } |
803 | |
6275
913b188f4dd4
Removed explicit locking from views and maps. They were already locked all
Timo Sirainen <tss@iki.fi>
parents:
5613
diff
changeset
|
804 static bool search_limit_by_flags(struct index_search_context *ctx, |
913b188f4dd4
Removed explicit locking from views and maps. They were already locked all
Timo Sirainen <tss@iki.fi>
parents:
5613
diff
changeset
|
805 const struct mail_index_header *hdr, |
913b188f4dd4
Removed explicit locking from views and maps. They were already locked all
Timo Sirainen <tss@iki.fi>
parents:
5613
diff
changeset
|
806 struct mail_search_arg *args, |
913b188f4dd4
Removed explicit locking from views and maps. They were already locked all
Timo Sirainen <tss@iki.fi>
parents:
5613
diff
changeset
|
807 uint32_t *seq1, uint32_t *seq2) |
442
2a25bf21557b
SEARCH SEEN, UNSEEN, DELETED, UNDELETED, RECENT, UNRECENT optimizations.
Timo Sirainen <tss@iki.fi>
parents:
441
diff
changeset
|
808 { |
2a25bf21557b
SEARCH SEEN, UNSEEN, DELETED, UNDELETED, RECENT, UNRECENT optimizations.
Timo Sirainen <tss@iki.fi>
parents:
441
diff
changeset
|
809 for (; args != NULL; args = args->next) { |
6962
659e4a606aae
Replaced SEARCH_<flag> with a generic SEARCH_FLAGS. Use value.size for
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
810 if (args->type != SEARCH_FLAGS) { |
659e4a606aae
Replaced SEARCH_<flag> with a generic SEARCH_FLAGS. Use value.size for
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
811 if (args->type == SEARCH_ALL) { |
659e4a606aae
Replaced SEARCH_<flag> with a generic SEARCH_FLAGS. Use value.size for
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
812 if (args->not) |
659e4a606aae
Replaced SEARCH_<flag> with a generic SEARCH_FLAGS. Use value.size for
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
813 return FALSE; |
659e4a606aae
Replaced SEARCH_<flag> with a generic SEARCH_FLAGS. Use value.size for
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
814 } |
659e4a606aae
Replaced SEARCH_<flag> with a generic SEARCH_FLAGS. Use value.size for
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
815 continue; |
659e4a606aae
Replaced SEARCH_<flag> with a generic SEARCH_FLAGS. Use value.size for
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
816 } |
659e4a606aae
Replaced SEARCH_<flag> with a generic SEARCH_FLAGS. Use value.size for
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
817 if ((args->value.flags & MAIL_SEEN) != 0) { |
442
2a25bf21557b
SEARCH SEEN, UNSEEN, DELETED, UNDELETED, RECENT, UNRECENT optimizations.
Timo Sirainen <tss@iki.fi>
parents:
441
diff
changeset
|
818 /* SEEN with 0 seen? */ |
2a25bf21557b
SEARCH SEEN, UNSEEN, DELETED, UNDELETED, RECENT, UNRECENT optimizations.
Timo Sirainen <tss@iki.fi>
parents:
441
diff
changeset
|
819 if (!args->not && hdr->seen_messages_count == 0) |
6275
913b188f4dd4
Removed explicit locking from views and maps. They were already locked all
Timo Sirainen <tss@iki.fi>
parents:
5613
diff
changeset
|
820 return FALSE; |
442
2a25bf21557b
SEARCH SEEN, UNSEEN, DELETED, UNDELETED, RECENT, UNRECENT optimizations.
Timo Sirainen <tss@iki.fi>
parents:
441
diff
changeset
|
821 |
1844
4c2678dd65f1
Some optimizations to messageset handling in search.
Timo Sirainen <tss@iki.fi>
parents:
1782
diff
changeset
|
822 if (hdr->seen_messages_count == hdr->messages_count) { |
4c2678dd65f1
Some optimizations to messageset handling in search.
Timo Sirainen <tss@iki.fi>
parents:
1782
diff
changeset
|
823 /* UNSEEN with all seen? */ |
4c2678dd65f1
Some optimizations to messageset handling in search.
Timo Sirainen <tss@iki.fi>
parents:
1782
diff
changeset
|
824 if (args->not) |
6275
913b188f4dd4
Removed explicit locking from views and maps. They were already locked all
Timo Sirainen <tss@iki.fi>
parents:
5613
diff
changeset
|
825 return FALSE; |
442
2a25bf21557b
SEARCH SEEN, UNSEEN, DELETED, UNDELETED, RECENT, UNRECENT optimizations.
Timo Sirainen <tss@iki.fi>
parents:
441
diff
changeset
|
826 |
1844
4c2678dd65f1
Some optimizations to messageset handling in search.
Timo Sirainen <tss@iki.fi>
parents:
1782
diff
changeset
|
827 /* SEEN with all seen */ |
4c2678dd65f1
Some optimizations to messageset handling in search.
Timo Sirainen <tss@iki.fi>
parents:
1782
diff
changeset
|
828 args->match_always = TRUE; |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
1845
diff
changeset
|
829 } else if (args->not) { |
1844
4c2678dd65f1
Some optimizations to messageset handling in search.
Timo Sirainen <tss@iki.fi>
parents:
1782
diff
changeset
|
830 /* UNSEEN with lowwater limiting */ |
6275
913b188f4dd4
Removed explicit locking from views and maps. They were already locked all
Timo Sirainen <tss@iki.fi>
parents:
5613
diff
changeset
|
831 search_limit_lowwater(ctx, |
913b188f4dd4
Removed explicit locking from views and maps. They were already locked all
Timo Sirainen <tss@iki.fi>
parents:
5613
diff
changeset
|
832 hdr->first_unseen_uid_lowwater, seq1); |
1844
4c2678dd65f1
Some optimizations to messageset handling in search.
Timo Sirainen <tss@iki.fi>
parents:
1782
diff
changeset
|
833 } |
6962
659e4a606aae
Replaced SEARCH_<flag> with a generic SEARCH_FLAGS. Use value.size for
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
834 } |
659e4a606aae
Replaced SEARCH_<flag> with a generic SEARCH_FLAGS. Use value.size for
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
835 if ((args->value.flags & MAIL_DELETED) != 0) { |
442
2a25bf21557b
SEARCH SEEN, UNSEEN, DELETED, UNDELETED, RECENT, UNRECENT optimizations.
Timo Sirainen <tss@iki.fi>
parents:
441
diff
changeset
|
836 /* DELETED with 0 deleted? */ |
2a25bf21557b
SEARCH SEEN, UNSEEN, DELETED, UNDELETED, RECENT, UNRECENT optimizations.
Timo Sirainen <tss@iki.fi>
parents:
441
diff
changeset
|
837 if (!args->not && hdr->deleted_messages_count == 0) |
6275
913b188f4dd4
Removed explicit locking from views and maps. They were already locked all
Timo Sirainen <tss@iki.fi>
parents:
5613
diff
changeset
|
838 return FALSE; |
442
2a25bf21557b
SEARCH SEEN, UNSEEN, DELETED, UNDELETED, RECENT, UNRECENT optimizations.
Timo Sirainen <tss@iki.fi>
parents:
441
diff
changeset
|
839 |
1844
4c2678dd65f1
Some optimizations to messageset handling in search.
Timo Sirainen <tss@iki.fi>
parents:
1782
diff
changeset
|
840 if (hdr->deleted_messages_count == |
4c2678dd65f1
Some optimizations to messageset handling in search.
Timo Sirainen <tss@iki.fi>
parents:
1782
diff
changeset
|
841 hdr->messages_count) { |
4c2678dd65f1
Some optimizations to messageset handling in search.
Timo Sirainen <tss@iki.fi>
parents:
1782
diff
changeset
|
842 /* UNDELETED with all deleted? */ |
4c2678dd65f1
Some optimizations to messageset handling in search.
Timo Sirainen <tss@iki.fi>
parents:
1782
diff
changeset
|
843 if (args->not) |
6275
913b188f4dd4
Removed explicit locking from views and maps. They were already locked all
Timo Sirainen <tss@iki.fi>
parents:
5613
diff
changeset
|
844 return FALSE; |
442
2a25bf21557b
SEARCH SEEN, UNSEEN, DELETED, UNDELETED, RECENT, UNRECENT optimizations.
Timo Sirainen <tss@iki.fi>
parents:
441
diff
changeset
|
845 |
1844
4c2678dd65f1
Some optimizations to messageset handling in search.
Timo Sirainen <tss@iki.fi>
parents:
1782
diff
changeset
|
846 /* DELETED with all deleted */ |
4c2678dd65f1
Some optimizations to messageset handling in search.
Timo Sirainen <tss@iki.fi>
parents:
1782
diff
changeset
|
847 args->match_always = TRUE; |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
1845
diff
changeset
|
848 } else if (!args->not) { |
1844
4c2678dd65f1
Some optimizations to messageset handling in search.
Timo Sirainen <tss@iki.fi>
parents:
1782
diff
changeset
|
849 /* DELETED with lowwater limiting */ |
6275
913b188f4dd4
Removed explicit locking from views and maps. They were already locked all
Timo Sirainen <tss@iki.fi>
parents:
5613
diff
changeset
|
850 search_limit_lowwater(ctx, |
913b188f4dd4
Removed explicit locking from views and maps. They were already locked all
Timo Sirainen <tss@iki.fi>
parents:
5613
diff
changeset
|
851 hdr->first_deleted_uid_lowwater, seq1); |
1844
4c2678dd65f1
Some optimizations to messageset handling in search.
Timo Sirainen <tss@iki.fi>
parents:
1782
diff
changeset
|
852 } |
442
2a25bf21557b
SEARCH SEEN, UNSEEN, DELETED, UNDELETED, RECENT, UNRECENT optimizations.
Timo Sirainen <tss@iki.fi>
parents:
441
diff
changeset
|
853 } |
962
3b139ccc1858
SEARCH didn't properly complain about invalid messagesets. high:low never
Timo Sirainen <tss@iki.fi>
parents:
951
diff
changeset
|
854 } |
3b139ccc1858
SEARCH didn't properly complain about invalid messagesets. high:low never
Timo Sirainen <tss@iki.fi>
parents:
951
diff
changeset
|
855 |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
1845
diff
changeset
|
856 return *seq1 <= *seq2; |
327
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
857 } |
0 | 858 |
6275
913b188f4dd4
Removed explicit locking from views and maps. They were already locked all
Timo Sirainen <tss@iki.fi>
parents:
5613
diff
changeset
|
859 static void search_get_seqset(struct index_search_context *ctx, |
913b188f4dd4
Removed explicit locking from views and maps. They were already locked all
Timo Sirainen <tss@iki.fi>
parents:
5613
diff
changeset
|
860 struct mail_search_arg *args) |
327
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
861 { |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
1845
diff
changeset
|
862 const struct mail_index_header *hdr; |
0 | 863 |
2892
62d53b49110d
Changed mail_index_get_header() to return the header as return value because
Timo Sirainen <tss@iki.fi>
parents:
2883
diff
changeset
|
864 hdr = mail_index_get_header(ctx->view); |
1985
3ccd4eb52ee4
don't crash when requesting messages from empty mailbox
Timo Sirainen <tss@iki.fi>
parents:
1958
diff
changeset
|
865 if (hdr->messages_count == 0) { |
2899
1a05764af1e0
UID FETCH * gave error message with empty mailbox.
Timo Sirainen <tss@iki.fi>
parents:
2892
diff
changeset
|
866 /* no messages, don't check sequence ranges. although we could |
1a05764af1e0
UID FETCH * gave error message with empty mailbox.
Timo Sirainen <tss@iki.fi>
parents:
2892
diff
changeset
|
867 give error message then for FETCH, we shouldn't do it for |
1a05764af1e0
UID FETCH * gave error message with empty mailbox.
Timo Sirainen <tss@iki.fi>
parents:
2892
diff
changeset
|
868 UID FETCH. */ |
1985
3ccd4eb52ee4
don't crash when requesting messages from empty mailbox
Timo Sirainen <tss@iki.fi>
parents:
1958
diff
changeset
|
869 ctx->seq1 = 1; |
3ccd4eb52ee4
don't crash when requesting messages from empty mailbox
Timo Sirainen <tss@iki.fi>
parents:
1958
diff
changeset
|
870 ctx->seq2 = 0; |
6275
913b188f4dd4
Removed explicit locking from views and maps. They were already locked all
Timo Sirainen <tss@iki.fi>
parents:
5613
diff
changeset
|
871 return; |
1985
3ccd4eb52ee4
don't crash when requesting messages from empty mailbox
Timo Sirainen <tss@iki.fi>
parents:
1958
diff
changeset
|
872 } |
3ccd4eb52ee4
don't crash when requesting messages from empty mailbox
Timo Sirainen <tss@iki.fi>
parents:
1958
diff
changeset
|
873 |
4431
2461061327ed
NOT condition wasn't handled correctly in SEARCH.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4303
diff
changeset
|
874 ctx->seq1 = 1; |
2461061327ed
NOT condition wasn't handled correctly in SEARCH.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4303
diff
changeset
|
875 ctx->seq2 = hdr->messages_count; |
2461061327ed
NOT condition wasn't handled correctly in SEARCH.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4303
diff
changeset
|
876 |
6485
2eff72b212fe
Simplify search tree by canonicalizing message sets, converting NOT away
Timo Sirainen <tss@iki.fi>
parents:
6457
diff
changeset
|
877 search_parse_msgset_args(hdr, args, &ctx->seq1, &ctx->seq2); |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
1845
diff
changeset
|
878 if (ctx->seq1 == 0) { |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
1845
diff
changeset
|
879 ctx->seq1 = 1; |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
1845
diff
changeset
|
880 ctx->seq2 = hdr->messages_count; |
327
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
881 } |
4438
00db36e1b734
Don't crash when different search conditions reduce the search range so that
Timo Sirainen <tss@iki.fi>
parents:
4432
diff
changeset
|
882 if (ctx->seq1 > ctx->seq2) { |
4432
c13d8fe698f8
Don't crash if seqset restrictions caused no messages to be searched.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4431
diff
changeset
|
883 /* no matches */ |
6275
913b188f4dd4
Removed explicit locking from views and maps. They were already locked all
Timo Sirainen <tss@iki.fi>
parents:
5613
diff
changeset
|
884 return; |
4432
c13d8fe698f8
Don't crash if seqset restrictions caused no messages to be searched.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4431
diff
changeset
|
885 } |
327
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
886 |
442
2a25bf21557b
SEARCH SEEN, UNSEEN, DELETED, UNDELETED, RECENT, UNRECENT optimizations.
Timo Sirainen <tss@iki.fi>
parents:
441
diff
changeset
|
887 /* UNSEEN and DELETED in root search level may limit the range */ |
6275
913b188f4dd4
Removed explicit locking from views and maps. They were already locked all
Timo Sirainen <tss@iki.fi>
parents:
5613
diff
changeset
|
888 if (!search_limit_by_flags(ctx, hdr, args, &ctx->seq1, &ctx->seq2)) { |
4196
6ac0d63b297f
Optimized searching a bit for cases where we can restrict search range by
Timo Sirainen <tss@iki.fi>
parents:
4062
diff
changeset
|
889 /* no matches */ |
6ac0d63b297f
Optimized searching a bit for cases where we can restrict search range by
Timo Sirainen <tss@iki.fi>
parents:
4062
diff
changeset
|
890 ctx->seq1 = 1; |
6ac0d63b297f
Optimized searching a bit for cases where we can restrict search range by
Timo Sirainen <tss@iki.fi>
parents:
4062
diff
changeset
|
891 ctx->seq2 = 0; |
6ac0d63b297f
Optimized searching a bit for cases where we can restrict search range by
Timo Sirainen <tss@iki.fi>
parents:
4062
diff
changeset
|
892 } |
0 | 893 } |
894 | |
7909
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
895 static int search_build_subthread(struct mail_thread_iterate_context *iter, |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
896 ARRAY_TYPE(seq_range) *uids) |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
897 { |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
898 struct mail_thread_iterate_context *child_iter; |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
899 const struct mail_thread_child_node *node; |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
900 int ret = 0; |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
901 |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
902 while ((node = mail_thread_iterate_next(iter, &child_iter)) != NULL) { |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
903 if (child_iter != NULL) { |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
904 if (search_build_subthread(child_iter, uids) < 0) |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
905 ret = -1; |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
906 } |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
907 seq_range_array_add(uids, 0, node->uid); |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
908 } |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
909 if (mail_thread_iterate_deinit(&iter) < 0) |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
910 ret = -1; |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
911 return ret; |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
912 } |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
913 |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
914 static int search_build_inthread_result(struct index_search_context *ctx, |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
915 struct mail_search_arg *arg) |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
916 { |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
917 struct mail_thread_iterate_context *iter, *child_iter; |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
918 const struct mail_thread_child_node *node; |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
919 const ARRAY_TYPE(seq_range) *search_uids; |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
920 ARRAY_TYPE(seq_range) thread_uids; |
8074
05565bfadc6b
INTHREAD search may have failed randomly.
Timo Sirainen <tss@iki.fi>
parents:
8011
diff
changeset
|
921 int ret = 0; |
7909
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
922 |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
923 p_array_init(&arg->value.seqset, ctx->mail_ctx.args->pool, 64); |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
924 if (mailbox_search_result_build(ctx->mail_ctx.transaction, |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
925 arg->value.search_args, |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
926 MAILBOX_SEARCH_RESULT_FLAG_UPDATE | |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
927 MAILBOX_SEARCH_RESULT_FLAG_QUEUE_SYNC, |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
928 &arg->value.search_result) < 0) |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
929 return -1; |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
930 if (ctx->thread_ctx == NULL) { |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
931 /* failed earlier */ |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
932 return -1; |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
933 } |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
934 |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
935 search_uids = mailbox_search_result_get(arg->value.search_result); |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
936 if (array_count(search_uids) == 0) { |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
937 /* search found nothing - no threads can match */ |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
938 return 0; |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
939 } |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
940 |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
941 t_array_init(&thread_uids, 128); |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
942 iter = mail_thread_iterate_init(ctx->thread_ctx, |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
943 arg->value.thread_type, FALSE); |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
944 while ((node = mail_thread_iterate_next(iter, &child_iter)) != NULL) { |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
945 seq_range_array_add(&thread_uids, 0, node->uid); |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
946 if (child_iter != NULL) { |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
947 if (search_build_subthread(child_iter, |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
948 &thread_uids) < 0) |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
949 ret = -1; |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
950 } |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
951 if (seq_range_array_have_common(&thread_uids, search_uids)) { |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
952 /* yes, we want this thread */ |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
953 seq_range_array_merge(&arg->value.seqset, &thread_uids); |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
954 } |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
955 array_clear(&thread_uids); |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
956 } |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
957 if (mail_thread_iterate_deinit(&iter) < 0) |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
958 ret = -1; |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
959 return ret; |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
960 } |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
961 |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
962 static int search_build_inthreads(struct index_search_context *ctx, |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
963 struct mail_search_arg *arg) |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
964 { |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
965 int ret = 0; |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
966 |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
967 for (; arg != NULL; arg = arg->next) { |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
968 switch (arg->type) { |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
969 case SEARCH_OR: |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
970 case SEARCH_SUB: |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
971 if (search_build_inthreads(ctx, arg->value.subargs) < 0) |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
972 ret = -1; |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
973 break; |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
974 case SEARCH_INTHREAD: |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
975 if (search_build_inthread_result(ctx, arg) < 0) |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
976 ret = -1; |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
977 break; |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
978 default: |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
979 break; |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
980 } |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
981 } |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
982 return ret; |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
983 } |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
984 |
988
8028c4dcf38f
mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents:
962
diff
changeset
|
985 struct mail_search_context * |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
1845
diff
changeset
|
986 index_storage_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:
7640
diff
changeset
|
987 struct mail_search_args *args, |
3209
923ff19873d4
Major mail-storage API changes. It's now a bit cleaner and much more plugin
Timo Sirainen <tss@iki.fi>
parents:
3039
diff
changeset
|
988 const enum mail_sort_type *sort_program) |
0 | 989 { |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
1845
diff
changeset
|
990 struct index_transaction_context *t = |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
1845
diff
changeset
|
991 (struct index_transaction_context *)_t; |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
1845
diff
changeset
|
992 struct index_search_context *ctx; |
8507
f323bf2465bd
Give more correct "* OK searched n%" notifications with fts and virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8497
diff
changeset
|
993 const struct mail_index_header *hdr; |
988
8028c4dcf38f
mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents:
962
diff
changeset
|
994 |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
1845
diff
changeset
|
995 ctx = i_new(struct index_search_context, 1); |
3209
923ff19873d4
Major mail-storage API changes. It's now a bit cleaner and much more plugin
Timo Sirainen <tss@iki.fi>
parents:
3039
diff
changeset
|
996 ctx->mail_ctx.transaction = _t; |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
1845
diff
changeset
|
997 ctx->ibox = t->ibox; |
2224
a816e2d88406
Added mail_index_transaction_get_updated_view() which can be used to access
Timo Sirainen <tss@iki.fi>
parents:
2190
diff
changeset
|
998 ctx->view = t->trans_view; |
4607
71b3570946f8
Moved some search parameters to public struct mail_search_context and added
Timo Sirainen <tss@iki.fi>
parents:
4439
diff
changeset
|
999 ctx->mail_ctx.args = args; |
71b3570946f8
Moved some search parameters to public struct mail_search_context and added
Timo Sirainen <tss@iki.fi>
parents:
4439
diff
changeset
|
1000 ctx->mail_ctx.sort_program = index_sort_program_init(_t, sort_program); |
988
8028c4dcf38f
mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents:
962
diff
changeset
|
1001 |
8507
f323bf2465bd
Give more correct "* OK searched n%" notifications with fts and virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8497
diff
changeset
|
1002 hdr = mail_index_get_header(t->ibox->view); |
f323bf2465bd
Give more correct "* OK searched n%" notifications with fts and virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8497
diff
changeset
|
1003 ctx->mail_ctx.progress_max = hdr->messages_count; |
f323bf2465bd
Give more correct "* OK searched n%" notifications with fts and virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8497
diff
changeset
|
1004 |
7647
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
7642
diff
changeset
|
1005 i_array_init(&ctx->mail_ctx.results, 5); |
4607
71b3570946f8
Moved some search parameters to public struct mail_search_context and added
Timo Sirainen <tss@iki.fi>
parents:
4439
diff
changeset
|
1006 array_create(&ctx->mail_ctx.module_contexts, default_pool, |
71b3570946f8
Moved some search parameters to public struct mail_search_context and added
Timo Sirainen <tss@iki.fi>
parents:
4439
diff
changeset
|
1007 sizeof(void *), 5); |
71b3570946f8
Moved some search parameters to public struct mail_search_context and added
Timo Sirainen <tss@iki.fi>
parents:
4439
diff
changeset
|
1008 |
7642
077bb84e9e77
Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents:
7640
diff
changeset
|
1009 mail_search_args_reset(ctx->mail_ctx.args->args, TRUE); |
7909
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
1010 if (args->have_inthreads) { |
8146
70b53e9b232e
Rewrote thread indexing code. It's a lot simpler and takes less disk space.
Timo Sirainen <tss@iki.fi>
parents:
8077
diff
changeset
|
1011 if (mail_thread_init(_t->box, NULL, &ctx->thread_ctx) < 0) |
7909
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
1012 ctx->failed = TRUE; |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
1013 if (search_build_inthreads(ctx, args->args) < 0) |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
1014 ctx->failed = TRUE; |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
1015 } |
1844
4c2678dd65f1
Some optimizations to messageset handling in search.
Timo Sirainen <tss@iki.fi>
parents:
1782
diff
changeset
|
1016 |
7642
077bb84e9e77
Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents:
7640
diff
changeset
|
1017 search_get_seqset(ctx, args->args); |
077bb84e9e77
Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents:
7640
diff
changeset
|
1018 (void)mail_search_args_foreach(args->args, search_init_arg, ctx); |
6275
913b188f4dd4
Removed explicit locking from views and maps. They were already locked all
Timo Sirainen <tss@iki.fi>
parents:
5613
diff
changeset
|
1019 |
913b188f4dd4
Removed explicit locking from views and maps. They were already locked all
Timo Sirainen <tss@iki.fi>
parents:
5613
diff
changeset
|
1020 /* Need to reset results for match_always cases */ |
7642
077bb84e9e77
Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents:
7640
diff
changeset
|
1021 mail_search_args_reset(ctx->mail_ctx.args->args, FALSE); |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
1845
diff
changeset
|
1022 return &ctx->mail_ctx; |
988
8028c4dcf38f
mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents:
962
diff
changeset
|
1023 } |
8028c4dcf38f
mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents:
962
diff
changeset
|
1024 |
5527 | 1025 static void search_arg_deinit(struct mail_search_arg *arg, |
6411
6a64e64fa3a3
Renamed __attr_*__ to ATTR_*. Renamed __attrs_used__ to ATTRS_DEFINED.
Timo Sirainen <tss@iki.fi>
parents:
6280
diff
changeset
|
1026 void *context ATTR_UNUSED) |
5527 | 1027 { |
1028 struct message_search_context *search_ctx = arg->context; | |
1029 | |
1030 if (search_ctx != NULL) { | |
1031 message_search_deinit(&search_ctx); | |
1032 arg->context = NULL; | |
1033 } | |
1034 } | |
1035 | |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
1845
diff
changeset
|
1036 int index_storage_search_deinit(struct mail_search_context *_ctx) |
988
8028c4dcf38f
mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents:
962
diff
changeset
|
1037 { |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
1845
diff
changeset
|
1038 struct index_search_context *ctx = (struct index_search_context *)_ctx; |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
1845
diff
changeset
|
1039 int ret; |
988
8028c4dcf38f
mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents:
962
diff
changeset
|
1040 |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
1845
diff
changeset
|
1041 ret = ctx->failed || ctx->error != NULL ? -1 : 0; |
988
8028c4dcf38f
mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents:
962
diff
changeset
|
1042 |
8028c4dcf38f
mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents:
962
diff
changeset
|
1043 if (ctx->error != NULL) { |
8028c4dcf38f
mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents:
962
diff
changeset
|
1044 mail_storage_set_error(ctx->ibox->box.storage, |
5613 | 1045 MAIL_ERROR_PARAMS, ctx->error); |
962
3b139ccc1858
SEARCH didn't properly complain about invalid messagesets. high:low never
Timo Sirainen <tss@iki.fi>
parents:
951
diff
changeset
|
1046 } |
327
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
1047 |
7642
077bb84e9e77
Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents:
7640
diff
changeset
|
1048 mail_search_args_reset(ctx->mail_ctx.args->args, FALSE); |
077bb84e9e77
Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents:
7640
diff
changeset
|
1049 (void)mail_search_args_foreach(ctx->mail_ctx.args->args, |
5527 | 1050 search_arg_deinit, NULL); |
1051 | |
4607
71b3570946f8
Moved some search parameters to public struct mail_search_context and added
Timo Sirainen <tss@iki.fi>
parents:
4439
diff
changeset
|
1052 if (ctx->mail_ctx.sort_program != NULL) |
71b3570946f8
Moved some search parameters to public struct mail_search_context and added
Timo Sirainen <tss@iki.fi>
parents:
4439
diff
changeset
|
1053 index_sort_program_deinit(&ctx->mail_ctx.sort_program); |
7909
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
1054 if (ctx->thread_ctx != NULL) |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
1055 mail_thread_deinit(&ctx->thread_ctx); |
7647
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
7642
diff
changeset
|
1056 array_free(&ctx->mail_ctx.results); |
4607
71b3570946f8
Moved some search parameters to public struct mail_search_context and added
Timo Sirainen <tss@iki.fi>
parents:
4439
diff
changeset
|
1057 array_free(&ctx->mail_ctx.module_contexts); |
988
8028c4dcf38f
mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents:
962
diff
changeset
|
1058 i_free(ctx); |
8028c4dcf38f
mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents:
962
diff
changeset
|
1059 return ret; |
8028c4dcf38f
mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents:
962
diff
changeset
|
1060 } |
327
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
1061 |
3863
55df57c028d4
Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents:
3795
diff
changeset
|
1062 static bool search_match_next(struct index_search_context *ctx) |
1672
8920600a8cfc
Index cache file rewrite. It's not finished yet and mbox support is
Timo Sirainen <tss@iki.fi>
parents:
1638
diff
changeset
|
1063 { |
8982
947fab5a8992
Search: Perform all lookups from cache before attempting any uncached lookups.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
1064 static enum mail_lookup_abort cache_lookups[] = { |
947fab5a8992
Search: Perform all lookups from cache before attempting any uncached lookups.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
1065 MAIL_LOOKUP_ABORT_NOT_IN_CACHE, |
947fab5a8992
Search: Perform all lookups from cache before attempting any uncached lookups.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
1066 MAIL_LOOKUP_ABORT_READ_MAIL, |
947fab5a8992
Search: Perform all lookups from cache before attempting any uncached lookups.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
1067 MAIL_LOOKUP_ABORT_NEVER |
947fab5a8992
Search: Perform all lookups from cache before attempting any uncached lookups.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
1068 }; |
947fab5a8992
Search: Perform all lookups from cache before attempting any uncached lookups.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
1069 unsigned int i; |
947fab5a8992
Search: Perform all lookups from cache before attempting any uncached lookups.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
1070 int ret = -1; |
1672
8920600a8cfc
Index cache file rewrite. It's not finished yet and mbox support is
Timo Sirainen <tss@iki.fi>
parents:
1638
diff
changeset
|
1071 |
8982
947fab5a8992
Search: Perform all lookups from cache before attempting any uncached lookups.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
1072 /* try to avoid doing extra work for as long as possible */ |
947fab5a8992
Search: Perform all lookups from cache before attempting any uncached lookups.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
1073 for (i = 0; i < N_ELEMENTS(cache_lookups) && ret < 0; i++) { |
947fab5a8992
Search: Perform all lookups from cache before attempting any uncached lookups.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
1074 ctx->mail->lookup_abort = cache_lookups[i]; |
947fab5a8992
Search: Perform all lookups from cache before attempting any uncached lookups.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
1075 ret = mail_search_args_foreach(ctx->mail_ctx.args->args, |
947fab5a8992
Search: Perform all lookups from cache before attempting any uncached lookups.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
1076 search_cached_arg, ctx); |
947fab5a8992
Search: Perform all lookups from cache before attempting any uncached lookups.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
1077 if (ret >= 0) |
947fab5a8992
Search: Perform all lookups from cache before attempting any uncached lookups.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
1078 break; |
1672
8920600a8cfc
Index cache file rewrite. It's not finished yet and mbox support is
Timo Sirainen <tss@iki.fi>
parents:
1638
diff
changeset
|
1079 |
8982
947fab5a8992
Search: Perform all lookups from cache before attempting any uncached lookups.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
1080 ret = search_arg_match_text(ctx->mail_ctx.args->args, ctx); |
947fab5a8992
Search: Perform all lookups from cache before attempting any uncached lookups.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
1081 if (ret >= 0) |
947fab5a8992
Search: Perform all lookups from cache before attempting any uncached lookups.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
1082 break; |
1672
8920600a8cfc
Index cache file rewrite. It's not finished yet and mbox support is
Timo Sirainen <tss@iki.fi>
parents:
1638
diff
changeset
|
1083 } |
8982
947fab5a8992
Search: Perform all lookups from cache before attempting any uncached lookups.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
1084 ctx->mail->lookup_abort = MAIL_LOOKUP_ABORT_NEVER; |
947fab5a8992
Search: Perform all lookups from cache before attempting any uncached lookups.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
1085 return ret > 0; |
1672
8920600a8cfc
Index cache file rewrite. It's not finished yet and mbox support is
Timo Sirainen <tss@iki.fi>
parents:
1638
diff
changeset
|
1086 } |
8920600a8cfc
Index cache file rewrite. It's not finished yet and mbox support is
Timo Sirainen <tss@iki.fi>
parents:
1638
diff
changeset
|
1087 |
4949
a959d4208b54
Moved storage callbacks to struct mail_storage. If searching takes over 10
Timo Sirainen <tss@iki.fi>
parents:
4942
diff
changeset
|
1088 static void index_storage_search_notify(struct mailbox *box, |
a959d4208b54
Moved storage callbacks to struct mail_storage. If searching takes over 10
Timo Sirainen <tss@iki.fi>
parents:
4942
diff
changeset
|
1089 struct index_search_context *ctx) |
a959d4208b54
Moved storage callbacks to struct mail_storage. If searching takes over 10
Timo Sirainen <tss@iki.fi>
parents:
4942
diff
changeset
|
1090 { |
a959d4208b54
Moved storage callbacks to struct mail_storage. If searching takes over 10
Timo Sirainen <tss@iki.fi>
parents:
4942
diff
changeset
|
1091 float percentage; |
a959d4208b54
Moved storage callbacks to struct mail_storage. If searching takes over 10
Timo Sirainen <tss@iki.fi>
parents:
4942
diff
changeset
|
1092 unsigned int msecs, secs; |
a959d4208b54
Moved storage callbacks to struct mail_storage. If searching takes over 10
Timo Sirainen <tss@iki.fi>
parents:
4942
diff
changeset
|
1093 |
a959d4208b54
Moved storage callbacks to struct mail_storage. If searching takes over 10
Timo Sirainen <tss@iki.fi>
parents:
4942
diff
changeset
|
1094 if (ctx->last_notify.tv_sec == 0) { |
a959d4208b54
Moved storage callbacks to struct mail_storage. If searching takes over 10
Timo Sirainen <tss@iki.fi>
parents:
4942
diff
changeset
|
1095 /* set the search time in here, in case a plugin |
a959d4208b54
Moved storage callbacks to struct mail_storage. If searching takes over 10
Timo Sirainen <tss@iki.fi>
parents:
4942
diff
changeset
|
1096 already spent some time indexing the mailbox */ |
a959d4208b54
Moved storage callbacks to struct mail_storage. If searching takes over 10
Timo Sirainen <tss@iki.fi>
parents:
4942
diff
changeset
|
1097 ctx->search_start_time = ioloop_timeval; |
8508
689a63a99363
fts: Hide "Searching .." notify while indexing.
Timo Sirainen <tss@iki.fi>
parents:
8507
diff
changeset
|
1098 } else if (box->storage->callbacks->notify_ok != NULL && |
689a63a99363
fts: Hide "Searching .." notify while indexing.
Timo Sirainen <tss@iki.fi>
parents:
8507
diff
changeset
|
1099 !ctx->mail_ctx.progress_hidden) { |
8507
f323bf2465bd
Give more correct "* OK searched n%" notifications with fts and virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8497
diff
changeset
|
1100 percentage = ctx->mail_ctx.progress_cur * 100.0 / |
f323bf2465bd
Give more correct "* OK searched n%" notifications with fts and virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8497
diff
changeset
|
1101 ctx->mail_ctx.progress_max; |
4949
a959d4208b54
Moved storage callbacks to struct mail_storage. If searching takes over 10
Timo Sirainen <tss@iki.fi>
parents:
4942
diff
changeset
|
1102 msecs = (ioloop_timeval.tv_sec - |
a959d4208b54
Moved storage callbacks to struct mail_storage. If searching takes over 10
Timo Sirainen <tss@iki.fi>
parents:
4942
diff
changeset
|
1103 ctx->search_start_time.tv_sec) * 1000 + |
a959d4208b54
Moved storage callbacks to struct mail_storage. If searching takes over 10
Timo Sirainen <tss@iki.fi>
parents:
4942
diff
changeset
|
1104 (ioloop_timeval.tv_usec - |
a959d4208b54
Moved storage callbacks to struct mail_storage. If searching takes over 10
Timo Sirainen <tss@iki.fi>
parents:
4942
diff
changeset
|
1105 ctx->search_start_time.tv_usec) / 1000; |
a959d4208b54
Moved storage callbacks to struct mail_storage. If searching takes over 10
Timo Sirainen <tss@iki.fi>
parents:
4942
diff
changeset
|
1106 secs = (msecs / (percentage / 100.0) - msecs) / 1000; |
a959d4208b54
Moved storage callbacks to struct mail_storage. If searching takes over 10
Timo Sirainen <tss@iki.fi>
parents:
4942
diff
changeset
|
1107 |
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
|
1108 T_BEGIN { |
6940
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6899
diff
changeset
|
1109 const char *text; |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6899
diff
changeset
|
1110 |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6899
diff
changeset
|
1111 text = t_strdup_printf("Searched %d%% of the mailbox, " |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6899
diff
changeset
|
1112 "ETA %d:%02d", (int)percentage, |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6899
diff
changeset
|
1113 secs/60, secs%60); |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6899
diff
changeset
|
1114 box->storage->callbacks-> |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6899
diff
changeset
|
1115 notify_ok(box, text, |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6899
diff
changeset
|
1116 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
|
1117 } T_END; |
4949
a959d4208b54
Moved storage callbacks to struct mail_storage. If searching takes over 10
Timo Sirainen <tss@iki.fi>
parents:
4942
diff
changeset
|
1118 } |
a959d4208b54
Moved storage callbacks to struct mail_storage. If searching takes over 10
Timo Sirainen <tss@iki.fi>
parents:
4942
diff
changeset
|
1119 ctx->last_notify = ioloop_timeval; |
a959d4208b54
Moved storage callbacks to struct mail_storage. If searching takes over 10
Timo Sirainen <tss@iki.fi>
parents:
4942
diff
changeset
|
1120 } |
a959d4208b54
Moved storage callbacks to struct mail_storage. If searching takes over 10
Timo Sirainen <tss@iki.fi>
parents:
4942
diff
changeset
|
1121 |
7647
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
7642
diff
changeset
|
1122 static bool search_arg_is_static(struct mail_search_arg *arg) |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
7642
diff
changeset
|
1123 { |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
7642
diff
changeset
|
1124 struct mail_search_arg *subarg; |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
7642
diff
changeset
|
1125 |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
7642
diff
changeset
|
1126 switch (arg->type) { |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
7642
diff
changeset
|
1127 case SEARCH_OR: |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
7642
diff
changeset
|
1128 case SEARCH_SUB: |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
7642
diff
changeset
|
1129 /* they're static only if all subargs are static */ |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
7642
diff
changeset
|
1130 subarg = arg->value.subargs; |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
7642
diff
changeset
|
1131 for (; subarg != NULL; subarg = subarg->next) { |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
7642
diff
changeset
|
1132 if (!search_arg_is_static(subarg)) |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
7642
diff
changeset
|
1133 return FALSE; |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
7642
diff
changeset
|
1134 } |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
7642
diff
changeset
|
1135 return TRUE; |
7908
1e69c84a1e5a
Search code cleanups and minor optimizations.
Timo Sirainen <tss@iki.fi>
parents:
7828
diff
changeset
|
1136 case SEARCH_SEQSET: |
1e69c84a1e5a
Search code cleanups and minor optimizations.
Timo Sirainen <tss@iki.fi>
parents:
7828
diff
changeset
|
1137 /* changes between syncs, but we can't really handle this |
1e69c84a1e5a
Search code cleanups and minor optimizations.
Timo Sirainen <tss@iki.fi>
parents:
7828
diff
changeset
|
1138 currently. seqsets should be converted to uidsets first. */ |
7647
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
7642
diff
changeset
|
1139 case SEARCH_FLAGS: |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
7642
diff
changeset
|
1140 case SEARCH_KEYWORDS: |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
7642
diff
changeset
|
1141 case SEARCH_MODSEQ: |
7909
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
1142 case SEARCH_INTHREAD: |
7647
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
7642
diff
changeset
|
1143 break; |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
7642
diff
changeset
|
1144 case SEARCH_ALL: |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
7642
diff
changeset
|
1145 case SEARCH_UIDSET: |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
7642
diff
changeset
|
1146 case SEARCH_BEFORE: |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
7642
diff
changeset
|
1147 case SEARCH_ON: |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
7642
diff
changeset
|
1148 case SEARCH_SINCE: |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
7642
diff
changeset
|
1149 case SEARCH_SENTBEFORE: |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
7642
diff
changeset
|
1150 case SEARCH_SENTON: |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
7642
diff
changeset
|
1151 case SEARCH_SENTSINCE: |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
7642
diff
changeset
|
1152 case SEARCH_SMALLER: |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
7642
diff
changeset
|
1153 case SEARCH_LARGER: |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
7642
diff
changeset
|
1154 case SEARCH_HEADER: |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
7642
diff
changeset
|
1155 case SEARCH_HEADER_ADDRESS: |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
7642
diff
changeset
|
1156 case SEARCH_HEADER_COMPRESS_LWSP: |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
7642
diff
changeset
|
1157 case SEARCH_BODY: |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
7642
diff
changeset
|
1158 case SEARCH_TEXT: |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
7642
diff
changeset
|
1159 case SEARCH_BODY_FAST: |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
7642
diff
changeset
|
1160 case SEARCH_TEXT_FAST: |
8077
6d51328896d6
Added the concept of Global UIDs that are preserved across copies.
Timo Sirainen <tss@iki.fi>
parents:
8074
diff
changeset
|
1161 case SEARCH_GUID: |
7910
c1bbdc2b262e
FETCH X-MAILBOX and SEARCH X-MAILBOX can be used with virtual mailboxes to
Timo Sirainen <tss@iki.fi>
parents:
7909
diff
changeset
|
1162 case SEARCH_MAILBOX: |
7647
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
7642
diff
changeset
|
1163 return TRUE; |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
7642
diff
changeset
|
1164 } |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
7642
diff
changeset
|
1165 return FALSE; |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
7642
diff
changeset
|
1166 } |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
7642
diff
changeset
|
1167 |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
7642
diff
changeset
|
1168 static void search_set_static_matches(struct mail_search_arg *arg) |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
7642
diff
changeset
|
1169 { |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
7642
diff
changeset
|
1170 for (; arg != NULL; arg = arg->next) { |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
7642
diff
changeset
|
1171 if (search_arg_is_static(arg)) |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
7642
diff
changeset
|
1172 arg->result = 1; |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
7642
diff
changeset
|
1173 } |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
7642
diff
changeset
|
1174 } |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
7642
diff
changeset
|
1175 |
7671
882888286bf5
Saved search results: Remember what messages' static checks never match, so
Timo Sirainen <tss@iki.fi>
parents:
7647
diff
changeset
|
1176 static bool search_has_static_nonmatches(struct mail_search_arg *arg) |
882888286bf5
Saved search results: Remember what messages' static checks never match, so
Timo Sirainen <tss@iki.fi>
parents:
7647
diff
changeset
|
1177 { |
882888286bf5
Saved search results: Remember what messages' static checks never match, so
Timo Sirainen <tss@iki.fi>
parents:
7647
diff
changeset
|
1178 for (; arg != NULL; arg = arg->next) { |
882888286bf5
Saved search results: Remember what messages' static checks never match, so
Timo Sirainen <tss@iki.fi>
parents:
7647
diff
changeset
|
1179 if (arg->result == 0 && search_arg_is_static(arg)) |
882888286bf5
Saved search results: Remember what messages' static checks never match, so
Timo Sirainen <tss@iki.fi>
parents:
7647
diff
changeset
|
1180 return TRUE; |
882888286bf5
Saved search results: Remember what messages' static checks never match, so
Timo Sirainen <tss@iki.fi>
parents:
7647
diff
changeset
|
1181 } |
882888286bf5
Saved search results: Remember what messages' static checks never match, so
Timo Sirainen <tss@iki.fi>
parents:
7647
diff
changeset
|
1182 return FALSE; |
882888286bf5
Saved search results: Remember what messages' static checks never match, so
Timo Sirainen <tss@iki.fi>
parents:
7647
diff
changeset
|
1183 } |
882888286bf5
Saved search results: Remember what messages' static checks never match, so
Timo Sirainen <tss@iki.fi>
parents:
7647
diff
changeset
|
1184 |
4939
ff2272c228cc
Dovecot is now able to execute multiple commands at the same time.
Timo Sirainen <tss@iki.fi>
parents:
4907
diff
changeset
|
1185 int index_storage_search_next_nonblock(struct mail_search_context *_ctx, |
ff2272c228cc
Dovecot is now able to execute multiple commands at the same time.
Timo Sirainen <tss@iki.fi>
parents:
4907
diff
changeset
|
1186 struct mail *mail, bool *tryagain_r) |
988
8028c4dcf38f
mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents:
962
diff
changeset
|
1187 { |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
1845
diff
changeset
|
1188 struct index_search_context *ctx = (struct index_search_context *)_ctx; |
4196
6ac0d63b297f
Optimized searching a bit for cases where we can restrict search range by
Timo Sirainen <tss@iki.fi>
parents:
4062
diff
changeset
|
1189 struct mailbox *box = _ctx->transaction->box; |
8497
8a511d7da23f
Fixed searching in virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8481
diff
changeset
|
1190 struct mail_private *mail_private = (struct mail_private *)mail; |
4939
ff2272c228cc
Dovecot is now able to execute multiple commands at the same time.
Timo Sirainen <tss@iki.fi>
parents:
4907
diff
changeset
|
1191 unsigned int count = 0; |
8481
9db582413fef
Moved search update result checks to search_next_update_seq().
Timo Sirainen <tss@iki.fi>
parents:
8479
diff
changeset
|
1192 bool match = FALSE; |
0 | 1193 |
4939
ff2272c228cc
Dovecot is now able to execute multiple commands at the same time.
Timo Sirainen <tss@iki.fi>
parents:
4907
diff
changeset
|
1194 *tryagain_r = FALSE; |
ff2272c228cc
Dovecot is now able to execute multiple commands at the same time.
Timo Sirainen <tss@iki.fi>
parents:
4907
diff
changeset
|
1195 |
ff2272c228cc
Dovecot is now able to execute multiple commands at the same time.
Timo Sirainen <tss@iki.fi>
parents:
4907
diff
changeset
|
1196 if (ctx->sorted) { |
ff2272c228cc
Dovecot is now able to execute multiple commands at the same time.
Timo Sirainen <tss@iki.fi>
parents:
4907
diff
changeset
|
1197 /* everything searched at this point already. just returning |
ff2272c228cc
Dovecot is now able to execute multiple commands at the same time.
Timo Sirainen <tss@iki.fi>
parents:
4907
diff
changeset
|
1198 matches from sort list */ |
6277
5f66277bbe40
mail_index_lookup*() can't fail anymore. Changed several APIs not to return
Timo Sirainen <tss@iki.fi>
parents:
6276
diff
changeset
|
1199 if (!index_sort_list_next(ctx->mail_ctx.sort_program, mail)) |
5f66277bbe40
mail_index_lookup*() can't fail anymore. Changed several APIs not to return
Timo Sirainen <tss@iki.fi>
parents:
6276
diff
changeset
|
1200 return 0; |
5f66277bbe40
mail_index_lookup*() can't fail anymore. Changed several APIs not to return
Timo Sirainen <tss@iki.fi>
parents:
6276
diff
changeset
|
1201 return 1; |
4939
ff2272c228cc
Dovecot is now able to execute multiple commands at the same time.
Timo Sirainen <tss@iki.fi>
parents:
4907
diff
changeset
|
1202 } |
4303
5f03738219a6
Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4259
diff
changeset
|
1203 |
3209
923ff19873d4
Major mail-storage API changes. It's now a bit cleaner and much more plugin
Timo Sirainen <tss@iki.fi>
parents:
3039
diff
changeset
|
1204 ctx->mail = mail; |
923ff19873d4
Major mail-storage API changes. It's now a bit cleaner and much more plugin
Timo Sirainen <tss@iki.fi>
parents:
3039
diff
changeset
|
1205 |
4949
a959d4208b54
Moved storage callbacks to struct mail_storage. If searching takes over 10
Timo Sirainen <tss@iki.fi>
parents:
4942
diff
changeset
|
1206 if (ioloop_time - ctx->last_notify.tv_sec >= |
a959d4208b54
Moved storage callbacks to struct mail_storage. If searching takes over 10
Timo Sirainen <tss@iki.fi>
parents:
4942
diff
changeset
|
1207 SEARCH_NOTIFY_INTERVAL_SECS) |
a959d4208b54
Moved storage callbacks to struct mail_storage. If searching takes over 10
Timo Sirainen <tss@iki.fi>
parents:
4942
diff
changeset
|
1208 index_storage_search_notify(box, ctx); |
a959d4208b54
Moved storage callbacks to struct mail_storage. If searching takes over 10
Timo Sirainen <tss@iki.fi>
parents:
4942
diff
changeset
|
1209 |
8477
c033b3e2d9b6
mail_storage.search_next_update_seq returns now bool. It was never failing.
Timo Sirainen <tss@iki.fi>
parents:
8411
diff
changeset
|
1210 while (box->v.search_next_update_seq(_ctx)) { |
6277
5f66277bbe40
mail_index_lookup*() can't fail anymore. Changed several APIs not to return
Timo Sirainen <tss@iki.fi>
parents:
6276
diff
changeset
|
1211 mail_set_seq(mail, _ctx->seq); |
8497
8a511d7da23f
Fixed searching in virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8481
diff
changeset
|
1212 ctx->imail = mail_private->v.get_index_mail(mail); |
453
0f6fd6802265
Modify log now stores the changes in ranges, so store 1:100 doesn't
Timo Sirainen <tss@iki.fi>
parents:
450
diff
changeset
|
1213 |
8481
9db582413fef
Moved search update result checks to search_next_update_seq().
Timo Sirainen <tss@iki.fi>
parents:
8479
diff
changeset
|
1214 T_BEGIN { |
8477
c033b3e2d9b6
mail_storage.search_next_update_seq returns now bool. It was never failing.
Timo Sirainen <tss@iki.fi>
parents:
8411
diff
changeset
|
1215 match = search_match_next(ctx); |
7671
882888286bf5
Saved search results: Remember what messages' static checks never match, so
Timo Sirainen <tss@iki.fi>
parents:
7647
diff
changeset
|
1216 |
8411
abd0ef855a33
Implemented imap-response-codes draft.
Timo Sirainen <tss@iki.fi>
parents:
8146
diff
changeset
|
1217 if (ctx->mail->expunged) |
abd0ef855a33
Implemented imap-response-codes draft.
Timo Sirainen <tss@iki.fi>
parents:
8146
diff
changeset
|
1218 _ctx->seen_lost_data = TRUE; |
abd0ef855a33
Implemented imap-response-codes draft.
Timo Sirainen <tss@iki.fi>
parents:
8146
diff
changeset
|
1219 |
8477
c033b3e2d9b6
mail_storage.search_next_update_seq returns now bool. It was never failing.
Timo Sirainen <tss@iki.fi>
parents:
8411
diff
changeset
|
1220 if (!match && |
7671
882888286bf5
Saved search results: Remember what messages' static checks never match, so
Timo Sirainen <tss@iki.fi>
parents:
7647
diff
changeset
|
1221 search_has_static_nonmatches(_ctx->args->args)) { |
882888286bf5
Saved search results: Remember what messages' static checks never match, so
Timo Sirainen <tss@iki.fi>
parents:
7647
diff
changeset
|
1222 /* if there are saved search results remember |
882888286bf5
Saved search results: Remember what messages' static checks never match, so
Timo Sirainen <tss@iki.fi>
parents:
7647
diff
changeset
|
1223 that this message never matches */ |
882888286bf5
Saved search results: Remember what messages' static checks never match, so
Timo Sirainen <tss@iki.fi>
parents:
7647
diff
changeset
|
1224 mailbox_search_results_never(_ctx, mail->uid); |
882888286bf5
Saved search results: Remember what messages' static checks never match, so
Timo Sirainen <tss@iki.fi>
parents:
7647
diff
changeset
|
1225 } |
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
|
1226 } T_END; |
1672
8920600a8cfc
Index cache file rewrite. It's not finished yet and mbox support is
Timo Sirainen <tss@iki.fi>
parents:
1638
diff
changeset
|
1227 |
7671
882888286bf5
Saved search results: Remember what messages' static checks never match, so
Timo Sirainen <tss@iki.fi>
parents:
7647
diff
changeset
|
1228 mail_search_args_reset(_ctx->args->args, FALSE); |
4196
6ac0d63b297f
Optimized searching a bit for cases where we can restrict search range by
Timo Sirainen <tss@iki.fi>
parents:
4062
diff
changeset
|
1229 |
1672
8920600a8cfc
Index cache file rewrite. It's not finished yet and mbox support is
Timo Sirainen <tss@iki.fi>
parents:
1638
diff
changeset
|
1230 if (ctx->error != NULL) |
8477
c033b3e2d9b6
mail_storage.search_next_update_seq returns now bool. It was never failing.
Timo Sirainen <tss@iki.fi>
parents:
8411
diff
changeset
|
1231 ctx->failed = TRUE; |
c033b3e2d9b6
mail_storage.search_next_update_seq returns now bool. It was never failing.
Timo Sirainen <tss@iki.fi>
parents:
8411
diff
changeset
|
1232 else if (match) { |
7671
882888286bf5
Saved search results: Remember what messages' static checks never match, so
Timo Sirainen <tss@iki.fi>
parents:
7647
diff
changeset
|
1233 if (_ctx->sort_program == NULL) |
4303
5f03738219a6
Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4259
diff
changeset
|
1234 break; |
5f03738219a6
Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4259
diff
changeset
|
1235 |
7671
882888286bf5
Saved search results: Remember what messages' static checks never match, so
Timo Sirainen <tss@iki.fi>
parents:
7647
diff
changeset
|
1236 index_sort_list_add(_ctx->sort_program, mail); |
4303
5f03738219a6
Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4259
diff
changeset
|
1237 } |
4939
ff2272c228cc
Dovecot is now able to execute multiple commands at the same time.
Timo Sirainen <tss@iki.fi>
parents:
4907
diff
changeset
|
1238 |
ff2272c228cc
Dovecot is now able to execute multiple commands at the same time.
Timo Sirainen <tss@iki.fi>
parents:
4907
diff
changeset
|
1239 if (++count == SEARCH_NONBLOCK_COUNT) { |
ff2272c228cc
Dovecot is now able to execute multiple commands at the same time.
Timo Sirainen <tss@iki.fi>
parents:
4907
diff
changeset
|
1240 *tryagain_r = TRUE; |
ff2272c228cc
Dovecot is now able to execute multiple commands at the same time.
Timo Sirainen <tss@iki.fi>
parents:
4907
diff
changeset
|
1241 return 0; |
ff2272c228cc
Dovecot is now able to execute multiple commands at the same time.
Timo Sirainen <tss@iki.fi>
parents:
4907
diff
changeset
|
1242 } |
8532
3e1b401dd543
Sorting messages was completely broken.
Timo Sirainen <tss@iki.fi>
parents:
8509
diff
changeset
|
1243 match = FALSE; |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
1845
diff
changeset
|
1244 } |
3209
923ff19873d4
Major mail-storage API changes. It's now a bit cleaner and much more plugin
Timo Sirainen <tss@iki.fi>
parents:
3039
diff
changeset
|
1245 ctx->mail = NULL; |
923ff19873d4
Major mail-storage API changes. It's now a bit cleaner and much more plugin
Timo Sirainen <tss@iki.fi>
parents:
3039
diff
changeset
|
1246 ctx->imail = NULL; |
1672
8920600a8cfc
Index cache file rewrite. It's not finished yet and mbox support is
Timo Sirainen <tss@iki.fi>
parents:
1638
diff
changeset
|
1247 |
8479
bcdbf33ae9b8
Fix to previous search_next_update_seq change.
Timo Sirainen <tss@iki.fi>
parents:
8477
diff
changeset
|
1248 if (!match && _ctx->sort_program != NULL && !ctx->failed) { |
4939
ff2272c228cc
Dovecot is now able to execute multiple commands at the same time.
Timo Sirainen <tss@iki.fi>
parents:
4907
diff
changeset
|
1249 /* finished searching the messages. now sort them and start |
ff2272c228cc
Dovecot is now able to execute multiple commands at the same time.
Timo Sirainen <tss@iki.fi>
parents:
4907
diff
changeset
|
1250 returning the messages. */ |
4303
5f03738219a6
Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4259
diff
changeset
|
1251 ctx->sorted = TRUE; |
7671
882888286bf5
Saved search results: Remember what messages' static checks never match, so
Timo Sirainen <tss@iki.fi>
parents:
7647
diff
changeset
|
1252 index_sort_list_finish(_ctx->sort_program); |
4939
ff2272c228cc
Dovecot is now able to execute multiple commands at the same time.
Timo Sirainen <tss@iki.fi>
parents:
4907
diff
changeset
|
1253 return index_storage_search_next_nonblock(_ctx, mail, |
ff2272c228cc
Dovecot is now able to execute multiple commands at the same time.
Timo Sirainen <tss@iki.fi>
parents:
4907
diff
changeset
|
1254 tryagain_r); |
4303
5f03738219a6
Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4259
diff
changeset
|
1255 } |
5f03738219a6
Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4259
diff
changeset
|
1256 |
8479
bcdbf33ae9b8
Fix to previous search_next_update_seq change.
Timo Sirainen <tss@iki.fi>
parents:
8477
diff
changeset
|
1257 return ctx->failed ? -1 : (match ? 1 : 0); |
0 | 1258 } |
4196
6ac0d63b297f
Optimized searching a bit for cases where we can restrict search range by
Timo Sirainen <tss@iki.fi>
parents:
4062
diff
changeset
|
1259 |
8477
c033b3e2d9b6
mail_storage.search_next_update_seq returns now bool. It was never failing.
Timo Sirainen <tss@iki.fi>
parents:
8411
diff
changeset
|
1260 bool index_storage_search_next_update_seq(struct mail_search_context *_ctx) |
4196
6ac0d63b297f
Optimized searching a bit for cases where we can restrict search range by
Timo Sirainen <tss@iki.fi>
parents:
4062
diff
changeset
|
1261 { |
6ac0d63b297f
Optimized searching a bit for cases where we can restrict search range by
Timo Sirainen <tss@iki.fi>
parents:
4062
diff
changeset
|
1262 struct index_search_context *ctx = (struct index_search_context *)_ctx; |
8481
9db582413fef
Moved search update result checks to search_next_update_seq().
Timo Sirainen <tss@iki.fi>
parents:
8479
diff
changeset
|
1263 uint32_t uid; |
4196
6ac0d63b297f
Optimized searching a bit for cases where we can restrict search range by
Timo Sirainen <tss@iki.fi>
parents:
4062
diff
changeset
|
1264 int ret; |
6ac0d63b297f
Optimized searching a bit for cases where we can restrict search range by
Timo Sirainen <tss@iki.fi>
parents:
4062
diff
changeset
|
1265 |
6ac0d63b297f
Optimized searching a bit for cases where we can restrict search range by
Timo Sirainen <tss@iki.fi>
parents:
4062
diff
changeset
|
1266 if (_ctx->seq == 0) { |
6ac0d63b297f
Optimized searching a bit for cases where we can restrict search range by
Timo Sirainen <tss@iki.fi>
parents:
4062
diff
changeset
|
1267 /* first time */ |
6ac0d63b297f
Optimized searching a bit for cases where we can restrict search range by
Timo Sirainen <tss@iki.fi>
parents:
4062
diff
changeset
|
1268 _ctx->seq = ctx->seq1; |
6ac0d63b297f
Optimized searching a bit for cases where we can restrict search range by
Timo Sirainen <tss@iki.fi>
parents:
4062
diff
changeset
|
1269 } else { |
6ac0d63b297f
Optimized searching a bit for cases where we can restrict search range by
Timo Sirainen <tss@iki.fi>
parents:
4062
diff
changeset
|
1270 _ctx->seq++; |
6ac0d63b297f
Optimized searching a bit for cases where we can restrict search range by
Timo Sirainen <tss@iki.fi>
parents:
4062
diff
changeset
|
1271 } |
6ac0d63b297f
Optimized searching a bit for cases where we can restrict search range by
Timo Sirainen <tss@iki.fi>
parents:
4062
diff
changeset
|
1272 |
8481
9db582413fef
Moved search update result checks to search_next_update_seq().
Timo Sirainen <tss@iki.fi>
parents:
8479
diff
changeset
|
1273 if (!ctx->have_seqsets && !ctx->have_index_args && |
8507
f323bf2465bd
Give more correct "* OK searched n%" notifications with fts and virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8497
diff
changeset
|
1274 _ctx->update_result == NULL) { |
f323bf2465bd
Give more correct "* OK searched n%" notifications with fts and virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8497
diff
changeset
|
1275 ctx->mail_ctx.progress_cur = _ctx->seq; |
8477
c033b3e2d9b6
mail_storage.search_next_update_seq returns now bool. It was never failing.
Timo Sirainen <tss@iki.fi>
parents:
8411
diff
changeset
|
1276 return _ctx->seq <= ctx->seq2; |
8507
f323bf2465bd
Give more correct "* OK searched n%" notifications with fts and virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8497
diff
changeset
|
1277 } |
4196
6ac0d63b297f
Optimized searching a bit for cases where we can restrict search range by
Timo Sirainen <tss@iki.fi>
parents:
4062
diff
changeset
|
1278 |
6ac0d63b297f
Optimized searching a bit for cases where we can restrict search range by
Timo Sirainen <tss@iki.fi>
parents:
4062
diff
changeset
|
1279 ret = 0; |
6ac0d63b297f
Optimized searching a bit for cases where we can restrict search range by
Timo Sirainen <tss@iki.fi>
parents:
4062
diff
changeset
|
1280 while (_ctx->seq <= ctx->seq2) { |
6ac0d63b297f
Optimized searching a bit for cases where we can restrict search range by
Timo Sirainen <tss@iki.fi>
parents:
4062
diff
changeset
|
1281 /* check if the sequence matches */ |
7642
077bb84e9e77
Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents:
7640
diff
changeset
|
1282 ret = mail_search_args_foreach(ctx->mail_ctx.args->args, |
4196
6ac0d63b297f
Optimized searching a bit for cases where we can restrict search range by
Timo Sirainen <tss@iki.fi>
parents:
4062
diff
changeset
|
1283 search_seqset_arg, ctx); |
8481
9db582413fef
Moved search update result checks to search_next_update_seq().
Timo Sirainen <tss@iki.fi>
parents:
8479
diff
changeset
|
1284 if (ret != 0 && ctx->have_index_args) { |
6966
7bb6ef75715c
Optimize searching flags and keywords.
Timo Sirainen <tss@iki.fi>
parents:
6965
diff
changeset
|
1285 /* check if flags/keywords match before anything else |
7bb6ef75715c
Optimize searching flags and keywords.
Timo Sirainen <tss@iki.fi>
parents:
6965
diff
changeset
|
1286 is done. mail_set_seq() can be a bit slow. */ |
7642
077bb84e9e77
Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents:
7640
diff
changeset
|
1287 ret = mail_search_args_foreach(ctx->mail_ctx.args->args, |
6966
7bb6ef75715c
Optimize searching flags and keywords.
Timo Sirainen <tss@iki.fi>
parents:
6965
diff
changeset
|
1288 search_index_arg, ctx); |
7bb6ef75715c
Optimize searching flags and keywords.
Timo Sirainen <tss@iki.fi>
parents:
6965
diff
changeset
|
1289 } |
8481
9db582413fef
Moved search update result checks to search_next_update_seq().
Timo Sirainen <tss@iki.fi>
parents:
8479
diff
changeset
|
1290 if (ret != 0 && _ctx->update_result != NULL) { |
9db582413fef
Moved search update result checks to search_next_update_seq().
Timo Sirainen <tss@iki.fi>
parents:
8479
diff
changeset
|
1291 /* see if this message never matches */ |
9db582413fef
Moved search update result checks to search_next_update_seq().
Timo Sirainen <tss@iki.fi>
parents:
8479
diff
changeset
|
1292 mail_index_lookup_uid(ctx->view, _ctx->seq, &uid); |
9db582413fef
Moved search update result checks to search_next_update_seq().
Timo Sirainen <tss@iki.fi>
parents:
8479
diff
changeset
|
1293 if (seq_range_exists(&_ctx->update_result->never_uids, |
9db582413fef
Moved search update result checks to search_next_update_seq().
Timo Sirainen <tss@iki.fi>
parents:
8479
diff
changeset
|
1294 uid)) |
9db582413fef
Moved search update result checks to search_next_update_seq().
Timo Sirainen <tss@iki.fi>
parents:
8479
diff
changeset
|
1295 ret = 0; |
9db582413fef
Moved search update result checks to search_next_update_seq().
Timo Sirainen <tss@iki.fi>
parents:
8479
diff
changeset
|
1296 } |
9db582413fef
Moved search update result checks to search_next_update_seq().
Timo Sirainen <tss@iki.fi>
parents:
8479
diff
changeset
|
1297 if (ret != 0) |
9db582413fef
Moved search update result checks to search_next_update_seq().
Timo Sirainen <tss@iki.fi>
parents:
8479
diff
changeset
|
1298 break; |
4196
6ac0d63b297f
Optimized searching a bit for cases where we can restrict search range by
Timo Sirainen <tss@iki.fi>
parents:
4062
diff
changeset
|
1299 |
6ac0d63b297f
Optimized searching a bit for cases where we can restrict search range by
Timo Sirainen <tss@iki.fi>
parents:
4062
diff
changeset
|
1300 /* doesn't, try next one */ |
6ac0d63b297f
Optimized searching a bit for cases where we can restrict search range by
Timo Sirainen <tss@iki.fi>
parents:
4062
diff
changeset
|
1301 _ctx->seq++; |
7642
077bb84e9e77
Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents:
7640
diff
changeset
|
1302 mail_search_args_reset(ctx->mail_ctx.args->args, FALSE); |
4196
6ac0d63b297f
Optimized searching a bit for cases where we can restrict search range by
Timo Sirainen <tss@iki.fi>
parents:
4062
diff
changeset
|
1303 } |
8481
9db582413fef
Moved search update result checks to search_next_update_seq().
Timo Sirainen <tss@iki.fi>
parents:
8479
diff
changeset
|
1304 |
9db582413fef
Moved search update result checks to search_next_update_seq().
Timo Sirainen <tss@iki.fi>
parents:
8479
diff
changeset
|
1305 if (ret != 0 && _ctx->update_result != NULL) { |
9db582413fef
Moved search update result checks to search_next_update_seq().
Timo Sirainen <tss@iki.fi>
parents:
8479
diff
changeset
|
1306 mail_index_lookup_uid(ctx->view, _ctx->seq, &uid); |
9db582413fef
Moved search update result checks to search_next_update_seq().
Timo Sirainen <tss@iki.fi>
parents:
8479
diff
changeset
|
1307 if (seq_range_exists(&_ctx->update_result->uids, uid)) { |
9db582413fef
Moved search update result checks to search_next_update_seq().
Timo Sirainen <tss@iki.fi>
parents:
8479
diff
changeset
|
1308 /* we already know that the static data |
9db582413fef
Moved search update result checks to search_next_update_seq().
Timo Sirainen <tss@iki.fi>
parents:
8479
diff
changeset
|
1309 matches. mark it as such. */ |
9db582413fef
Moved search update result checks to search_next_update_seq().
Timo Sirainen <tss@iki.fi>
parents:
8479
diff
changeset
|
1310 search_set_static_matches(_ctx->args->args); |
9db582413fef
Moved search update result checks to search_next_update_seq().
Timo Sirainen <tss@iki.fi>
parents:
8479
diff
changeset
|
1311 } |
9db582413fef
Moved search update result checks to search_next_update_seq().
Timo Sirainen <tss@iki.fi>
parents:
8479
diff
changeset
|
1312 } |
8507
f323bf2465bd
Give more correct "* OK searched n%" notifications with fts and virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8497
diff
changeset
|
1313 ctx->mail_ctx.progress_cur = _ctx->seq; |
8477
c033b3e2d9b6
mail_storage.search_next_update_seq returns now bool. It was never failing.
Timo Sirainen <tss@iki.fi>
parents:
8411
diff
changeset
|
1314 return ret != 0; |
4196
6ac0d63b297f
Optimized searching a bit for cases where we can restrict search range by
Timo Sirainen <tss@iki.fi>
parents:
4062
diff
changeset
|
1315 } |