Mercurial > dovecot > core-2.2
annotate src/lib-storage/index/index-search.c @ 12611:16a541057e88
lib-storage: Moved setting "wanted fields/headers" fields for sort program from imap-specific code.
Also separate between fields that are actually wanted to be fetched from the
fields that sorting wants to temporarily use.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Mon, 31 Jan 2011 02:13:06 +0200 |
parents | b96efbad2fa4 |
children | 447bce266022 |
rev | line source |
---|---|
10582
615eef3139c2
Updated copyright notices to include year 2010.
Timo Sirainen <tss@iki.fi>
parents:
10347
diff
changeset
|
1 /* Copyright (c) 2002-2010 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" |
9769
8716936443db
Moved all struct timeval comparing/calculation code to lib/time-util.
Timo Sirainen <tss@iki.fi>
parents:
9704
diff
changeset
|
9 #include "time-util.h" |
11197
3c9770bae39e
lib-storage: Added MAILBOX_GLOB search arg. Query builders now use it instead of MAILBOX.
Timo Sirainen <tss@iki.fi>
parents:
11141
diff
changeset
|
10 #include "imap-match.h" |
988
8028c4dcf38f
mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents:
962
diff
changeset
|
11 #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
|
12 #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
|
13 #include "message-search.h" |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
1845
diff
changeset
|
14 #include "message-parser.h" |
7620 | 15 #include "mail-index-modseq.h" |
0 | 16 #include "index-storage.h" |
988
8028c4dcf38f
mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents:
962
diff
changeset
|
17 #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
|
18 #include "index-sort.h" |
0 | 19 #include "mail-search.h" |
7647
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
7642
diff
changeset
|
20 #include "mailbox-search-result-private.h" |
12608
b96efbad2fa4
lib-storage: Index search context is now more accessible by backends.
Timo Sirainen <tss@iki.fi>
parents:
12550
diff
changeset
|
21 #include "index-search-private.h" |
0 | 22 |
23 #include <stdlib.h> | |
24 #include <ctype.h> | |
25 | |
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
|
26 #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
|
27 #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
|
28 |
4949
a959d4208b54
Moved storage callbacks to struct mail_storage. If searching takes over 10
Timo Sirainen <tss@iki.fi>
parents:
4942
diff
changeset
|
29 #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
|
30 |
9164
9b8bf57405c8
Use the new mail_private.stats_* fields to stop non-blocking searches after about 250 ms.
Timo Sirainen <tss@iki.fi>
parents:
9162
diff
changeset
|
31 #define SEARCH_COST_DENTRY 3ULL |
9b8bf57405c8
Use the new mail_private.stats_* fields to stop non-blocking searches after about 250 ms.
Timo Sirainen <tss@iki.fi>
parents:
9162
diff
changeset
|
32 #define SEARCH_COST_ATTR 1ULL |
9b8bf57405c8
Use the new mail_private.stats_* fields to stop non-blocking searches after about 250 ms.
Timo Sirainen <tss@iki.fi>
parents:
9162
diff
changeset
|
33 #define SEARCH_COST_FILES_READ 25ULL |
9b8bf57405c8
Use the new mail_private.stats_* fields to stop non-blocking searches after about 250 ms.
Timo Sirainen <tss@iki.fi>
parents:
9162
diff
changeset
|
34 #define SEARCH_COST_KBYTE 15ULL |
9b8bf57405c8
Use the new mail_private.stats_* fields to stop non-blocking searches after about 250 ms.
Timo Sirainen <tss@iki.fi>
parents:
9162
diff
changeset
|
35 #define SEARCH_COST_CACHE 1ULL |
9b8bf57405c8
Use the new mail_private.stats_* fields to stop non-blocking searches after about 250 ms.
Timo Sirainen <tss@iki.fi>
parents:
9162
diff
changeset
|
36 |
9b8bf57405c8
Use the new mail_private.stats_* fields to stop non-blocking searches after about 250 ms.
Timo Sirainen <tss@iki.fi>
parents:
9162
diff
changeset
|
37 #define SEARCH_MIN_NONBLOCK_USECS 200000 |
9b8bf57405c8
Use the new mail_private.stats_* fields to stop non-blocking searches after about 250 ms.
Timo Sirainen <tss@iki.fi>
parents:
9162
diff
changeset
|
38 #define SEARCH_MAX_NONBLOCK_USECS 250000 |
9b8bf57405c8
Use the new mail_private.stats_* fields to stop non-blocking searches after about 250 ms.
Timo Sirainen <tss@iki.fi>
parents:
9162
diff
changeset
|
39 #define SEARCH_INITIAL_MAX_COST 30000 |
9b8bf57405c8
Use the new mail_private.stats_* fields to stop non-blocking searches after about 250 ms.
Timo Sirainen <tss@iki.fi>
parents:
9162
diff
changeset
|
40 #define SEARCH_RECALC_MIN_USECS 50000 |
9b8bf57405c8
Use the new mail_private.stats_* fields to stop non-blocking searches after about 250 ms.
Timo Sirainen <tss@iki.fi>
parents:
9162
diff
changeset
|
41 |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
898
diff
changeset
|
42 struct search_header_context { |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
1845
diff
changeset
|
43 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
|
44 struct mail_search_arg *args; |
0 | 45 |
1322
97f8c00b8d4c
Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents:
1070
diff
changeset
|
46 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
|
47 |
3325
38eaa792c405
Don't call index_mail_parse_header() twice when searching headers. Caused
Timo Sirainen <tss@iki.fi>
parents:
3301
diff
changeset
|
48 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
|
49 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
|
50 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
|
51 }; |
0 | 52 |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
898
diff
changeset
|
53 struct search_body_context { |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
1845
diff
changeset
|
54 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
|
55 struct istream *input; |
11000
679e99e430d7
lib-storage: mail_get_parts() no longer returns const pointer.
Timo Sirainen <tss@iki.fi>
parents:
10946
diff
changeset
|
56 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
|
57 }; |
0 | 58 |
5522
5dee807e53cf
Header parser has now flags parameter to tell it how to handle linefeeds.
Timo Sirainen <tss@iki.fi>
parents:
5516
diff
changeset
|
59 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
|
60 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
|
61 |
10643
e0b6f739510d
lib-storage: Use mailbox_status() to get number of messages in search code.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
62 static void search_parse_msgset_args(unsigned int messages_count, |
6275
913b188f4dd4
Removed explicit locking from views and maps. They were already locked all
Timo Sirainen <tss@iki.fi>
parents:
5613
diff
changeset
|
63 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
|
64 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
|
65 |
6966
7bb6ef75715c
Optimize searching flags and keywords.
Timo Sirainen <tss@iki.fi>
parents:
6965
diff
changeset
|
66 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
|
67 struct index_search_context *ctx) |
7bb6ef75715c
Optimize searching flags and keywords.
Timo Sirainen <tss@iki.fi>
parents:
6965
diff
changeset
|
68 { |
12550
2c299c0e3bc8
lib-storage: Moved some items from mailbox_get_status() to a new mailbox_get_metadata().
Timo Sirainen <tss@iki.fi>
parents:
12254
diff
changeset
|
69 struct mailbox_metadata metadata; |
11238
dedf835014a2
lib-storage: Fixes/optimizations to SEARCH_MAILBOX*.
Timo Sirainen <tss@iki.fi>
parents:
11234
diff
changeset
|
70 bool match; |
dedf835014a2
lib-storage: Fixes/optimizations to SEARCH_MAILBOX*.
Timo Sirainen <tss@iki.fi>
parents:
11234
diff
changeset
|
71 |
6966
7bb6ef75715c
Optimize searching flags and keywords.
Timo Sirainen <tss@iki.fi>
parents:
6965
diff
changeset
|
72 switch (arg->type) { |
7bb6ef75715c
Optimize searching flags and keywords.
Timo Sirainen <tss@iki.fi>
parents:
6965
diff
changeset
|
73 case SEARCH_SEQSET: |
7bb6ef75715c
Optimize searching flags and keywords.
Timo Sirainen <tss@iki.fi>
parents:
6965
diff
changeset
|
74 ctx->have_seqsets = TRUE; |
7bb6ef75715c
Optimize searching flags and keywords.
Timo Sirainen <tss@iki.fi>
parents:
6965
diff
changeset
|
75 break; |
7618
6dbd70663adf
Added support for SEARCH_UIDSET.
Timo Sirainen <tss@iki.fi>
parents:
7414
diff
changeset
|
76 case SEARCH_UIDSET: |
7909
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
77 case SEARCH_INTHREAD: |
6966
7bb6ef75715c
Optimize searching flags and keywords.
Timo Sirainen <tss@iki.fi>
parents:
6965
diff
changeset
|
78 case SEARCH_FLAGS: |
7bb6ef75715c
Optimize searching flags and keywords.
Timo Sirainen <tss@iki.fi>
parents:
6965
diff
changeset
|
79 case SEARCH_KEYWORDS: |
7620 | 80 case SEARCH_MODSEQ: |
81 if (arg->type == SEARCH_MODSEQ) | |
10660
56b1d4dd9c7d
lib-storage: *_mailboxes don't descend from index_mailbox anymore, it's now a context.
Timo Sirainen <tss@iki.fi>
parents:
10657
diff
changeset
|
82 mail_index_modseq_enable(ctx->box->index); |
7620 | 83 ctx->have_index_args = TRUE; |
6966
7bb6ef75715c
Optimize searching flags and keywords.
Timo Sirainen <tss@iki.fi>
parents:
6965
diff
changeset
|
84 break; |
11238
dedf835014a2
lib-storage: Fixes/optimizations to SEARCH_MAILBOX*.
Timo Sirainen <tss@iki.fi>
parents:
11234
diff
changeset
|
85 case SEARCH_MAILBOX_GUID: |
12550
2c299c0e3bc8
lib-storage: Moved some items from mailbox_get_status() to a new mailbox_get_metadata().
Timo Sirainen <tss@iki.fi>
parents:
12254
diff
changeset
|
86 if (mailbox_get_metadata(ctx->box, MAILBOX_METADATA_GUID, |
2c299c0e3bc8
lib-storage: Moved some items from mailbox_get_status() to a new mailbox_get_metadata().
Timo Sirainen <tss@iki.fi>
parents:
12254
diff
changeset
|
87 &metadata) < 0) { |
11238
dedf835014a2
lib-storage: Fixes/optimizations to SEARCH_MAILBOX*.
Timo Sirainen <tss@iki.fi>
parents:
11234
diff
changeset
|
88 /* result will be unknown */ |
dedf835014a2
lib-storage: Fixes/optimizations to SEARCH_MAILBOX*.
Timo Sirainen <tss@iki.fi>
parents:
11234
diff
changeset
|
89 break; |
dedf835014a2
lib-storage: Fixes/optimizations to SEARCH_MAILBOX*.
Timo Sirainen <tss@iki.fi>
parents:
11234
diff
changeset
|
90 } |
dedf835014a2
lib-storage: Fixes/optimizations to SEARCH_MAILBOX*.
Timo Sirainen <tss@iki.fi>
parents:
11234
diff
changeset
|
91 |
12550
2c299c0e3bc8
lib-storage: Moved some items from mailbox_get_status() to a new mailbox_get_metadata().
Timo Sirainen <tss@iki.fi>
parents:
12254
diff
changeset
|
92 match = strcmp(mail_guid_128_to_string(metadata.guid), |
11238
dedf835014a2
lib-storage: Fixes/optimizations to SEARCH_MAILBOX*.
Timo Sirainen <tss@iki.fi>
parents:
11234
diff
changeset
|
93 arg->value.str) == 0; |
dedf835014a2
lib-storage: Fixes/optimizations to SEARCH_MAILBOX*.
Timo Sirainen <tss@iki.fi>
parents:
11234
diff
changeset
|
94 if (match != arg->not) |
dedf835014a2
lib-storage: Fixes/optimizations to SEARCH_MAILBOX*.
Timo Sirainen <tss@iki.fi>
parents:
11234
diff
changeset
|
95 arg->match_always = TRUE; |
dedf835014a2
lib-storage: Fixes/optimizations to SEARCH_MAILBOX*.
Timo Sirainen <tss@iki.fi>
parents:
11234
diff
changeset
|
96 else |
dedf835014a2
lib-storage: Fixes/optimizations to SEARCH_MAILBOX*.
Timo Sirainen <tss@iki.fi>
parents:
11234
diff
changeset
|
97 arg->nonmatch_always = TRUE; |
dedf835014a2
lib-storage: Fixes/optimizations to SEARCH_MAILBOX*.
Timo Sirainen <tss@iki.fi>
parents:
11234
diff
changeset
|
98 break; |
dedf835014a2
lib-storage: Fixes/optimizations to SEARCH_MAILBOX*.
Timo Sirainen <tss@iki.fi>
parents:
11234
diff
changeset
|
99 case SEARCH_MAILBOX: |
dedf835014a2
lib-storage: Fixes/optimizations to SEARCH_MAILBOX*.
Timo Sirainen <tss@iki.fi>
parents:
11234
diff
changeset
|
100 case SEARCH_MAILBOX_GLOB: |
dedf835014a2
lib-storage: Fixes/optimizations to SEARCH_MAILBOX*.
Timo Sirainen <tss@iki.fi>
parents:
11234
diff
changeset
|
101 ctx->have_mailbox_args = TRUE; |
dedf835014a2
lib-storage: Fixes/optimizations to SEARCH_MAILBOX*.
Timo Sirainen <tss@iki.fi>
parents:
11234
diff
changeset
|
102 break; |
6966
7bb6ef75715c
Optimize searching flags and keywords.
Timo Sirainen <tss@iki.fi>
parents:
6965
diff
changeset
|
103 case SEARCH_ALL: |
7bb6ef75715c
Optimize searching flags and keywords.
Timo Sirainen <tss@iki.fi>
parents:
6965
diff
changeset
|
104 if (!arg->not) |
7bb6ef75715c
Optimize searching flags and keywords.
Timo Sirainen <tss@iki.fi>
parents:
6965
diff
changeset
|
105 arg->match_always = TRUE; |
11238
dedf835014a2
lib-storage: Fixes/optimizations to SEARCH_MAILBOX*.
Timo Sirainen <tss@iki.fi>
parents:
11234
diff
changeset
|
106 else |
dedf835014a2
lib-storage: Fixes/optimizations to SEARCH_MAILBOX*.
Timo Sirainen <tss@iki.fi>
parents:
11234
diff
changeset
|
107 arg->nonmatch_always = TRUE; |
6966
7bb6ef75715c
Optimize searching flags and keywords.
Timo Sirainen <tss@iki.fi>
parents:
6965
diff
changeset
|
108 break; |
7bb6ef75715c
Optimize searching flags and keywords.
Timo Sirainen <tss@iki.fi>
parents:
6965
diff
changeset
|
109 default: |
7bb6ef75715c
Optimize searching flags and keywords.
Timo Sirainen <tss@iki.fi>
parents:
6965
diff
changeset
|
110 break; |
7bb6ef75715c
Optimize searching flags and keywords.
Timo Sirainen <tss@iki.fi>
parents:
6965
diff
changeset
|
111 } |
7bb6ef75715c
Optimize searching flags and keywords.
Timo Sirainen <tss@iki.fi>
parents:
6965
diff
changeset
|
112 } |
7bb6ef75715c
Optimize searching flags and keywords.
Timo Sirainen <tss@iki.fi>
parents:
6965
diff
changeset
|
113 |
7bb6ef75715c
Optimize searching flags and keywords.
Timo Sirainen <tss@iki.fi>
parents:
6965
diff
changeset
|
114 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
|
115 struct index_search_context *ctx) |
7bb6ef75715c
Optimize searching flags and keywords.
Timo Sirainen <tss@iki.fi>
parents:
6965
diff
changeset
|
116 { |
7bb6ef75715c
Optimize searching flags and keywords.
Timo Sirainen <tss@iki.fi>
parents:
6965
diff
changeset
|
117 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
|
118 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
|
119 ARG_SET_RESULT(arg, 1); |
7bb6ef75715c
Optimize searching flags and keywords.
Timo Sirainen <tss@iki.fi>
parents:
6965
diff
changeset
|
120 else |
7bb6ef75715c
Optimize searching flags and keywords.
Timo Sirainen <tss@iki.fi>
parents:
6965
diff
changeset
|
121 ARG_SET_RESULT(arg, 0); |
7bb6ef75715c
Optimize searching flags and keywords.
Timo Sirainen <tss@iki.fi>
parents:
6965
diff
changeset
|
122 } |
7bb6ef75715c
Optimize searching flags and keywords.
Timo Sirainen <tss@iki.fi>
parents:
6965
diff
changeset
|
123 } |
7bb6ef75715c
Optimize searching flags and keywords.
Timo Sirainen <tss@iki.fi>
parents:
6965
diff
changeset
|
124 |
7bb6ef75715c
Optimize searching flags and keywords.
Timo Sirainen <tss@iki.fi>
parents:
6965
diff
changeset
|
125 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
|
126 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
|
127 { |
ae369569e7de
SEARCH_KEYWORDS now uses struct mail_keywords instead of a string array.
Timo Sirainen <tss@iki.fi>
parents:
6962
diff
changeset
|
128 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
|
129 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
|
130 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
|
131 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
|
132 |
ae369569e7de
SEARCH_KEYWORDS now uses struct mail_keywords instead of a string array.
Timo Sirainen <tss@iki.fi>
parents:
6962
diff
changeset
|
133 t_array_init(&keyword_indexes_arr, 128); |
6966
7bb6ef75715c
Optimize searching flags and keywords.
Timo Sirainen <tss@iki.fi>
parents:
6965
diff
changeset
|
134 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
|
135 &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
|
136 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
|
137 |
ae369569e7de
SEARCH_KEYWORDS now uses struct mail_keywords instead of a string array.
Timo Sirainen <tss@iki.fi>
parents:
6962
diff
changeset
|
138 /* 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
|
139 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
|
140 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
|
141 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
|
142 break; |
ae369569e7de
SEARCH_KEYWORDS now uses struct mail_keywords instead of a string array.
Timo Sirainen <tss@iki.fi>
parents:
6962
diff
changeset
|
143 } |
ae369569e7de
SEARCH_KEYWORDS now uses struct mail_keywords instead of a string array.
Timo Sirainen <tss@iki.fi>
parents:
6962
diff
changeset
|
144 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
|
145 return 0; |
ae369569e7de
SEARCH_KEYWORDS now uses struct mail_keywords instead of a string array.
Timo Sirainen <tss@iki.fi>
parents:
6962
diff
changeset
|
146 } |
ae369569e7de
SEARCH_KEYWORDS now uses struct mail_keywords instead of a string array.
Timo Sirainen <tss@iki.fi>
parents:
6962
diff
changeset
|
147 return 1; |
ae369569e7de
SEARCH_KEYWORDS now uses struct mail_keywords instead of a string array.
Timo Sirainen <tss@iki.fi>
parents:
6962
diff
changeset
|
148 } |
ae369569e7de
SEARCH_KEYWORDS now uses struct mail_keywords instead of a string array.
Timo Sirainen <tss@iki.fi>
parents:
6962
diff
changeset
|
149 |
0 | 150 /* Returns >0 = matched, 0 = not matched, -1 = unknown */ |
6966
7bb6ef75715c
Optimize searching flags and keywords.
Timo Sirainen <tss@iki.fi>
parents:
6965
diff
changeset
|
151 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
|
152 struct mail_search_arg *arg, |
7bb6ef75715c
Optimize searching flags and keywords.
Timo Sirainen <tss@iki.fi>
parents:
6965
diff
changeset
|
153 const struct mail_index_record *rec) |
0 | 154 { |
6962
659e4a606aae
Replaced SEARCH_<flag> with a generic SEARCH_FLAGS. Use value.size for
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
155 enum mail_flags flags; |
7620 | 156 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
|
157 int ret; |
1947 | 158 |
6962
659e4a606aae
Replaced SEARCH_<flag> with a generic SEARCH_FLAGS. Use value.size for
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
159 switch (arg->type) { |
7618
6dbd70663adf
Added support for SEARCH_UIDSET.
Timo Sirainen <tss@iki.fi>
parents:
7414
diff
changeset
|
160 case SEARCH_UIDSET: |
7909
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
161 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
|
162 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
|
163 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
|
164 /* 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
|
165 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
|
166 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
|
167 if ((arg->value.flags & MAIL_RECENT) != 0 && |
10660
56b1d4dd9c7d
lib-storage: *_mailboxes don't descend from index_mailbox anymore, it's now a context.
Timo Sirainen <tss@iki.fi>
parents:
10657
diff
changeset
|
168 index_mailbox_is_recent(ctx->box, 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
|
169 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
|
170 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
|
171 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
|
172 T_BEGIN { |
6966
7bb6ef75715c
Optimize searching flags and keywords.
Timo Sirainen <tss@iki.fi>
parents:
6965
diff
changeset
|
173 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
|
174 } 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
|
175 return ret; |
7620 | 176 case SEARCH_MODSEQ: { |
177 if (arg->value.flags != 0) { | |
178 modseq = mail_index_modseq_lookup_flags(ctx->view, | |
179 arg->value.flags, ctx->mail_ctx.seq); | |
180 } else if (arg->value.keywords != NULL) { | |
181 modseq = mail_index_modseq_lookup_keywords(ctx->view, | |
182 arg->value.keywords, ctx->mail_ctx.seq); | |
183 } else { | |
7625 | 184 modseq = mail_index_modseq_lookup(ctx->view, |
7620 | 185 ctx->mail_ctx.seq); |
186 } | |
187 return modseq >= arg->value.modseq->modseq; | |
188 } | |
0 | 189 default: |
190 return -1; | |
191 } | |
192 } | |
193 | |
4907
5b4c9b20eba0
Replaced void *context from a lot of callbacks with the actual context
Timo Sirainen <tss@iki.fi>
parents:
4635
diff
changeset
|
194 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
|
195 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
|
196 { |
6966
7bb6ef75715c
Optimize searching flags and keywords.
Timo Sirainen <tss@iki.fi>
parents:
6965
diff
changeset
|
197 const struct mail_index_record *rec; |
7bb6ef75715c
Optimize searching flags and keywords.
Timo Sirainen <tss@iki.fi>
parents:
6965
diff
changeset
|
198 |
7bb6ef75715c
Optimize searching flags and keywords.
Timo Sirainen <tss@iki.fi>
parents:
6965
diff
changeset
|
199 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
|
200 switch (search_arg_match_index(ctx, arg, rec)) { |
0 | 201 case -1: |
202 /* unknown */ | |
203 break; | |
204 case 0: | |
1069
8024a2cdc406
Several search fixes, mostly related to matching multiple conditions.
Timo Sirainen <tss@iki.fi>
parents:
1066
diff
changeset
|
205 ARG_SET_RESULT(arg, 0); |
0 | 206 break; |
207 default: | |
208 ARG_SET_RESULT(arg, 1); | |
209 break; | |
210 } | |
211 } | |
212 | |
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 /* Returns >0 = matched, 0 = not matched, -1 = unknown */ |
11238
dedf835014a2
lib-storage: Fixes/optimizations to SEARCH_MAILBOX*.
Timo Sirainen <tss@iki.fi>
parents:
11234
diff
changeset
|
214 static int search_arg_match_mailbox(struct index_search_context *ctx, |
dedf835014a2
lib-storage: Fixes/optimizations to SEARCH_MAILBOX*.
Timo Sirainen <tss@iki.fi>
parents:
11234
diff
changeset
|
215 struct mail_search_arg *arg) |
dedf835014a2
lib-storage: Fixes/optimizations to SEARCH_MAILBOX*.
Timo Sirainen <tss@iki.fi>
parents:
11234
diff
changeset
|
216 { |
dedf835014a2
lib-storage: Fixes/optimizations to SEARCH_MAILBOX*.
Timo Sirainen <tss@iki.fi>
parents:
11234
diff
changeset
|
217 const char *str; |
dedf835014a2
lib-storage: Fixes/optimizations to SEARCH_MAILBOX*.
Timo Sirainen <tss@iki.fi>
parents:
11234
diff
changeset
|
218 |
dedf835014a2
lib-storage: Fixes/optimizations to SEARCH_MAILBOX*.
Timo Sirainen <tss@iki.fi>
parents:
11234
diff
changeset
|
219 switch (arg->type) { |
dedf835014a2
lib-storage: Fixes/optimizations to SEARCH_MAILBOX*.
Timo Sirainen <tss@iki.fi>
parents:
11234
diff
changeset
|
220 case SEARCH_MAILBOX: |
dedf835014a2
lib-storage: Fixes/optimizations to SEARCH_MAILBOX*.
Timo Sirainen <tss@iki.fi>
parents:
11234
diff
changeset
|
221 if (mail_get_special(ctx->mail, MAIL_FETCH_MAILBOX_NAME, |
dedf835014a2
lib-storage: Fixes/optimizations to SEARCH_MAILBOX*.
Timo Sirainen <tss@iki.fi>
parents:
11234
diff
changeset
|
222 &str) < 0) |
dedf835014a2
lib-storage: Fixes/optimizations to SEARCH_MAILBOX*.
Timo Sirainen <tss@iki.fi>
parents:
11234
diff
changeset
|
223 return -1; |
dedf835014a2
lib-storage: Fixes/optimizations to SEARCH_MAILBOX*.
Timo Sirainen <tss@iki.fi>
parents:
11234
diff
changeset
|
224 |
dedf835014a2
lib-storage: Fixes/optimizations to SEARCH_MAILBOX*.
Timo Sirainen <tss@iki.fi>
parents:
11234
diff
changeset
|
225 if (strcasecmp(str, "INBOX") == 0) |
dedf835014a2
lib-storage: Fixes/optimizations to SEARCH_MAILBOX*.
Timo Sirainen <tss@iki.fi>
parents:
11234
diff
changeset
|
226 return strcasecmp(arg->value.str, "INBOX") == 0; |
dedf835014a2
lib-storage: Fixes/optimizations to SEARCH_MAILBOX*.
Timo Sirainen <tss@iki.fi>
parents:
11234
diff
changeset
|
227 return strcmp(str, arg->value.str) == 0; |
dedf835014a2
lib-storage: Fixes/optimizations to SEARCH_MAILBOX*.
Timo Sirainen <tss@iki.fi>
parents:
11234
diff
changeset
|
228 case SEARCH_MAILBOX_GLOB: |
dedf835014a2
lib-storage: Fixes/optimizations to SEARCH_MAILBOX*.
Timo Sirainen <tss@iki.fi>
parents:
11234
diff
changeset
|
229 if (mail_get_special(ctx->mail, MAIL_FETCH_MAILBOX_NAME, |
dedf835014a2
lib-storage: Fixes/optimizations to SEARCH_MAILBOX*.
Timo Sirainen <tss@iki.fi>
parents:
11234
diff
changeset
|
230 &str) < 0) |
dedf835014a2
lib-storage: Fixes/optimizations to SEARCH_MAILBOX*.
Timo Sirainen <tss@iki.fi>
parents:
11234
diff
changeset
|
231 return -1; |
dedf835014a2
lib-storage: Fixes/optimizations to SEARCH_MAILBOX*.
Timo Sirainen <tss@iki.fi>
parents:
11234
diff
changeset
|
232 return imap_match(arg->value.mailbox_glob, str) == IMAP_MATCH_YES; |
dedf835014a2
lib-storage: Fixes/optimizations to SEARCH_MAILBOX*.
Timo Sirainen <tss@iki.fi>
parents:
11234
diff
changeset
|
233 default: |
dedf835014a2
lib-storage: Fixes/optimizations to SEARCH_MAILBOX*.
Timo Sirainen <tss@iki.fi>
parents:
11234
diff
changeset
|
234 return -1; |
dedf835014a2
lib-storage: Fixes/optimizations to SEARCH_MAILBOX*.
Timo Sirainen <tss@iki.fi>
parents:
11234
diff
changeset
|
235 } |
dedf835014a2
lib-storage: Fixes/optimizations to SEARCH_MAILBOX*.
Timo Sirainen <tss@iki.fi>
parents:
11234
diff
changeset
|
236 } |
dedf835014a2
lib-storage: Fixes/optimizations to SEARCH_MAILBOX*.
Timo Sirainen <tss@iki.fi>
parents:
11234
diff
changeset
|
237 |
dedf835014a2
lib-storage: Fixes/optimizations to SEARCH_MAILBOX*.
Timo Sirainen <tss@iki.fi>
parents:
11234
diff
changeset
|
238 static void search_mailbox_arg(struct mail_search_arg *arg, |
dedf835014a2
lib-storage: Fixes/optimizations to SEARCH_MAILBOX*.
Timo Sirainen <tss@iki.fi>
parents:
11234
diff
changeset
|
239 struct index_search_context *ctx) |
dedf835014a2
lib-storage: Fixes/optimizations to SEARCH_MAILBOX*.
Timo Sirainen <tss@iki.fi>
parents:
11234
diff
changeset
|
240 { |
dedf835014a2
lib-storage: Fixes/optimizations to SEARCH_MAILBOX*.
Timo Sirainen <tss@iki.fi>
parents:
11234
diff
changeset
|
241 switch (search_arg_match_mailbox(ctx, arg)) { |
dedf835014a2
lib-storage: Fixes/optimizations to SEARCH_MAILBOX*.
Timo Sirainen <tss@iki.fi>
parents:
11234
diff
changeset
|
242 case -1: |
dedf835014a2
lib-storage: Fixes/optimizations to SEARCH_MAILBOX*.
Timo Sirainen <tss@iki.fi>
parents:
11234
diff
changeset
|
243 /* unknown */ |
dedf835014a2
lib-storage: Fixes/optimizations to SEARCH_MAILBOX*.
Timo Sirainen <tss@iki.fi>
parents:
11234
diff
changeset
|
244 break; |
dedf835014a2
lib-storage: Fixes/optimizations to SEARCH_MAILBOX*.
Timo Sirainen <tss@iki.fi>
parents:
11234
diff
changeset
|
245 case 0: |
dedf835014a2
lib-storage: Fixes/optimizations to SEARCH_MAILBOX*.
Timo Sirainen <tss@iki.fi>
parents:
11234
diff
changeset
|
246 ARG_SET_RESULT(arg, 0); |
dedf835014a2
lib-storage: Fixes/optimizations to SEARCH_MAILBOX*.
Timo Sirainen <tss@iki.fi>
parents:
11234
diff
changeset
|
247 break; |
dedf835014a2
lib-storage: Fixes/optimizations to SEARCH_MAILBOX*.
Timo Sirainen <tss@iki.fi>
parents:
11234
diff
changeset
|
248 default: |
dedf835014a2
lib-storage: Fixes/optimizations to SEARCH_MAILBOX*.
Timo Sirainen <tss@iki.fi>
parents:
11234
diff
changeset
|
249 ARG_SET_RESULT(arg, 1); |
dedf835014a2
lib-storage: Fixes/optimizations to SEARCH_MAILBOX*.
Timo Sirainen <tss@iki.fi>
parents:
11234
diff
changeset
|
250 break; |
dedf835014a2
lib-storage: Fixes/optimizations to SEARCH_MAILBOX*.
Timo Sirainen <tss@iki.fi>
parents:
11234
diff
changeset
|
251 } |
dedf835014a2
lib-storage: Fixes/optimizations to SEARCH_MAILBOX*.
Timo Sirainen <tss@iki.fi>
parents:
11234
diff
changeset
|
252 } |
dedf835014a2
lib-storage: Fixes/optimizations to SEARCH_MAILBOX*.
Timo Sirainen <tss@iki.fi>
parents:
11234
diff
changeset
|
253 |
dedf835014a2
lib-storage: Fixes/optimizations to SEARCH_MAILBOX*.
Timo Sirainen <tss@iki.fi>
parents:
11234
diff
changeset
|
254 /* 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
|
255 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
|
256 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
|
257 { |
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
|
258 const char *str; |
7279
ef13dd179331
More fixes to SEARCH BEFORE/ON/SINCE timezone handling.
Timo Sirainen <tss@iki.fi>
parents:
7269
diff
changeset
|
259 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
|
260 uoff_t virtual_size; |
5599
6789ba80419b
Parse search dates already in IMAP code.
Timo Sirainen <tss@iki.fi>
parents:
5527
diff
changeset
|
261 time_t date; |
11141
4ade4d8c66c5
lib-storage: Added support for searching save date.
Timo Sirainen <tss@iki.fi>
parents:
11000
diff
changeset
|
262 int tz_offset; |
4ade4d8c66c5
lib-storage: Added support for searching save date.
Timo Sirainen <tss@iki.fi>
parents:
11000
diff
changeset
|
263 bool have_tz_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
|
264 |
5599
6789ba80419b
Parse search dates already in IMAP code.
Timo Sirainen <tss@iki.fi>
parents:
5527
diff
changeset
|
265 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
|
266 /* 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
|
267 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
|
268 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
|
269 case SEARCH_SINCE: |
11141
4ade4d8c66c5
lib-storage: Added support for searching save date.
Timo Sirainen <tss@iki.fi>
parents:
11000
diff
changeset
|
270 have_tz_offset = FALSE; tz_offset = 0; date = (time_t)-1; |
4ade4d8c66c5
lib-storage: Added support for searching save date.
Timo Sirainen <tss@iki.fi>
parents:
11000
diff
changeset
|
271 switch (arg->value.date_type) { |
4ade4d8c66c5
lib-storage: Added support for searching save date.
Timo Sirainen <tss@iki.fi>
parents:
11000
diff
changeset
|
272 case MAIL_SEARCH_DATE_TYPE_SENT: |
4ade4d8c66c5
lib-storage: Added support for searching save date.
Timo Sirainen <tss@iki.fi>
parents:
11000
diff
changeset
|
273 if (mail_get_date(ctx->mail, &date, &tz_offset) < 0) |
4ade4d8c66c5
lib-storage: Added support for searching save date.
Timo Sirainen <tss@iki.fi>
parents:
11000
diff
changeset
|
274 return -1; |
4ade4d8c66c5
lib-storage: Added support for searching save date.
Timo Sirainen <tss@iki.fi>
parents:
11000
diff
changeset
|
275 have_tz_offset = TRUE; |
4ade4d8c66c5
lib-storage: Added support for searching save date.
Timo Sirainen <tss@iki.fi>
parents:
11000
diff
changeset
|
276 break; |
4ade4d8c66c5
lib-storage: Added support for searching save date.
Timo Sirainen <tss@iki.fi>
parents:
11000
diff
changeset
|
277 case MAIL_SEARCH_DATE_TYPE_RECEIVED: |
4ade4d8c66c5
lib-storage: Added support for searching save date.
Timo Sirainen <tss@iki.fi>
parents:
11000
diff
changeset
|
278 if (mail_get_received_date(ctx->mail, &date) < 0) |
4ade4d8c66c5
lib-storage: Added support for searching save date.
Timo Sirainen <tss@iki.fi>
parents:
11000
diff
changeset
|
279 return -1; |
4ade4d8c66c5
lib-storage: Added support for searching save date.
Timo Sirainen <tss@iki.fi>
parents:
11000
diff
changeset
|
280 break; |
4ade4d8c66c5
lib-storage: Added support for searching save date.
Timo Sirainen <tss@iki.fi>
parents:
11000
diff
changeset
|
281 case MAIL_SEARCH_DATE_TYPE_SAVED: |
4ade4d8c66c5
lib-storage: Added support for searching save date.
Timo Sirainen <tss@iki.fi>
parents:
11000
diff
changeset
|
282 if (mail_get_save_date(ctx->mail, &date) < 0) |
4ade4d8c66c5
lib-storage: Added support for searching save date.
Timo Sirainen <tss@iki.fi>
parents:
11000
diff
changeset
|
283 return -1; |
4ade4d8c66c5
lib-storage: Added support for searching save date.
Timo Sirainen <tss@iki.fi>
parents:
11000
diff
changeset
|
284 break; |
4ade4d8c66c5
lib-storage: Added support for searching save date.
Timo Sirainen <tss@iki.fi>
parents:
11000
diff
changeset
|
285 } |
7279
ef13dd179331
More fixes to SEARCH BEFORE/ON/SINCE timezone handling.
Timo Sirainen <tss@iki.fi>
parents:
7269
diff
changeset
|
286 |
7640 | 287 if ((arg->value.search_flags & |
288 MAIL_SEARCH_ARG_FLAG_USE_TZ) == 0) { | |
11141
4ade4d8c66c5
lib-storage: Added support for searching save date.
Timo Sirainen <tss@iki.fi>
parents:
11000
diff
changeset
|
289 if (!have_tz_offset) { |
4ade4d8c66c5
lib-storage: Added support for searching save date.
Timo Sirainen <tss@iki.fi>
parents:
11000
diff
changeset
|
290 tm = localtime(&date); |
4ade4d8c66c5
lib-storage: Added support for searching save date.
Timo Sirainen <tss@iki.fi>
parents:
11000
diff
changeset
|
291 tz_offset = utc_offset(tm, date); |
4ade4d8c66c5
lib-storage: Added support for searching save date.
Timo Sirainen <tss@iki.fi>
parents:
11000
diff
changeset
|
292 } |
4ade4d8c66c5
lib-storage: Added support for searching save date.
Timo Sirainen <tss@iki.fi>
parents:
11000
diff
changeset
|
293 date += tz_offset * 60; |
7640 | 294 } |
525
2cb2e0a3423b
Moved several fields from .imap.index file to .imap.index.data file. Fixed
Timo Sirainen <tss@iki.fi>
parents:
505
diff
changeset
|
295 |
5599
6789ba80419b
Parse search dates already in IMAP code.
Timo Sirainen <tss@iki.fi>
parents:
5527
diff
changeset
|
296 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
|
297 case SEARCH_BEFORE: |
5599
6789ba80419b
Parse search dates already in IMAP code.
Timo Sirainen <tss@iki.fi>
parents:
5527
diff
changeset
|
298 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
|
299 case SEARCH_ON: |
5599
6789ba80419b
Parse search dates already in IMAP code.
Timo Sirainen <tss@iki.fi>
parents:
5527
diff
changeset
|
300 return date >= arg->value.time && |
6789ba80419b
Parse search dates already in IMAP code.
Timo Sirainen <tss@iki.fi>
parents:
5527
diff
changeset
|
301 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
|
302 case SEARCH_SINCE: |
5599
6789ba80419b
Parse search dates already in IMAP code.
Timo Sirainen <tss@iki.fi>
parents:
5527
diff
changeset
|
303 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
|
304 default: |
8920600a8cfc
Index cache file rewrite. It's not finished yet and mbox support is
Timo Sirainen <tss@iki.fi>
parents:
1638
diff
changeset
|
305 /* unreachable */ |
8920600a8cfc
Index cache file rewrite. It's not finished yet and mbox support is
Timo Sirainen <tss@iki.fi>
parents:
1638
diff
changeset
|
306 break; |
8920600a8cfc
Index cache file rewrite. It's not finished yet and mbox support is
Timo Sirainen <tss@iki.fi>
parents:
1638
diff
changeset
|
307 } |
8920600a8cfc
Index cache file rewrite. It's not finished yet and mbox support is
Timo Sirainen <tss@iki.fi>
parents:
1638
diff
changeset
|
308 |
525
2cb2e0a3423b
Moved several fields from .imap.index file to .imap.index.data file. Fixed
Timo Sirainen <tss@iki.fi>
parents:
505
diff
changeset
|
309 /* sizes */ |
2cb2e0a3423b
Moved several fields from .imap.index file to .imap.index.data file. Fixed
Timo Sirainen <tss@iki.fi>
parents:
505
diff
changeset
|
310 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
|
311 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
|
312 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
|
313 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
|
314 |
5599
6789ba80419b
Parse search dates already in IMAP code.
Timo Sirainen <tss@iki.fi>
parents:
5527
diff
changeset
|
315 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
|
316 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
|
317 else |
6962
659e4a606aae
Replaced SEARCH_<flag> with a generic SEARCH_FLAGS. Use value.size for
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
318 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
|
319 |
8077
6d51328896d6
Added the concept of Global UIDs that are preserved across copies.
Timo Sirainen <tss@iki.fi>
parents:
8074
diff
changeset
|
320 case SEARCH_GUID: |
6d51328896d6
Added the concept of Global UIDs that are preserved across copies.
Timo Sirainen <tss@iki.fi>
parents:
8074
diff
changeset
|
321 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
|
322 return -1; |
6d51328896d6
Added the concept of Global UIDs that are preserved across copies.
Timo Sirainen <tss@iki.fi>
parents:
8074
diff
changeset
|
323 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
|
324 default: |
2cb2e0a3423b
Moved several fields from .imap.index file to .imap.index.data file. Fixed
Timo Sirainen <tss@iki.fi>
parents:
505
diff
changeset
|
325 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
|
326 } |
2cb2e0a3423b
Moved several fields from .imap.index file to .imap.index.data file. Fixed
Timo Sirainen <tss@iki.fi>
parents:
505
diff
changeset
|
327 } |
2cb2e0a3423b
Moved several fields from .imap.index file to .imap.index.data file. Fixed
Timo Sirainen <tss@iki.fi>
parents:
505
diff
changeset
|
328 |
4907
5b4c9b20eba0
Replaced void *context from a lot of callbacks with the actual context
Timo Sirainen <tss@iki.fi>
parents:
4635
diff
changeset
|
329 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
|
330 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
|
331 { |
5599
6789ba80419b
Parse search dates already in IMAP code.
Timo Sirainen <tss@iki.fi>
parents:
5527
diff
changeset
|
332 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
|
333 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
|
334 /* unknown */ |
2cb2e0a3423b
Moved several fields from .imap.index file to .imap.index.data file. Fixed
Timo Sirainen <tss@iki.fi>
parents:
505
diff
changeset
|
335 break; |
2cb2e0a3423b
Moved several fields from .imap.index file to .imap.index.data file. Fixed
Timo Sirainen <tss@iki.fi>
parents:
505
diff
changeset
|
336 case 0: |
1069
8024a2cdc406
Several search fixes, mostly related to matching multiple conditions.
Timo Sirainen <tss@iki.fi>
parents:
1066
diff
changeset
|
337 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
|
338 break; |
2cb2e0a3423b
Moved several fields from .imap.index file to .imap.index.data file. Fixed
Timo Sirainen <tss@iki.fi>
parents:
505
diff
changeset
|
339 default: |
2cb2e0a3423b
Moved several fields from .imap.index file to .imap.index.data file. Fixed
Timo Sirainen <tss@iki.fi>
parents:
505
diff
changeset
|
340 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
|
341 break; |
2cb2e0a3423b
Moved several fields from .imap.index file to .imap.index.data file. Fixed
Timo Sirainen <tss@iki.fi>
parents:
505
diff
changeset
|
342 } |
2cb2e0a3423b
Moved several fields from .imap.index file to .imap.index.data file. Fixed
Timo Sirainen <tss@iki.fi>
parents:
505
diff
changeset
|
343 } |
2cb2e0a3423b
Moved several fields from .imap.index file to .imap.index.data file. Fixed
Timo Sirainen <tss@iki.fi>
parents:
505
diff
changeset
|
344 |
5599
6789ba80419b
Parse search dates already in IMAP code.
Timo Sirainen <tss@iki.fi>
parents:
5527
diff
changeset
|
345 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
|
346 const unsigned char *sent_value, size_t sent_value_len) |
0 | 347 { |
5599
6789ba80419b
Parse search dates already in IMAP code.
Timo Sirainen <tss@iki.fi>
parents:
5527
diff
changeset
|
348 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
|
349 int timezone_offset; |
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
350 |
880
d5168cca2052
SEARCHing headers with "" value should always match if the header is found.
Timo Sirainen <tss@iki.fi>
parents:
825
diff
changeset
|
351 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
|
352 return 0; |
d5168cca2052
SEARCHing headers with "" value should always match if the header is found.
Timo Sirainen <tss@iki.fi>
parents:
825
diff
changeset
|
353 |
1340
087a9f4304ca
s/latest IMAP4rev1 draft/RFC-3501/
Timo Sirainen <tss@iki.fi>
parents:
1322
diff
changeset
|
354 /* 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
|
355 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
|
356 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
|
357 &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
|
358 return 0; |
1604 | 359 sent_time += timezone_offset * 60; |
0 | 360 |
408
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
361 switch (type) { |
11141
4ade4d8c66c5
lib-storage: Added support for searching save date.
Timo Sirainen <tss@iki.fi>
parents:
11000
diff
changeset
|
362 case SEARCH_BEFORE: |
408
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
363 return sent_time < search_time; |
11141
4ade4d8c66c5
lib-storage: Added support for searching save date.
Timo Sirainen <tss@iki.fi>
parents:
11000
diff
changeset
|
364 case SEARCH_ON: |
408
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
365 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
|
366 sent_time < search_time + 3600*24; |
11141
4ade4d8c66c5
lib-storage: Added support for searching save date.
Timo Sirainen <tss@iki.fi>
parents:
11000
diff
changeset
|
367 case SEARCH_SINCE: |
408
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
368 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
|
369 default: |
546
e1254b838e0b
Added --enable-asserts (default) and fixed some warnings when building
Timo Sirainen <tss@iki.fi>
parents:
534
diff
changeset
|
370 i_unreached(); |
408
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
371 } |
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
372 } |
0 | 373 |
5525
94bc3fbdecd5
Removed message body/header searchers. They're now combined into one
Timo Sirainen <tss@iki.fi>
parents:
5522
diff
changeset
|
374 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
|
375 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
|
376 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
|
377 { |
5525
94bc3fbdecd5
Removed message body/header searchers. They're now combined into one
Timo Sirainen <tss@iki.fi>
parents:
5522
diff
changeset
|
378 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
|
379 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
|
380 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
|
381 |
9414946e1eb0
Message body search API changed to init/search/deinit. Searching now builds
Timo Sirainen <tss@iki.fi>
parents:
4949
diff
changeset
|
382 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
|
383 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
|
384 |
5525
94bc3fbdecd5
Removed message body/header searchers. They're now combined into one
Timo Sirainen <tss@iki.fi>
parents:
5522
diff
changeset
|
385 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
|
386 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
|
387 |
7805
d440b7cad709
Removed pool parameter from message_search_init().
Timo Sirainen <tss@iki.fi>
parents:
7798
diff
changeset
|
388 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
|
389 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
|
390 &arg_ctx); |
5527 | 391 if (ret > 0) { |
392 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
|
393 return arg_ctx; |
5527 | 394 } |
5504
9414946e1eb0
Message body search API changed to init/search/deinit. Searching now builds
Timo Sirainen <tss@iki.fi>
parents:
4949
diff
changeset
|
395 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
|
396 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
|
397 else |
9414946e1eb0
Message body search API changed to init/search/deinit. Searching now builds
Timo Sirainen <tss@iki.fi>
parents:
4949
diff
changeset
|
398 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
|
399 return NULL; |
0 | 400 } |
401 | |
7284
346d4a44c2f4
SEARCH SUBJECT now changes LWSP to spaces to match ENVELOPE's subject field.
Timo Sirainen <tss@iki.fi>
parents:
7281
diff
changeset
|
402 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
|
403 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
|
404 { |
346d4a44c2f4
SEARCH SUBJECT now changes LWSP to spaces to match ENVELOPE's subject field.
Timo Sirainen <tss@iki.fi>
parents:
7281
diff
changeset
|
405 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
|
406 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
|
407 |
346d4a44c2f4
SEARCH SUBJECT now changes LWSP to spaces to match ENVELOPE's subject field.
Timo Sirainen <tss@iki.fi>
parents:
7281
diff
changeset
|
408 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
|
409 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
|
410 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
|
411 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
|
412 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
|
413 } |
346d4a44c2f4
SEARCH SUBJECT now changes LWSP to spaces to match ENVELOPE's subject field.
Timo Sirainen <tss@iki.fi>
parents:
7281
diff
changeset
|
414 } else { |
346d4a44c2f4
SEARCH SUBJECT now changes LWSP to spaces to match ENVELOPE's subject field.
Timo Sirainen <tss@iki.fi>
parents:
7281
diff
changeset
|
415 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
|
416 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
|
417 } |
346d4a44c2f4
SEARCH SUBJECT now changes LWSP to spaces to match ENVELOPE's subject field.
Timo Sirainen <tss@iki.fi>
parents:
7281
diff
changeset
|
418 } |
346d4a44c2f4
SEARCH SUBJECT now changes LWSP to spaces to match ENVELOPE's subject field.
Timo Sirainen <tss@iki.fi>
parents:
7281
diff
changeset
|
419 } |
346d4a44c2f4
SEARCH SUBJECT now changes LWSP to spaces to match ENVELOPE's subject field.
Timo Sirainen <tss@iki.fi>
parents:
7281
diff
changeset
|
420 |
4907
5b4c9b20eba0
Replaced void *context from a lot of callbacks with the actual context
Timo Sirainen <tss@iki.fi>
parents:
4635
diff
changeset
|
421 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
|
422 struct search_header_context *ctx) |
0 | 423 { |
5525
94bc3fbdecd5
Removed message body/header searchers. They're now combined into one
Timo Sirainen <tss@iki.fi>
parents:
5522
diff
changeset
|
424 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
|
425 struct message_block block; |
6574
ab3a1a8ade55
Header searches didn't decode MIME encoded words.
Timo Sirainen <tss@iki.fi>
parents:
6492
diff
changeset
|
426 struct message_header_line hdr; |
0 | 427 int ret; |
428 | |
429 /* first check that the field name matches to argument. */ | |
430 switch (arg->type) { | |
11141
4ade4d8c66c5
lib-storage: Added support for searching save date.
Timo Sirainen <tss@iki.fi>
parents:
11000
diff
changeset
|
431 case SEARCH_BEFORE: |
4ade4d8c66c5
lib-storage: Added support for searching save date.
Timo Sirainen <tss@iki.fi>
parents:
11000
diff
changeset
|
432 case SEARCH_ON: |
4ade4d8c66c5
lib-storage: Added support for searching save date.
Timo Sirainen <tss@iki.fi>
parents:
11000
diff
changeset
|
433 case SEARCH_SINCE: |
4ade4d8c66c5
lib-storage: Added support for searching save date.
Timo Sirainen <tss@iki.fi>
parents:
11000
diff
changeset
|
434 if (arg->value.date_type != MAIL_SEARCH_DATE_TYPE_SENT) |
4ade4d8c66c5
lib-storage: Added support for searching save date.
Timo Sirainen <tss@iki.fi>
parents:
11000
diff
changeset
|
435 return; |
4ade4d8c66c5
lib-storage: Added support for searching save date.
Timo Sirainen <tss@iki.fi>
parents:
11000
diff
changeset
|
436 |
408
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
437 /* 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
|
438 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
|
439 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
|
440 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
|
441 return; |
97f8c00b8d4c
Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents:
1070
diff
changeset
|
442 } |
5599
6789ba80419b
Parse search dates already in IMAP code.
Timo Sirainen <tss@iki.fi>
parents:
5527
diff
changeset
|
443 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
|
444 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
|
445 ctx->hdr->full_value_len); |
1070 | 446 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
|
447 } |
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
448 return; |
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
449 |
0 | 450 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
|
451 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
|
452 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
|
453 ctx->custom_header = TRUE; |
0 | 454 |
1322
97f8c00b8d4c
Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents:
1070
diff
changeset
|
455 if (strcasecmp(ctx->hdr->name, arg->hdr_field_name) != 0) |
0 | 456 return; |
5513 | 457 break; |
0 | 458 default: |
459 return; | |
460 } | |
461 | |
880
d5168cca2052
SEARCHing headers with "" value should always match if the header is found.
Timo Sirainen <tss@iki.fi>
parents:
825
diff
changeset
|
462 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
|
463 /* 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
|
464 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
|
465 return; |
94bc3fbdecd5
Removed message body/header searchers. They're now combined into one
Timo Sirainen <tss@iki.fi>
parents:
5522
diff
changeset
|
466 } |
94bc3fbdecd5
Removed message body/header searchers. They're now combined into one
Timo Sirainen <tss@iki.fi>
parents:
5522
diff
changeset
|
467 |
94bc3fbdecd5
Removed message body/header searchers. They're now combined into one
Timo Sirainen <tss@iki.fi>
parents:
5522
diff
changeset
|
468 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
|
469 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
|
470 return; |
94bc3fbdecd5
Removed message body/header searchers. They're now combined into one
Timo Sirainen <tss@iki.fi>
parents:
5522
diff
changeset
|
471 } |
94bc3fbdecd5
Removed message body/header searchers. They're now combined into one
Timo Sirainen <tss@iki.fi>
parents:
5522
diff
changeset
|
472 |
94bc3fbdecd5
Removed message body/header searchers. They're now combined into one
Timo Sirainen <tss@iki.fi>
parents:
5522
diff
changeset
|
473 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
|
474 |
e5b840b3c5c2
Header searches shouldn't include the header name or ":" in matching.
Timo Sirainen <tss@iki.fi>
parents:
7279
diff
changeset
|
475 /* 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
|
476 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
|
477 hdr = *ctx->hdr; |
e5b840b3c5c2
Header searches shouldn't include the header name or ":" in matching.
Timo Sirainen <tss@iki.fi>
parents:
7279
diff
changeset
|
478 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
|
479 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
|
480 block.hdr = &hdr; |
e5b840b3c5c2
Header searches shouldn't include the header name or ":" in matching.
Timo Sirainen <tss@iki.fi>
parents:
7279
diff
changeset
|
481 |
5525
94bc3fbdecd5
Removed message body/header searchers. They're now combined into one
Timo Sirainen <tss@iki.fi>
parents:
5522
diff
changeset
|
482 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
|
483 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
|
484 return; |
346d4a44c2f4
SEARCH SUBJECT now changes LWSP to spaces to match ENVELOPE's subject field.
Timo Sirainen <tss@iki.fi>
parents:
7281
diff
changeset
|
485 |
346d4a44c2f4
SEARCH SUBJECT now changes LWSP to spaces to match ENVELOPE's subject field.
Timo Sirainen <tss@iki.fi>
parents:
7281
diff
changeset
|
486 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
|
487 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
|
488 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
|
489 |
7284
346d4a44c2f4
SEARCH SUBJECT now changes LWSP to spaces to match ENVELOPE's subject field.
Timo Sirainen <tss@iki.fi>
parents:
7281
diff
changeset
|
490 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
|
491 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
|
492 /* 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
|
493 break; |
346d4a44c2f4
SEARCH SUBJECT now changes LWSP to spaces to match ENVELOPE's subject field.
Timo Sirainen <tss@iki.fi>
parents:
7281
diff
changeset
|
494 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
|
495 /* 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
|
496 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
|
497 ctx->hdr->full_value, |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6899
diff
changeset
|
498 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
|
499 (unsigned int)-1, TRUE); |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6899
diff
changeset
|
500 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
|
501 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
|
502 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
|
503 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
|
504 break; |
346d4a44c2f4
SEARCH SUBJECT now changes LWSP to spaces to match ENVELOPE's subject field.
Timo Sirainen <tss@iki.fi>
parents:
7281
diff
changeset
|
505 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
|
506 /* 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
|
507 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
|
508 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
|
509 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
|
510 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
|
511 break; |
346d4a44c2f4
SEARCH SUBJECT now changes LWSP to spaces to match ENVELOPE's subject field.
Timo Sirainen <tss@iki.fi>
parents:
7281
diff
changeset
|
512 default: |
346d4a44c2f4
SEARCH SUBJECT now changes LWSP to spaces to match ENVELOPE's subject field.
Timo Sirainen <tss@iki.fi>
parents:
7281
diff
changeset
|
513 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
|
514 } |
346d4a44c2f4
SEARCH SUBJECT now changes LWSP to spaces to match ENVELOPE's subject field.
Timo Sirainen <tss@iki.fi>
parents:
7281
diff
changeset
|
515 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
|
516 } 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
|
517 |
11558
3e50223d0014
lib-storage: Fixed header searches to work correctly when there are multiple headers with same name.
Timo Sirainen <tss@iki.fi>
parents:
11291
diff
changeset
|
518 /* there may be multiple headers. don't mark this failed yet. */ |
3e50223d0014
lib-storage: Fixed header searches to work correctly when there are multiple headers with same name.
Timo Sirainen <tss@iki.fi>
parents:
11291
diff
changeset
|
519 if (ret > 0) |
3e50223d0014
lib-storage: Fixed header searches to work correctly when there are multiple headers with same name.
Timo Sirainen <tss@iki.fi>
parents:
11291
diff
changeset
|
520 ARG_SET_RESULT(arg, 1); |
1069
8024a2cdc406
Several search fixes, mostly related to matching multiple conditions.
Timo Sirainen <tss@iki.fi>
parents:
1066
diff
changeset
|
521 } |
8024a2cdc406
Several search fixes, mostly related to matching multiple conditions.
Timo Sirainen <tss@iki.fi>
parents:
1066
diff
changeset
|
522 |
8024a2cdc406
Several search fixes, mostly related to matching multiple conditions.
Timo Sirainen <tss@iki.fi>
parents:
1066
diff
changeset
|
523 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
|
524 void *context ATTR_UNUSED) |
1069
8024a2cdc406
Several search fixes, mostly related to matching multiple conditions.
Timo Sirainen <tss@iki.fi>
parents:
1066
diff
changeset
|
525 { |
8024a2cdc406
Several search fixes, mostly related to matching multiple conditions.
Timo Sirainen <tss@iki.fi>
parents:
1066
diff
changeset
|
526 switch (arg->type) { |
11141
4ade4d8c66c5
lib-storage: Added support for searching save date.
Timo Sirainen <tss@iki.fi>
parents:
11000
diff
changeset
|
527 case SEARCH_BEFORE: |
4ade4d8c66c5
lib-storage: Added support for searching save date.
Timo Sirainen <tss@iki.fi>
parents:
11000
diff
changeset
|
528 case SEARCH_ON: |
4ade4d8c66c5
lib-storage: Added support for searching save date.
Timo Sirainen <tss@iki.fi>
parents:
11000
diff
changeset
|
529 case SEARCH_SINCE: |
4ade4d8c66c5
lib-storage: Added support for searching save date.
Timo Sirainen <tss@iki.fi>
parents:
11000
diff
changeset
|
530 if (arg->value.date_type != MAIL_SEARCH_DATE_TYPE_SENT) |
4ade4d8c66c5
lib-storage: Added support for searching save date.
Timo Sirainen <tss@iki.fi>
parents:
11000
diff
changeset
|
531 break; |
4ade4d8c66c5
lib-storage: Added support for searching save date.
Timo Sirainen <tss@iki.fi>
parents:
11000
diff
changeset
|
532 |
1070 | 533 if (arg->not) { |
534 /* date header not found, so we match only for | |
535 NOT searches */ | |
536 ARG_SET_RESULT(arg, 0); | |
537 } | |
538 break; | |
1069
8024a2cdc406
Several search fixes, mostly related to matching multiple conditions.
Timo Sirainen <tss@iki.fi>
parents:
1066
diff
changeset
|
539 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
|
540 case SEARCH_HEADER_ADDRESS: |
7328
e0e212e7deeb
SEARCH NOT SUBJECT didn't work correctly.
Timo Sirainen <tss@iki.fi>
parents:
7284
diff
changeset
|
541 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
|
542 ARG_SET_RESULT(arg, 0); |
8024a2cdc406
Several search fixes, mostly related to matching multiple conditions.
Timo Sirainen <tss@iki.fi>
parents:
1066
diff
changeset
|
543 break; |
8024a2cdc406
Several search fixes, mostly related to matching multiple conditions.
Timo Sirainen <tss@iki.fi>
parents:
1066
diff
changeset
|
544 default: |
8024a2cdc406
Several search fixes, mostly related to matching multiple conditions.
Timo Sirainen <tss@iki.fi>
parents:
1066
diff
changeset
|
545 break; |
8024a2cdc406
Several search fixes, mostly related to matching multiple conditions.
Timo Sirainen <tss@iki.fi>
parents:
1066
diff
changeset
|
546 } |
0 | 547 } |
548 | |
4907
5b4c9b20eba0
Replaced void *context from a lot of callbacks with the actual context
Timo Sirainen <tss@iki.fi>
parents:
4635
diff
changeset
|
549 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
|
550 struct search_header_context *ctx) |
0 | 551 { |
1322
97f8c00b8d4c
Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents:
1070
diff
changeset
|
552 if (hdr == NULL) { |
97f8c00b8d4c
Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents:
1070
diff
changeset
|
553 /* 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
|
554 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
|
555 return; |
97f8c00b8d4c
Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents:
1070
diff
changeset
|
556 } |
97f8c00b8d4c
Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents:
1070
diff
changeset
|
557 |
97f8c00b8d4c
Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents:
1070
diff
changeset
|
558 if (hdr->eoh) |
97f8c00b8d4c
Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents:
1070
diff
changeset
|
559 return; |
97f8c00b8d4c
Better handling for multiline headers. Before we skipped headers larger than
Timo Sirainen <tss@iki.fi>
parents:
1070
diff
changeset
|
560 |
3325
38eaa792c405
Don't call index_mail_parse_header() twice when searching headers. Caused
Timo Sirainen <tss@iki.fi>
parents:
3301
diff
changeset
|
561 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
|
562 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
|
563 |
1672
8920600a8cfc
Index cache file rewrite. It's not finished yet and mbox support is
Timo Sirainen <tss@iki.fi>
parents:
1638
diff
changeset
|
564 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
|
565 ctx->hdr = hdr; |
0 | 566 |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
567 ctx->custom_header = FALSE; |
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
568 mail_search_args_foreach(ctx->args, search_header_arg, ctx); |
0 | 569 } |
570 } | |
571 | |
4907
5b4c9b20eba0
Replaced void *context from a lot of callbacks with the actual context
Timo Sirainen <tss@iki.fi>
parents:
4635
diff
changeset
|
572 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
|
573 struct search_body_context *ctx) |
0 | 574 { |
5525
94bc3fbdecd5
Removed message body/header searchers. They're now combined into one
Timo Sirainen <tss@iki.fi>
parents:
5522
diff
changeset
|
575 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
|
576 int ret; |
0 | 577 |
608
debb8468514e
SEARCH CHARSET now works properly with message bodies, and in general body
Timo Sirainen <tss@iki.fi>
parents:
569
diff
changeset
|
578 if (ctx->index_ctx->error != NULL) |
0 | 579 return; |
580 | |
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
|
581 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
|
582 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
|
583 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
|
584 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
|
585 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
|
586 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
|
587 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
|
588 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
|
589 } |
3795
e6c42de08336
Allow message_body_search() to return "message_part is broken" error. If it
Timo Sirainen <tss@iki.fi>
parents:
3467
diff
changeset
|
590 |
5525
94bc3fbdecd5
Removed message body/header searchers. They're now combined into one
Timo Sirainen <tss@iki.fi>
parents:
5522
diff
changeset
|
591 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
|
592 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
|
593 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
|
594 return; |
9414946e1eb0
Message body search API changed to init/search/deinit. Searching now builds
Timo Sirainen <tss@iki.fi>
parents:
4949
diff
changeset
|
595 } |
9414946e1eb0
Message body search API changed to init/search/deinit. Searching now builds
Timo Sirainen <tss@iki.fi>
parents:
4949
diff
changeset
|
596 |
3795
e6c42de08336
Allow message_body_search() to return "message_part is broken" error. If it
Timo Sirainen <tss@iki.fi>
parents:
3467
diff
changeset
|
597 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
|
598 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
|
599 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
|
600 /* 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
|
601 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
|
602 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
|
603 |
5504
9414946e1eb0
Message body search API changed to init/search/deinit. Searching now builds
Timo Sirainen <tss@iki.fi>
parents:
4949
diff
changeset
|
604 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
|
605 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
|
606 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
|
607 } |
290
3dcc2275b4ca
IOBuffer cleanup, hopefully fixes some mbox problems.
Timo Sirainen <tss@iki.fi>
parents:
223
diff
changeset
|
608 |
12254
41454ed5a3eb
search: If body search fails due to I/O error, keep the result as "unknown".
Timo Sirainen <tss@iki.fi>
parents:
11887
diff
changeset
|
609 ARG_SET_RESULT(arg, ret); |
5
1b34ec11fff8
Message data is parsed in blocks (no longer entirely mmap()ed). Several
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
610 } |
1b34ec11fff8
Message data is parsed in blocks (no longer entirely mmap()ed). Several
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
611 |
9162
3727bfc568b9
Search: Perform all lookups from cache before attempting any uncached lookups.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
612 static int search_arg_match_text(struct mail_search_arg *args, |
9164
9b8bf57405c8
Use the new mail_private.stats_* fields to stop non-blocking searches after about 250 ms.
Timo Sirainen <tss@iki.fi>
parents:
9162
diff
changeset
|
613 struct index_search_context *ctx, int ret) |
0 | 614 { |
903
fd8888f6f037
Naming style changes, finally got tired of most of the typedefs. Also the
Timo Sirainen <tss@iki.fi>
parents:
898
diff
changeset
|
615 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
|
616 struct mailbox_header_lookup_ctx *headers_ctx; |
9162
3727bfc568b9
Search: Perform all lookups from cache before attempting any uncached lookups.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
617 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
|
618 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
|
619 bool have_headers, have_body; |
0 | 620 |
621 /* 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
|
622 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
|
623 if (!have_headers && !have_body) |
9164
9b8bf57405c8
Use the new mail_private.stats_* fields to stop non-blocking searches after about 250 ms.
Timo Sirainen <tss@iki.fi>
parents:
9162
diff
changeset
|
624 return ret; |
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_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
|
627 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
|
628 |
9162
3727bfc568b9
Search: Perform all lookups from cache before attempting any uncached lookups.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
629 if (have_body && |
3727bfc568b9
Search: Perform all lookups from cache before attempting any uncached lookups.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
630 ctx->mail->lookup_abort == MAIL_LOOKUP_ABORT_NEVER) { |
3727bfc568b9
Search: Perform all lookups from cache before attempting any uncached lookups.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
631 /* just open the mail bypassing any caching, since |
3727bfc568b9
Search: Perform all lookups from cache before attempting any uncached lookups.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
632 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
|
633 headers = NULL; |
9162
3727bfc568b9
Search: Perform all lookups from cache before attempting any uncached lookups.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
634 } |
1672
8920600a8cfc
Index cache file rewrite. It's not finished yet and mbox support is
Timo Sirainen <tss@iki.fi>
parents:
1638
diff
changeset
|
635 |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2298
diff
changeset
|
636 if (headers == NULL) { |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2298
diff
changeset
|
637 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
|
638 if (mail_get_stream(ctx->mail, NULL, NULL, &input) < 0) |
9162
3727bfc568b9
Search: Perform all lookups from cache before attempting any uncached lookups.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
639 return -1; |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2298
diff
changeset
|
640 } else { |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2298
diff
changeset
|
641 /* 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
|
642 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
|
643 headers_ctx = |
10660
56b1d4dd9c7d
lib-storage: *_mailboxes don't descend from index_mailbox anymore, it's now a context.
Timo Sirainen <tss@iki.fi>
parents:
10657
diff
changeset
|
644 mailbox_header_lookup_init(ctx->box, 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
|
645 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
|
646 &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
|
647 mailbox_header_lookup_unref(&headers_ctx); |
9162
3727bfc568b9
Search: Perform all lookups from cache before attempting any uncached lookups.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
648 return -1; |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2298
diff
changeset
|
649 } |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2298
diff
changeset
|
650 } |
715
3e952f64b2ec
Non-envelope-cached header searching wasn't working. Also now search works
Timo Sirainen <tss@iki.fi>
parents:
678
diff
changeset
|
651 |
568
f2aa58c2afd0
SEARCH CHARSET support. Currently we do it through iconv() and only ASCII
Timo Sirainen <tss@iki.fi>
parents:
559
diff
changeset
|
652 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
|
653 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
|
654 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
|
655 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
|
656 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
|
657 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
|
658 |
5516
96f0b56489a2
Don't feed index_mail_parser headers while searching message bodies, unless
Timo Sirainen <tss@iki.fi>
parents:
5513
diff
changeset
|
659 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
|
660 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
|
661 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
|
662 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
|
663 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
|
664 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
|
665 } else { |
988
8028c4dcf38f
mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents:
962
diff
changeset
|
666 struct message_size hdr_size; |
8028c4dcf38f
mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents:
962
diff
changeset
|
667 |
6280
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6277
diff
changeset
|
668 if (mail_get_stream(ctx->mail, &hdr_size, NULL, &input) < 0) |
9162
3727bfc568b9
Search: Perform all lookups from cache before attempting any uncached lookups.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
669 return -1; |
988
8028c4dcf38f
mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents:
962
diff
changeset
|
670 |
8028c4dcf38f
mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents:
962
diff
changeset
|
671 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
|
672 } |
0 | 673 |
1672
8920600a8cfc
Index cache file rewrite. It's not finished yet and mbox support is
Timo Sirainen <tss@iki.fi>
parents:
1638
diff
changeset
|
674 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
|
675 struct search_body_context body_ctx; |
0 | 676 |
9164
9b8bf57405c8
Use the new mail_private.stats_* fields to stop non-blocking searches after about 250 ms.
Timo Sirainen <tss@iki.fi>
parents:
9162
diff
changeset
|
677 if (ctx->mail->lookup_abort != MAIL_LOOKUP_ABORT_NEVER) |
9b8bf57405c8
Use the new mail_private.stats_* fields to stop non-blocking searches after about 250 ms.
Timo Sirainen <tss@iki.fi>
parents:
9162
diff
changeset
|
678 return -1; |
9b8bf57405c8
Use the new mail_private.stats_* fields to stop non-blocking searches after about 250 ms.
Timo Sirainen <tss@iki.fi>
parents:
9162
diff
changeset
|
679 |
608
debb8468514e
SEARCH CHARSET now works properly with message bodies, and in general body
Timo Sirainen <tss@iki.fi>
parents:
569
diff
changeset
|
680 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
|
681 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
|
682 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
|
683 (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
|
684 |
9162
3727bfc568b9
Search: Perform all lookups from cache before attempting any uncached lookups.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
685 ret = mail_search_args_foreach(args, search_body, &body_ctx); |
3727bfc568b9
Search: Perform all lookups from cache before attempting any uncached lookups.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
686 } else { |
3727bfc568b9
Search: Perform all lookups from cache before attempting any uncached lookups.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
687 /* see if we have a decision */ |
3727bfc568b9
Search: Perform all lookups from cache before attempting any uncached lookups.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
688 ret = 1; |
3727bfc568b9
Search: Perform all lookups from cache before attempting any uncached lookups.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
689 arg = ctx->mail_ctx.args->args; |
3727bfc568b9
Search: Perform all lookups from cache before attempting any uncached lookups.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
690 for (; arg != NULL; arg = arg->next) { |
3727bfc568b9
Search: Perform all lookups from cache before attempting any uncached lookups.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
691 if (arg->result == 0) { |
3727bfc568b9
Search: Perform all lookups from cache before attempting any uncached lookups.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
692 ret = 0; |
3727bfc568b9
Search: Perform all lookups from cache before attempting any uncached lookups.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
693 break; |
3727bfc568b9
Search: Perform all lookups from cache before attempting any uncached lookups.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
694 } |
3727bfc568b9
Search: Perform all lookups from cache before attempting any uncached lookups.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
695 if (arg->result < 0) |
3727bfc568b9
Search: Perform all lookups from cache before attempting any uncached lookups.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
696 ret = -1; |
3727bfc568b9
Search: Perform all lookups from cache before attempting any uncached lookups.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
697 } |
0 | 698 } |
9162
3727bfc568b9
Search: Perform all lookups from cache before attempting any uncached lookups.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
699 return ret; |
0 | 700 } |
701 | |
10643
e0b6f739510d
lib-storage: Use mailbox_status() to get number of messages in search code.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
702 static bool search_msgset_fix_limits(unsigned int 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
|
703 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
|
704 { |
7619
56f55bd35aa5
Moved IMAP messageset handling to lib-imap/ and searching to lib-storage/.
Timo Sirainen <tss@iki.fi>
parents:
7618
diff
changeset
|
705 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
|
706 unsigned int count; |
4431
2461061327ed
NOT condition wasn't handled correctly in SEARCH.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4303
diff
changeset
|
707 |
10643
e0b6f739510d
lib-storage: Use mailbox_status() to get number of messages in search code.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
708 i_assert(messages_count > 0); |
6485
2eff72b212fe
Simplify search tree by canonicalizing message sets, converting NOT away
Timo Sirainen <tss@iki.fi>
parents:
6457
diff
changeset
|
709 |
7619
56f55bd35aa5
Moved IMAP messageset handling to lib-imap/ and searching to lib-storage/.
Timo Sirainen <tss@iki.fi>
parents:
7618
diff
changeset
|
710 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
|
711 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
|
712 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
|
713 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
|
714 /* "*" 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
|
715 (e.g. with count+1:* we still want to include it) */ |
10643
e0b6f739510d
lib-storage: Use mailbox_status() to get number of messages in search code.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
716 seq_range_array_add(seqset, 0, messages_count); |
6485
2eff72b212fe
Simplify search tree by canonicalizing message sets, converting NOT away
Timo Sirainen <tss@iki.fi>
parents:
6457
diff
changeset
|
717 } |
11887
05031751cc21
Fixing my english: s/non-?existing/nonexistent/
Timo Sirainen <tss@iki.fi>
parents:
11558
diff
changeset
|
718 /* remove all nonexistent messages */ |
10643
e0b6f739510d
lib-storage: Use mailbox_status() to get number of messages in search code.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
719 seq_range_array_remove_range(seqset, messages_count + 1, |
7619
56f55bd35aa5
Moved IMAP messageset handling to lib-imap/ and searching to lib-storage/.
Timo Sirainen <tss@iki.fi>
parents:
7618
diff
changeset
|
720 (uint32_t)-1); |
6485
2eff72b212fe
Simplify search tree by canonicalizing message sets, converting NOT away
Timo Sirainen <tss@iki.fi>
parents:
6457
diff
changeset
|
721 } |
7619
56f55bd35aa5
Moved IMAP messageset handling to lib-imap/ and searching to lib-storage/.
Timo Sirainen <tss@iki.fi>
parents:
7618
diff
changeset
|
722 if (!not) |
56f55bd35aa5
Moved IMAP messageset handling to lib-imap/ and searching to lib-storage/.
Timo Sirainen <tss@iki.fi>
parents:
7618
diff
changeset
|
723 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
|
724 else { |
56f55bd35aa5
Moved IMAP messageset handling to lib-imap/ and searching to lib-storage/.
Timo Sirainen <tss@iki.fi>
parents:
7618
diff
changeset
|
725 /* 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
|
726 range = array_get_modifiable(seqset, &count); |
7828
7caab06fb890
SEARCH: Fixed NOT <seqset> not matching anything.
Timo Sirainen <tss@iki.fi>
parents:
7805
diff
changeset
|
727 return range[0].seq1 != 1 || |
10643
e0b6f739510d
lib-storage: Use mailbox_status() to get number of messages in search code.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
728 range[count-1].seq2 != 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
|
729 } |
6485
2eff72b212fe
Simplify search tree by canonicalizing message sets, converting NOT away
Timo Sirainen <tss@iki.fi>
parents:
6457
diff
changeset
|
730 } |
2eff72b212fe
Simplify search tree by canonicalizing message sets, converting NOT away
Timo Sirainen <tss@iki.fi>
parents:
6457
diff
changeset
|
731 |
10643
e0b6f739510d
lib-storage: Use mailbox_status() to get number of messages in search code.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
732 static void search_msgset_fix(unsigned int 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
|
733 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
|
734 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
|
735 { |
7619
56f55bd35aa5
Moved IMAP messageset handling to lib-imap/ and searching to lib-storage/.
Timo Sirainen <tss@iki.fi>
parents:
7618
diff
changeset
|
736 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
|
737 unsigned int count; |
6485
2eff72b212fe
Simplify search tree by canonicalizing message sets, converting NOT away
Timo Sirainen <tss@iki.fi>
parents:
6457
diff
changeset
|
738 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
|
739 |
10643
e0b6f739510d
lib-storage: Use mailbox_status() to get number of messages in search code.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
740 if (!search_msgset_fix_limits(messages_count, seqset, not)) { |
6485
2eff72b212fe
Simplify search tree by canonicalizing message sets, converting NOT away
Timo Sirainen <tss@iki.fi>
parents:
6457
diff
changeset
|
741 *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
|
742 *seq2_r = 0; |
2eff72b212fe
Simplify search tree by canonicalizing message sets, converting NOT away
Timo Sirainen <tss@iki.fi>
parents:
6457
diff
changeset
|
743 return; |
2eff72b212fe
Simplify search tree by canonicalizing message sets, converting NOT away
Timo Sirainen <tss@iki.fi>
parents:
6457
diff
changeset
|
744 } |
2eff72b212fe
Simplify search tree by canonicalizing message sets, converting NOT away
Timo Sirainen <tss@iki.fi>
parents:
6457
diff
changeset
|
745 |
7619
56f55bd35aa5
Moved IMAP messageset handling to lib-imap/ and searching to lib-storage/.
Timo Sirainen <tss@iki.fi>
parents:
7618
diff
changeset
|
746 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
|
747 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
|
748 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
|
749 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
|
750 } else { |
7619
56f55bd35aa5
Moved IMAP messageset handling to lib-imap/ and searching to lib-storage/.
Timo Sirainen <tss@iki.fi>
parents:
7618
diff
changeset
|
751 min_seq = range[0].seq1 > 1 ? 1 : range[0].seq2 + 1; |
10643
e0b6f739510d
lib-storage: Use mailbox_status() to get number of messages in search code.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
752 max_seq = range[count-1].seq2 < messages_count ? |
e0b6f739510d
lib-storage: Use mailbox_status() to get number of messages in search code.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
753 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
|
754 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
|
755 *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
|
756 *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
|
757 return; |
0 | 758 } |
962
3b139ccc1858
SEARCH didn't properly complain about invalid messagesets. high:low never
Timo Sirainen <tss@iki.fi>
parents:
951
diff
changeset
|
759 } |
4439
12b5fbb3a05c
Searching (storing, fetching) with sequence sets containing commas was
Timo Sirainen <tss@iki.fi>
parents:
4438
diff
changeset
|
760 |
6485
2eff72b212fe
Simplify search tree by canonicalizing message sets, converting NOT away
Timo Sirainen <tss@iki.fi>
parents:
6457
diff
changeset
|
761 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
|
762 *seq1_r = min_seq; |
2eff72b212fe
Simplify search tree by canonicalizing message sets, converting NOT away
Timo Sirainen <tss@iki.fi>
parents:
6457
diff
changeset
|
763 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
|
764 *seq2_r = max_seq; |
0 | 765 } |
766 | |
10643
e0b6f739510d
lib-storage: Use mailbox_status() to get number of messages in search code.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
767 static void search_or_parse_msgset_args(unsigned int messages_count, |
6275
913b188f4dd4
Removed explicit locking from views and maps. They were already locked all
Timo Sirainen <tss@iki.fi>
parents:
5613
diff
changeset
|
768 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
|
769 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
|
770 { |
2461061327ed
NOT condition wasn't handled correctly in SEARCH.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4303
diff
changeset
|
771 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
|
772 |
2461061327ed
NOT condition wasn't handled correctly in SEARCH.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4303
diff
changeset
|
773 for (; args != NULL; args = args->next) { |
10643
e0b6f739510d
lib-storage: Use mailbox_status() to get number of messages in search code.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
774 seq1 = 1; seq2 = messages_count; |
4431
2461061327ed
NOT condition wasn't handled correctly in SEARCH.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4303
diff
changeset
|
775 |
7908
1e69c84a1e5a
Search code cleanups and minor optimizations.
Timo Sirainen <tss@iki.fi>
parents:
7828
diff
changeset
|
776 switch (args->type) { |
1e69c84a1e5a
Search code cleanups and minor optimizations.
Timo Sirainen <tss@iki.fi>
parents:
7828
diff
changeset
|
777 case SEARCH_SUB: |
6485
2eff72b212fe
Simplify search tree by canonicalizing message sets, converting NOT away
Timo Sirainen <tss@iki.fi>
parents:
6457
diff
changeset
|
778 i_assert(!args->not); |
10643
e0b6f739510d
lib-storage: Use mailbox_status() to get number of messages in search code.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
779 search_parse_msgset_args(messages_count, |
e0b6f739510d
lib-storage: Use mailbox_status() to get number of messages in search code.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
780 args->value.subargs, |
6485
2eff72b212fe
Simplify search tree by canonicalizing message sets, converting NOT away
Timo Sirainen <tss@iki.fi>
parents:
6457
diff
changeset
|
781 &seq1, &seq2); |
7908
1e69c84a1e5a
Search code cleanups and minor optimizations.
Timo Sirainen <tss@iki.fi>
parents:
7828
diff
changeset
|
782 break; |
1e69c84a1e5a
Search code cleanups and minor optimizations.
Timo Sirainen <tss@iki.fi>
parents:
7828
diff
changeset
|
783 case SEARCH_OR: |
6485
2eff72b212fe
Simplify search tree by canonicalizing message sets, converting NOT away
Timo Sirainen <tss@iki.fi>
parents:
6457
diff
changeset
|
784 i_assert(!args->not); |
10643
e0b6f739510d
lib-storage: Use mailbox_status() to get number of messages in search code.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
785 search_or_parse_msgset_args(messages_count, |
e0b6f739510d
lib-storage: Use mailbox_status() to get number of messages in search code.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
786 args->value.subargs, |
6485
2eff72b212fe
Simplify search tree by canonicalizing message sets, converting NOT away
Timo Sirainen <tss@iki.fi>
parents:
6457
diff
changeset
|
787 &seq1, &seq2); |
7908
1e69c84a1e5a
Search code cleanups and minor optimizations.
Timo Sirainen <tss@iki.fi>
parents:
7828
diff
changeset
|
788 break; |
1e69c84a1e5a
Search code cleanups and minor optimizations.
Timo Sirainen <tss@iki.fi>
parents:
7828
diff
changeset
|
789 case SEARCH_SEQSET: |
10643
e0b6f739510d
lib-storage: Use mailbox_status() to get number of messages in search code.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
790 search_msgset_fix(messages_count, &args->value.seqset, |
6485
2eff72b212fe
Simplify search tree by canonicalizing message sets, converting NOT away
Timo Sirainen <tss@iki.fi>
parents:
6457
diff
changeset
|
791 &seq1, &seq2, args->not); |
7908
1e69c84a1e5a
Search code cleanups and minor optimizations.
Timo Sirainen <tss@iki.fi>
parents:
7828
diff
changeset
|
792 break; |
1e69c84a1e5a
Search code cleanups and minor optimizations.
Timo Sirainen <tss@iki.fi>
parents:
7828
diff
changeset
|
793 default: |
1e69c84a1e5a
Search code cleanups and minor optimizations.
Timo Sirainen <tss@iki.fi>
parents:
7828
diff
changeset
|
794 break; |
4431
2461061327ed
NOT condition wasn't handled correctly in SEARCH.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4303
diff
changeset
|
795 } |
2461061327ed
NOT condition wasn't handled correctly in SEARCH.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4303
diff
changeset
|
796 |
2461061327ed
NOT condition wasn't handled correctly in SEARCH.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4303
diff
changeset
|
797 if (min_seq1 == 0) { |
2461061327ed
NOT condition wasn't handled correctly in SEARCH.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4303
diff
changeset
|
798 min_seq1 = seq1; |
2461061327ed
NOT condition wasn't handled correctly in SEARCH.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4303
diff
changeset
|
799 max_seq2 = seq2; |
2461061327ed
NOT condition wasn't handled correctly in SEARCH.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4303
diff
changeset
|
800 } else { |
2461061327ed
NOT condition wasn't handled correctly in SEARCH.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4303
diff
changeset
|
801 if (seq1 < min_seq1) |
2461061327ed
NOT condition wasn't handled correctly in SEARCH.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4303
diff
changeset
|
802 min_seq1 = seq1; |
2461061327ed
NOT condition wasn't handled correctly in SEARCH.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4303
diff
changeset
|
803 if (seq2 > max_seq2) |
2461061327ed
NOT condition wasn't handled correctly in SEARCH.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4303
diff
changeset
|
804 max_seq2 = seq2; |
2461061327ed
NOT condition wasn't handled correctly in SEARCH.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4303
diff
changeset
|
805 } |
2461061327ed
NOT condition wasn't handled correctly in SEARCH.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4303
diff
changeset
|
806 } |
2461061327ed
NOT condition wasn't handled correctly in SEARCH.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4303
diff
changeset
|
807 i_assert(min_seq1 != 0); |
2461061327ed
NOT condition wasn't handled correctly in SEARCH.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4303
diff
changeset
|
808 |
2461061327ed
NOT condition wasn't handled correctly in SEARCH.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4303
diff
changeset
|
809 if (min_seq1 > *seq1_r) |
2461061327ed
NOT condition wasn't handled correctly in SEARCH.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4303
diff
changeset
|
810 *seq1_r = min_seq1; |
2461061327ed
NOT condition wasn't handled correctly in SEARCH.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4303
diff
changeset
|
811 if (max_seq2 < *seq2_r) |
2461061327ed
NOT condition wasn't handled correctly in SEARCH.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4303
diff
changeset
|
812 *seq2_r = max_seq2; |
2461061327ed
NOT condition wasn't handled correctly in SEARCH.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4303
diff
changeset
|
813 } |
2461061327ed
NOT condition wasn't handled correctly in SEARCH.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4303
diff
changeset
|
814 |
10643
e0b6f739510d
lib-storage: Use mailbox_status() to get number of messages in search code.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
815 static void search_parse_msgset_args(unsigned int messages_count, |
6275
913b188f4dd4
Removed explicit locking from views and maps. They were already locked all
Timo Sirainen <tss@iki.fi>
parents:
5613
diff
changeset
|
816 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
|
817 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
|
818 { |
4431
2461061327ed
NOT condition wasn't handled correctly in SEARCH.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4303
diff
changeset
|
819 for (; args != NULL; args = args->next) { |
7908
1e69c84a1e5a
Search code cleanups and minor optimizations.
Timo Sirainen <tss@iki.fi>
parents:
7828
diff
changeset
|
820 switch (args->type) { |
1e69c84a1e5a
Search code cleanups and minor optimizations.
Timo Sirainen <tss@iki.fi>
parents:
7828
diff
changeset
|
821 case SEARCH_SUB: |
6485
2eff72b212fe
Simplify search tree by canonicalizing message sets, converting NOT away
Timo Sirainen <tss@iki.fi>
parents:
6457
diff
changeset
|
822 i_assert(!args->not); |
10643
e0b6f739510d
lib-storage: Use mailbox_status() to get number of messages in search code.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
823 search_parse_msgset_args(messages_count, |
e0b6f739510d
lib-storage: Use mailbox_status() to get number of messages in search code.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
824 args->value.subargs, |
6485
2eff72b212fe
Simplify search tree by canonicalizing message sets, converting NOT away
Timo Sirainen <tss@iki.fi>
parents:
6457
diff
changeset
|
825 seq1_r, seq2_r); |
7908
1e69c84a1e5a
Search code cleanups and minor optimizations.
Timo Sirainen <tss@iki.fi>
parents:
7828
diff
changeset
|
826 break; |
1e69c84a1e5a
Search code cleanups and minor optimizations.
Timo Sirainen <tss@iki.fi>
parents:
7828
diff
changeset
|
827 case SEARCH_OR: |
4431
2461061327ed
NOT condition wasn't handled correctly in SEARCH.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4303
diff
changeset
|
828 /* 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
|
829 range */ |
6485
2eff72b212fe
Simplify search tree by canonicalizing message sets, converting NOT away
Timo Sirainen <tss@iki.fi>
parents:
6457
diff
changeset
|
830 i_assert(!args->not); |
10643
e0b6f739510d
lib-storage: Use mailbox_status() to get number of messages in search code.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
831 search_or_parse_msgset_args(messages_count, |
e0b6f739510d
lib-storage: Use mailbox_status() to get number of messages in search code.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
832 args->value.subargs, |
6485
2eff72b212fe
Simplify search tree by canonicalizing message sets, converting NOT away
Timo Sirainen <tss@iki.fi>
parents:
6457
diff
changeset
|
833 seq1_r, seq2_r); |
7908
1e69c84a1e5a
Search code cleanups and minor optimizations.
Timo Sirainen <tss@iki.fi>
parents:
7828
diff
changeset
|
834 break; |
1e69c84a1e5a
Search code cleanups and minor optimizations.
Timo Sirainen <tss@iki.fi>
parents:
7828
diff
changeset
|
835 case SEARCH_SEQSET: |
10643
e0b6f739510d
lib-storage: Use mailbox_status() to get number of messages in search code.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
836 search_msgset_fix(messages_count, &args->value.seqset, |
6485
2eff72b212fe
Simplify search tree by canonicalizing message sets, converting NOT away
Timo Sirainen <tss@iki.fi>
parents:
6457
diff
changeset
|
837 seq1_r, seq2_r, args->not); |
7908
1e69c84a1e5a
Search code cleanups and minor optimizations.
Timo Sirainen <tss@iki.fi>
parents:
7828
diff
changeset
|
838 break; |
1e69c84a1e5a
Search code cleanups and minor optimizations.
Timo Sirainen <tss@iki.fi>
parents:
7828
diff
changeset
|
839 default: |
1e69c84a1e5a
Search code cleanups and minor optimizations.
Timo Sirainen <tss@iki.fi>
parents:
7828
diff
changeset
|
840 break; |
0 | 841 } |
842 } | |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
1845
diff
changeset
|
843 } |
962
3b139ccc1858
SEARCH didn't properly complain about invalid messagesets. high:low never
Timo Sirainen <tss@iki.fi>
parents:
951
diff
changeset
|
844 |
6275
913b188f4dd4
Removed explicit locking from views and maps. They were already locked all
Timo Sirainen <tss@iki.fi>
parents:
5613
diff
changeset
|
845 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
|
846 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
|
847 { |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
1845
diff
changeset
|
848 uint32_t seq1, seq2; |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
1845
diff
changeset
|
849 |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
1845
diff
changeset
|
850 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
|
851 return; |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
1845
diff
changeset
|
852 |
6677
90bcf480312d
Renamed mail_index_lookup_uid_range() to mail_index_lookup_seq_range(), made
Timo Sirainen <tss@iki.fi>
parents:
6574
diff
changeset
|
853 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
|
854 &seq1, &seq2); |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
1845
diff
changeset
|
855 if (*first_seq < seq1) |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
1845
diff
changeset
|
856 *first_seq = seq1; |
0 | 857 } |
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 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
|
860 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
|
861 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
|
862 { |
10643
e0b6f739510d
lib-storage: Use mailbox_status() to get number of messages in search code.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
863 const struct mail_index_header *hdr; |
e0b6f739510d
lib-storage: Use mailbox_status() to get number of messages in search code.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
864 |
e0b6f739510d
lib-storage: Use mailbox_status() to get number of messages in search code.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
865 hdr = mail_index_get_header(ctx->view); |
442
2a25bf21557b
SEARCH SEEN, UNSEEN, DELETED, UNDELETED, RECENT, UNRECENT optimizations.
Timo Sirainen <tss@iki.fi>
parents:
441
diff
changeset
|
866 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
|
867 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
|
868 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
|
869 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
|
870 return FALSE; |
659e4a606aae
Replaced SEARCH_<flag> with a generic SEARCH_FLAGS. Use value.size for
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
871 } |
659e4a606aae
Replaced SEARCH_<flag> with a generic SEARCH_FLAGS. Use value.size for
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
872 continue; |
659e4a606aae
Replaced SEARCH_<flag> with a generic SEARCH_FLAGS. Use value.size for
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
873 } |
659e4a606aae
Replaced SEARCH_<flag> with a generic SEARCH_FLAGS. Use value.size for
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
874 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
|
875 /* SEEN with 0 seen? */ |
2a25bf21557b
SEARCH SEEN, UNSEEN, DELETED, UNDELETED, RECENT, UNRECENT optimizations.
Timo Sirainen <tss@iki.fi>
parents:
441
diff
changeset
|
876 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
|
877 return FALSE; |
442
2a25bf21557b
SEARCH SEEN, UNSEEN, DELETED, UNDELETED, RECENT, UNRECENT optimizations.
Timo Sirainen <tss@iki.fi>
parents:
441
diff
changeset
|
878 |
1844
4c2678dd65f1
Some optimizations to messageset handling in search.
Timo Sirainen <tss@iki.fi>
parents:
1782
diff
changeset
|
879 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
|
880 /* UNSEEN with all seen? */ |
4c2678dd65f1
Some optimizations to messageset handling in search.
Timo Sirainen <tss@iki.fi>
parents:
1782
diff
changeset
|
881 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
|
882 return FALSE; |
442
2a25bf21557b
SEARCH SEEN, UNSEEN, DELETED, UNDELETED, RECENT, UNRECENT optimizations.
Timo Sirainen <tss@iki.fi>
parents:
441
diff
changeset
|
883 |
1844
4c2678dd65f1
Some optimizations to messageset handling in search.
Timo Sirainen <tss@iki.fi>
parents:
1782
diff
changeset
|
884 /* SEEN with all seen */ |
4c2678dd65f1
Some optimizations to messageset handling in search.
Timo Sirainen <tss@iki.fi>
parents:
1782
diff
changeset
|
885 args->match_always = TRUE; |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
1845
diff
changeset
|
886 } else if (args->not) { |
1844
4c2678dd65f1
Some optimizations to messageset handling in search.
Timo Sirainen <tss@iki.fi>
parents:
1782
diff
changeset
|
887 /* 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
|
888 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
|
889 hdr->first_unseen_uid_lowwater, seq1); |
1844
4c2678dd65f1
Some optimizations to messageset handling in search.
Timo Sirainen <tss@iki.fi>
parents:
1782
diff
changeset
|
890 } |
6962
659e4a606aae
Replaced SEARCH_<flag> with a generic SEARCH_FLAGS. Use value.size for
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
891 } |
659e4a606aae
Replaced SEARCH_<flag> with a generic SEARCH_FLAGS. Use value.size for
Timo Sirainen <tss@iki.fi>
parents:
6940
diff
changeset
|
892 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
|
893 /* DELETED with 0 deleted? */ |
2a25bf21557b
SEARCH SEEN, UNSEEN, DELETED, UNDELETED, RECENT, UNRECENT optimizations.
Timo Sirainen <tss@iki.fi>
parents:
441
diff
changeset
|
894 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
|
895 return FALSE; |
442
2a25bf21557b
SEARCH SEEN, UNSEEN, DELETED, UNDELETED, RECENT, UNRECENT optimizations.
Timo Sirainen <tss@iki.fi>
parents:
441
diff
changeset
|
896 |
1844
4c2678dd65f1
Some optimizations to messageset handling in search.
Timo Sirainen <tss@iki.fi>
parents:
1782
diff
changeset
|
897 if (hdr->deleted_messages_count == |
4c2678dd65f1
Some optimizations to messageset handling in search.
Timo Sirainen <tss@iki.fi>
parents:
1782
diff
changeset
|
898 hdr->messages_count) { |
4c2678dd65f1
Some optimizations to messageset handling in search.
Timo Sirainen <tss@iki.fi>
parents:
1782
diff
changeset
|
899 /* UNDELETED with all deleted? */ |
4c2678dd65f1
Some optimizations to messageset handling in search.
Timo Sirainen <tss@iki.fi>
parents:
1782
diff
changeset
|
900 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
|
901 return FALSE; |
442
2a25bf21557b
SEARCH SEEN, UNSEEN, DELETED, UNDELETED, RECENT, UNRECENT optimizations.
Timo Sirainen <tss@iki.fi>
parents:
441
diff
changeset
|
902 |
1844
4c2678dd65f1
Some optimizations to messageset handling in search.
Timo Sirainen <tss@iki.fi>
parents:
1782
diff
changeset
|
903 /* DELETED with all deleted */ |
4c2678dd65f1
Some optimizations to messageset handling in search.
Timo Sirainen <tss@iki.fi>
parents:
1782
diff
changeset
|
904 args->match_always = TRUE; |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
1845
diff
changeset
|
905 } else if (!args->not) { |
1844
4c2678dd65f1
Some optimizations to messageset handling in search.
Timo Sirainen <tss@iki.fi>
parents:
1782
diff
changeset
|
906 /* 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
|
907 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
|
908 hdr->first_deleted_uid_lowwater, seq1); |
1844
4c2678dd65f1
Some optimizations to messageset handling in search.
Timo Sirainen <tss@iki.fi>
parents:
1782
diff
changeset
|
909 } |
442
2a25bf21557b
SEARCH SEEN, UNSEEN, DELETED, UNDELETED, RECENT, UNRECENT optimizations.
Timo Sirainen <tss@iki.fi>
parents:
441
diff
changeset
|
910 } |
962
3b139ccc1858
SEARCH didn't properly complain about invalid messagesets. high:low never
Timo Sirainen <tss@iki.fi>
parents:
951
diff
changeset
|
911 } |
3b139ccc1858
SEARCH didn't properly complain about invalid messagesets. high:low never
Timo Sirainen <tss@iki.fi>
parents:
951
diff
changeset
|
912 |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
1845
diff
changeset
|
913 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
|
914 } |
0 | 915 |
6275
913b188f4dd4
Removed explicit locking from views and maps. They were already locked all
Timo Sirainen <tss@iki.fi>
parents:
5613
diff
changeset
|
916 static void search_get_seqset(struct index_search_context *ctx, |
10643
e0b6f739510d
lib-storage: Use mailbox_status() to get number of messages in search code.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
917 unsigned int messages_count, |
6275
913b188f4dd4
Removed explicit locking from views and maps. They were already locked all
Timo Sirainen <tss@iki.fi>
parents:
5613
diff
changeset
|
918 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
|
919 { |
10643
e0b6f739510d
lib-storage: Use mailbox_status() to get number of messages in search code.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
920 if (messages_count == 0) { |
2899
1a05764af1e0
UID FETCH * gave error message with empty mailbox.
Timo Sirainen <tss@iki.fi>
parents:
2892
diff
changeset
|
921 /* 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
|
922 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
|
923 UID FETCH. */ |
1985
3ccd4eb52ee4
don't crash when requesting messages from empty mailbox
Timo Sirainen <tss@iki.fi>
parents:
1958
diff
changeset
|
924 ctx->seq1 = 1; |
3ccd4eb52ee4
don't crash when requesting messages from empty mailbox
Timo Sirainen <tss@iki.fi>
parents:
1958
diff
changeset
|
925 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
|
926 return; |
1985
3ccd4eb52ee4
don't crash when requesting messages from empty mailbox
Timo Sirainen <tss@iki.fi>
parents:
1958
diff
changeset
|
927 } |
3ccd4eb52ee4
don't crash when requesting messages from empty mailbox
Timo Sirainen <tss@iki.fi>
parents:
1958
diff
changeset
|
928 |
4431
2461061327ed
NOT condition wasn't handled correctly in SEARCH.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4303
diff
changeset
|
929 ctx->seq1 = 1; |
10643
e0b6f739510d
lib-storage: Use mailbox_status() to get number of messages in search code.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
930 ctx->seq2 = messages_count; |
4431
2461061327ed
NOT condition wasn't handled correctly in SEARCH.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4303
diff
changeset
|
931 |
10643
e0b6f739510d
lib-storage: Use mailbox_status() to get number of messages in search code.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
932 search_parse_msgset_args(messages_count, args, &ctx->seq1, &ctx->seq2); |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
1845
diff
changeset
|
933 if (ctx->seq1 == 0) { |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
1845
diff
changeset
|
934 ctx->seq1 = 1; |
10643
e0b6f739510d
lib-storage: Use mailbox_status() to get number of messages in search code.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
935 ctx->seq2 = 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
|
936 } |
4438
00db36e1b734
Don't crash when different search conditions reduce the search range so that
Timo Sirainen <tss@iki.fi>
parents:
4432
diff
changeset
|
937 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
|
938 /* 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
|
939 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
|
940 } |
327
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
941 |
442
2a25bf21557b
SEARCH SEEN, UNSEEN, DELETED, UNDELETED, RECENT, UNRECENT optimizations.
Timo Sirainen <tss@iki.fi>
parents:
441
diff
changeset
|
942 /* UNSEEN and DELETED in root search level may limit the range */ |
10643
e0b6f739510d
lib-storage: Use mailbox_status() to get number of messages in search code.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
943 if (!search_limit_by_flags(ctx, 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
|
944 /* 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
|
945 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
|
946 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
|
947 } |
0 | 948 } |
949 | |
7909
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
950 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
|
951 ARRAY_TYPE(seq_range) *uids) |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
952 { |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
953 struct mail_thread_iterate_context *child_iter; |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
954 const struct mail_thread_child_node *node; |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
955 int ret = 0; |
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 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
|
958 if (child_iter != NULL) { |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
959 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
|
960 ret = -1; |
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 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
|
963 } |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
964 if (mail_thread_iterate_deinit(&iter) < 0) |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
965 ret = -1; |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
966 return ret; |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
967 } |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
968 |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
969 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
|
970 struct mail_search_arg *arg) |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
971 { |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
972 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
|
973 const struct mail_thread_child_node *node; |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
974 const ARRAY_TYPE(seq_range) *search_uids; |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
975 ARRAY_TYPE(seq_range) thread_uids; |
8074
05565bfadc6b
INTHREAD search may have failed randomly.
Timo Sirainen <tss@iki.fi>
parents:
8011
diff
changeset
|
976 int ret = 0; |
7909
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
977 |
9305 | 978 /* mail_search_args_init() must have been called by now */ |
979 i_assert(arg->value.search_args != NULL); | |
980 | |
7909
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
981 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
|
982 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
|
983 arg->value.search_args, |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
984 MAILBOX_SEARCH_RESULT_FLAG_UPDATE | |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
985 MAILBOX_SEARCH_RESULT_FLAG_QUEUE_SYNC, |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
986 &arg->value.search_result) < 0) |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
987 return -1; |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
988 if (ctx->thread_ctx == NULL) { |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
989 /* failed earlier */ |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
990 return -1; |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
991 } |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
992 |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
993 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
|
994 if (array_count(search_uids) == 0) { |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
995 /* search found nothing - no threads can match */ |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
996 return 0; |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
997 } |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
998 |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
999 t_array_init(&thread_uids, 128); |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
1000 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
|
1001 arg->value.thread_type, FALSE); |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
1002 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
|
1003 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
|
1004 if (child_iter != NULL) { |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
1005 if (search_build_subthread(child_iter, |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
1006 &thread_uids) < 0) |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
1007 ret = -1; |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
1008 } |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
1009 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
|
1010 /* yes, we want this thread */ |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
1011 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
|
1012 } |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
1013 array_clear(&thread_uids); |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
1014 } |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
1015 if (mail_thread_iterate_deinit(&iter) < 0) |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
1016 ret = -1; |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
1017 return ret; |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
1018 } |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
1019 |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
1020 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
|
1021 struct mail_search_arg *arg) |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
1022 { |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
1023 int ret = 0; |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
1024 |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
1025 for (; arg != NULL; arg = arg->next) { |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
1026 switch (arg->type) { |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
1027 case SEARCH_OR: |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
1028 case SEARCH_SUB: |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
1029 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
|
1030 ret = -1; |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
1031 break; |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
1032 case SEARCH_INTHREAD: |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
1033 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
|
1034 ret = -1; |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
1035 break; |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
1036 default: |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
1037 break; |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
1038 } |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
1039 } |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
1040 return ret; |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
1041 } |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
1042 |
12611
16a541057e88
lib-storage: Moved setting "wanted fields/headers" fields for sort program from imap-specific code.
Timo Sirainen <tss@iki.fi>
parents:
12608
diff
changeset
|
1043 static void |
16a541057e88
lib-storage: Moved setting "wanted fields/headers" fields for sort program from imap-specific code.
Timo Sirainen <tss@iki.fi>
parents:
12608
diff
changeset
|
1044 wanted_sort_fields_get(struct mailbox *box, |
16a541057e88
lib-storage: Moved setting "wanted fields/headers" fields for sort program from imap-specific code.
Timo Sirainen <tss@iki.fi>
parents:
12608
diff
changeset
|
1045 const enum mail_sort_type *sort_program, |
16a541057e88
lib-storage: Moved setting "wanted fields/headers" fields for sort program from imap-specific code.
Timo Sirainen <tss@iki.fi>
parents:
12608
diff
changeset
|
1046 enum mail_fetch_field *wanted_fields_r, |
16a541057e88
lib-storage: Moved setting "wanted fields/headers" fields for sort program from imap-specific code.
Timo Sirainen <tss@iki.fi>
parents:
12608
diff
changeset
|
1047 struct mailbox_header_lookup_ctx **headers_ctx_r) |
16a541057e88
lib-storage: Moved setting "wanted fields/headers" fields for sort program from imap-specific code.
Timo Sirainen <tss@iki.fi>
parents:
12608
diff
changeset
|
1048 { |
16a541057e88
lib-storage: Moved setting "wanted fields/headers" fields for sort program from imap-specific code.
Timo Sirainen <tss@iki.fi>
parents:
12608
diff
changeset
|
1049 const char *headers[2]; |
16a541057e88
lib-storage: Moved setting "wanted fields/headers" fields for sort program from imap-specific code.
Timo Sirainen <tss@iki.fi>
parents:
12608
diff
changeset
|
1050 |
16a541057e88
lib-storage: Moved setting "wanted fields/headers" fields for sort program from imap-specific code.
Timo Sirainen <tss@iki.fi>
parents:
12608
diff
changeset
|
1051 *wanted_fields_r = 0; |
16a541057e88
lib-storage: Moved setting "wanted fields/headers" fields for sort program from imap-specific code.
Timo Sirainen <tss@iki.fi>
parents:
12608
diff
changeset
|
1052 *headers_ctx_r = NULL; |
16a541057e88
lib-storage: Moved setting "wanted fields/headers" fields for sort program from imap-specific code.
Timo Sirainen <tss@iki.fi>
parents:
12608
diff
changeset
|
1053 |
16a541057e88
lib-storage: Moved setting "wanted fields/headers" fields for sort program from imap-specific code.
Timo Sirainen <tss@iki.fi>
parents:
12608
diff
changeset
|
1054 headers[0] = headers[1] = NULL; |
16a541057e88
lib-storage: Moved setting "wanted fields/headers" fields for sort program from imap-specific code.
Timo Sirainen <tss@iki.fi>
parents:
12608
diff
changeset
|
1055 switch (sort_program[0] & MAIL_SORT_MASK) { |
16a541057e88
lib-storage: Moved setting "wanted fields/headers" fields for sort program from imap-specific code.
Timo Sirainen <tss@iki.fi>
parents:
12608
diff
changeset
|
1056 case MAIL_SORT_ARRIVAL: |
16a541057e88
lib-storage: Moved setting "wanted fields/headers" fields for sort program from imap-specific code.
Timo Sirainen <tss@iki.fi>
parents:
12608
diff
changeset
|
1057 *wanted_fields_r = MAIL_FETCH_RECEIVED_DATE; |
16a541057e88
lib-storage: Moved setting "wanted fields/headers" fields for sort program from imap-specific code.
Timo Sirainen <tss@iki.fi>
parents:
12608
diff
changeset
|
1058 break; |
16a541057e88
lib-storage: Moved setting "wanted fields/headers" fields for sort program from imap-specific code.
Timo Sirainen <tss@iki.fi>
parents:
12608
diff
changeset
|
1059 case MAIL_SORT_CC: |
16a541057e88
lib-storage: Moved setting "wanted fields/headers" fields for sort program from imap-specific code.
Timo Sirainen <tss@iki.fi>
parents:
12608
diff
changeset
|
1060 headers[0] = "Cc"; |
16a541057e88
lib-storage: Moved setting "wanted fields/headers" fields for sort program from imap-specific code.
Timo Sirainen <tss@iki.fi>
parents:
12608
diff
changeset
|
1061 break; |
16a541057e88
lib-storage: Moved setting "wanted fields/headers" fields for sort program from imap-specific code.
Timo Sirainen <tss@iki.fi>
parents:
12608
diff
changeset
|
1062 case MAIL_SORT_DATE: |
16a541057e88
lib-storage: Moved setting "wanted fields/headers" fields for sort program from imap-specific code.
Timo Sirainen <tss@iki.fi>
parents:
12608
diff
changeset
|
1063 *wanted_fields_r = MAIL_FETCH_DATE; |
16a541057e88
lib-storage: Moved setting "wanted fields/headers" fields for sort program from imap-specific code.
Timo Sirainen <tss@iki.fi>
parents:
12608
diff
changeset
|
1064 break; |
16a541057e88
lib-storage: Moved setting "wanted fields/headers" fields for sort program from imap-specific code.
Timo Sirainen <tss@iki.fi>
parents:
12608
diff
changeset
|
1065 case MAIL_SORT_FROM: |
16a541057e88
lib-storage: Moved setting "wanted fields/headers" fields for sort program from imap-specific code.
Timo Sirainen <tss@iki.fi>
parents:
12608
diff
changeset
|
1066 headers[0] = "From"; |
16a541057e88
lib-storage: Moved setting "wanted fields/headers" fields for sort program from imap-specific code.
Timo Sirainen <tss@iki.fi>
parents:
12608
diff
changeset
|
1067 break; |
16a541057e88
lib-storage: Moved setting "wanted fields/headers" fields for sort program from imap-specific code.
Timo Sirainen <tss@iki.fi>
parents:
12608
diff
changeset
|
1068 case MAIL_SORT_SIZE: |
16a541057e88
lib-storage: Moved setting "wanted fields/headers" fields for sort program from imap-specific code.
Timo Sirainen <tss@iki.fi>
parents:
12608
diff
changeset
|
1069 *wanted_fields_r = MAIL_FETCH_VIRTUAL_SIZE; |
16a541057e88
lib-storage: Moved setting "wanted fields/headers" fields for sort program from imap-specific code.
Timo Sirainen <tss@iki.fi>
parents:
12608
diff
changeset
|
1070 break; |
16a541057e88
lib-storage: Moved setting "wanted fields/headers" fields for sort program from imap-specific code.
Timo Sirainen <tss@iki.fi>
parents:
12608
diff
changeset
|
1071 case MAIL_SORT_SUBJECT: |
16a541057e88
lib-storage: Moved setting "wanted fields/headers" fields for sort program from imap-specific code.
Timo Sirainen <tss@iki.fi>
parents:
12608
diff
changeset
|
1072 headers[0] = "Subject"; |
16a541057e88
lib-storage: Moved setting "wanted fields/headers" fields for sort program from imap-specific code.
Timo Sirainen <tss@iki.fi>
parents:
12608
diff
changeset
|
1073 break; |
16a541057e88
lib-storage: Moved setting "wanted fields/headers" fields for sort program from imap-specific code.
Timo Sirainen <tss@iki.fi>
parents:
12608
diff
changeset
|
1074 case MAIL_SORT_TO: |
16a541057e88
lib-storage: Moved setting "wanted fields/headers" fields for sort program from imap-specific code.
Timo Sirainen <tss@iki.fi>
parents:
12608
diff
changeset
|
1075 headers[0] = "To"; |
16a541057e88
lib-storage: Moved setting "wanted fields/headers" fields for sort program from imap-specific code.
Timo Sirainen <tss@iki.fi>
parents:
12608
diff
changeset
|
1076 break; |
16a541057e88
lib-storage: Moved setting "wanted fields/headers" fields for sort program from imap-specific code.
Timo Sirainen <tss@iki.fi>
parents:
12608
diff
changeset
|
1077 } |
16a541057e88
lib-storage: Moved setting "wanted fields/headers" fields for sort program from imap-specific code.
Timo Sirainen <tss@iki.fi>
parents:
12608
diff
changeset
|
1078 |
16a541057e88
lib-storage: Moved setting "wanted fields/headers" fields for sort program from imap-specific code.
Timo Sirainen <tss@iki.fi>
parents:
12608
diff
changeset
|
1079 if (headers[0] != NULL) |
16a541057e88
lib-storage: Moved setting "wanted fields/headers" fields for sort program from imap-specific code.
Timo Sirainen <tss@iki.fi>
parents:
12608
diff
changeset
|
1080 *headers_ctx_r = mailbox_header_lookup_init(box, headers); |
16a541057e88
lib-storage: Moved setting "wanted fields/headers" fields for sort program from imap-specific code.
Timo Sirainen <tss@iki.fi>
parents:
12608
diff
changeset
|
1081 } |
16a541057e88
lib-storage: Moved setting "wanted fields/headers" fields for sort program from imap-specific code.
Timo Sirainen <tss@iki.fi>
parents:
12608
diff
changeset
|
1082 |
12608
b96efbad2fa4
lib-storage: Index search context is now more accessible by backends.
Timo Sirainen <tss@iki.fi>
parents:
12550
diff
changeset
|
1083 void index_storage_search_init_context(struct index_search_context *ctx, |
b96efbad2fa4
lib-storage: Index search context is now more accessible by backends.
Timo Sirainen <tss@iki.fi>
parents:
12550
diff
changeset
|
1084 struct mailbox_transaction_context *t, |
b96efbad2fa4
lib-storage: Index search context is now more accessible by backends.
Timo Sirainen <tss@iki.fi>
parents:
12550
diff
changeset
|
1085 struct mail_search_args *args, |
b96efbad2fa4
lib-storage: Index search context is now more accessible by backends.
Timo Sirainen <tss@iki.fi>
parents:
12550
diff
changeset
|
1086 const enum mail_sort_type *sort_program) |
0 | 1087 { |
10643
e0b6f739510d
lib-storage: Use mailbox_status() to get number of messages in search code.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
1088 struct mailbox_status status; |
988
8028c4dcf38f
mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents:
962
diff
changeset
|
1089 |
10946
0cf62ad4c7bf
lib-storage: Moved index transaction/view from index_transaction to mailbox_transaction.
Timo Sirainen <tss@iki.fi>
parents:
10660
diff
changeset
|
1090 ctx->mail_ctx.transaction = t; |
0cf62ad4c7bf
lib-storage: Moved index transaction/view from index_transaction to mailbox_transaction.
Timo Sirainen <tss@iki.fi>
parents:
10660
diff
changeset
|
1091 ctx->box = t->box; |
0cf62ad4c7bf
lib-storage: Moved index transaction/view from index_transaction to mailbox_transaction.
Timo Sirainen <tss@iki.fi>
parents:
10660
diff
changeset
|
1092 ctx->view = t->view; |
4607
71b3570946f8
Moved some search parameters to public struct mail_search_context and added
Timo Sirainen <tss@iki.fi>
parents:
4439
diff
changeset
|
1093 ctx->mail_ctx.args = args; |
10946
0cf62ad4c7bf
lib-storage: Moved index transaction/view from index_transaction to mailbox_transaction.
Timo Sirainen <tss@iki.fi>
parents:
10660
diff
changeset
|
1094 ctx->mail_ctx.sort_program = index_sort_program_init(t, sort_program); |
9164
9b8bf57405c8
Use the new mail_private.stats_* fields to stop non-blocking searches after about 250 ms.
Timo Sirainen <tss@iki.fi>
parents:
9162
diff
changeset
|
1095 ctx->next_time_check_cost = SEARCH_INITIAL_MAX_COST; |
9b8bf57405c8
Use the new mail_private.stats_* fields to stop non-blocking searches after about 250 ms.
Timo Sirainen <tss@iki.fi>
parents:
9162
diff
changeset
|
1096 if (gettimeofday(&ctx->last_nonblock_timeval, NULL) < 0) |
9b8bf57405c8
Use the new mail_private.stats_* fields to stop non-blocking searches after about 250 ms.
Timo Sirainen <tss@iki.fi>
parents:
9162
diff
changeset
|
1097 i_fatal("gettimeofday() failed: %m"); |
988
8028c4dcf38f
mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents:
962
diff
changeset
|
1098 |
12550
2c299c0e3bc8
lib-storage: Moved some items from mailbox_get_status() to a new mailbox_get_metadata().
Timo Sirainen <tss@iki.fi>
parents:
12254
diff
changeset
|
1099 mailbox_get_open_status(t->box, STATUS_MESSAGES, &status); |
10643
e0b6f739510d
lib-storage: Use mailbox_status() to get number of messages in search code.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
1100 ctx->mail_ctx.progress_max = status.messages; |
8507
f323bf2465bd
Give more correct "* OK searched n%" notifications with fts and virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8497
diff
changeset
|
1101 |
7647
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
7642
diff
changeset
|
1102 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
|
1103 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
|
1104 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
|
1105 |
7642
077bb84e9e77
Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents:
7640
diff
changeset
|
1106 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
|
1107 if (args->have_inthreads) { |
10946
0cf62ad4c7bf
lib-storage: Moved index transaction/view from index_transaction to mailbox_transaction.
Timo Sirainen <tss@iki.fi>
parents:
10660
diff
changeset
|
1108 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
|
1109 ctx->failed = TRUE; |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
1110 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
|
1111 ctx->failed = TRUE; |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
1112 } |
1844
4c2678dd65f1
Some optimizations to messageset handling in search.
Timo Sirainen <tss@iki.fi>
parents:
1782
diff
changeset
|
1113 |
12611
16a541057e88
lib-storage: Moved setting "wanted fields/headers" fields for sort program from imap-specific code.
Timo Sirainen <tss@iki.fi>
parents:
12608
diff
changeset
|
1114 if (sort_program != NULL) { |
16a541057e88
lib-storage: Moved setting "wanted fields/headers" fields for sort program from imap-specific code.
Timo Sirainen <tss@iki.fi>
parents:
12608
diff
changeset
|
1115 wanted_sort_fields_get(ctx->box, sort_program, |
16a541057e88
lib-storage: Moved setting "wanted fields/headers" fields for sort program from imap-specific code.
Timo Sirainen <tss@iki.fi>
parents:
12608
diff
changeset
|
1116 &ctx->extra_wanted_fields, |
16a541057e88
lib-storage: Moved setting "wanted fields/headers" fields for sort program from imap-specific code.
Timo Sirainen <tss@iki.fi>
parents:
12608
diff
changeset
|
1117 &ctx->extra_wanted_headers); |
16a541057e88
lib-storage: Moved setting "wanted fields/headers" fields for sort program from imap-specific code.
Timo Sirainen <tss@iki.fi>
parents:
12608
diff
changeset
|
1118 } |
16a541057e88
lib-storage: Moved setting "wanted fields/headers" fields for sort program from imap-specific code.
Timo Sirainen <tss@iki.fi>
parents:
12608
diff
changeset
|
1119 |
10643
e0b6f739510d
lib-storage: Use mailbox_status() to get number of messages in search code.
Timo Sirainen <tss@iki.fi>
parents:
10582
diff
changeset
|
1120 search_get_seqset(ctx, status.messages, args->args); |
7642
077bb84e9e77
Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents:
7640
diff
changeset
|
1121 (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
|
1122 |
913b188f4dd4
Removed explicit locking from views and maps. They were already locked all
Timo Sirainen <tss@iki.fi>
parents:
5613
diff
changeset
|
1123 /* 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
|
1124 mail_search_args_reset(ctx->mail_ctx.args->args, FALSE); |
12608
b96efbad2fa4
lib-storage: Index search context is now more accessible by backends.
Timo Sirainen <tss@iki.fi>
parents:
12550
diff
changeset
|
1125 } |
b96efbad2fa4
lib-storage: Index search context is now more accessible by backends.
Timo Sirainen <tss@iki.fi>
parents:
12550
diff
changeset
|
1126 |
b96efbad2fa4
lib-storage: Index search context is now more accessible by backends.
Timo Sirainen <tss@iki.fi>
parents:
12550
diff
changeset
|
1127 struct mail_search_context * |
b96efbad2fa4
lib-storage: Index search context is now more accessible by backends.
Timo Sirainen <tss@iki.fi>
parents:
12550
diff
changeset
|
1128 index_storage_search_init(struct mailbox_transaction_context *t, |
b96efbad2fa4
lib-storage: Index search context is now more accessible by backends.
Timo Sirainen <tss@iki.fi>
parents:
12550
diff
changeset
|
1129 struct mail_search_args *args, |
b96efbad2fa4
lib-storage: Index search context is now more accessible by backends.
Timo Sirainen <tss@iki.fi>
parents:
12550
diff
changeset
|
1130 const enum mail_sort_type *sort_program) |
b96efbad2fa4
lib-storage: Index search context is now more accessible by backends.
Timo Sirainen <tss@iki.fi>
parents:
12550
diff
changeset
|
1131 { |
b96efbad2fa4
lib-storage: Index search context is now more accessible by backends.
Timo Sirainen <tss@iki.fi>
parents:
12550
diff
changeset
|
1132 struct index_search_context *ctx; |
b96efbad2fa4
lib-storage: Index search context is now more accessible by backends.
Timo Sirainen <tss@iki.fi>
parents:
12550
diff
changeset
|
1133 |
b96efbad2fa4
lib-storage: Index search context is now more accessible by backends.
Timo Sirainen <tss@iki.fi>
parents:
12550
diff
changeset
|
1134 ctx = i_new(struct index_search_context, 1); |
b96efbad2fa4
lib-storage: Index search context is now more accessible by backends.
Timo Sirainen <tss@iki.fi>
parents:
12550
diff
changeset
|
1135 index_storage_search_init_context(ctx, t, args, sort_program); |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
1845
diff
changeset
|
1136 return &ctx->mail_ctx; |
988
8028c4dcf38f
mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents:
962
diff
changeset
|
1137 } |
8028c4dcf38f
mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents:
962
diff
changeset
|
1138 |
5527 | 1139 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
|
1140 void *context ATTR_UNUSED) |
5527 | 1141 { |
1142 struct message_search_context *search_ctx = arg->context; | |
1143 | |
1144 if (search_ctx != NULL) { | |
1145 message_search_deinit(&search_ctx); | |
1146 arg->context = NULL; | |
1147 } | |
1148 } | |
1149 | |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
1845
diff
changeset
|
1150 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
|
1151 { |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
1845
diff
changeset
|
1152 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
|
1153 int ret; |
988
8028c4dcf38f
mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents:
962
diff
changeset
|
1154 |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
1845
diff
changeset
|
1155 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
|
1156 |
8028c4dcf38f
mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents:
962
diff
changeset
|
1157 if (ctx->error != NULL) { |
10660
56b1d4dd9c7d
lib-storage: *_mailboxes don't descend from index_mailbox anymore, it's now a context.
Timo Sirainen <tss@iki.fi>
parents:
10657
diff
changeset
|
1158 mail_storage_set_error(ctx->box->storage, |
5613 | 1159 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
|
1160 } |
327
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
1161 |
7642
077bb84e9e77
Make mail_search_args an independent structure that can be used for multiple
Timo Sirainen <tss@iki.fi>
parents:
7640
diff
changeset
|
1162 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
|
1163 (void)mail_search_args_foreach(ctx->mail_ctx.args->args, |
5527 | 1164 search_arg_deinit, NULL); |
1165 | |
12611
16a541057e88
lib-storage: Moved setting "wanted fields/headers" fields for sort program from imap-specific code.
Timo Sirainen <tss@iki.fi>
parents:
12608
diff
changeset
|
1166 if (ctx->extra_wanted_headers != NULL) |
16a541057e88
lib-storage: Moved setting "wanted fields/headers" fields for sort program from imap-specific code.
Timo Sirainen <tss@iki.fi>
parents:
12608
diff
changeset
|
1167 mailbox_header_lookup_unref(&ctx->extra_wanted_headers); |
4607
71b3570946f8
Moved some search parameters to public struct mail_search_context and added
Timo Sirainen <tss@iki.fi>
parents:
4439
diff
changeset
|
1168 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
|
1169 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
|
1170 if (ctx->thread_ctx != NULL) |
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
1171 mail_thread_deinit(&ctx->thread_ctx); |
7647
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
7642
diff
changeset
|
1172 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
|
1173 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
|
1174 i_free(ctx); |
8028c4dcf38f
mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents:
962
diff
changeset
|
1175 return ret; |
8028c4dcf38f
mail-storage.h interface changes, affects pretty much everything.
Timo Sirainen <tss@iki.fi>
parents:
962
diff
changeset
|
1176 } |
327
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
1177 |
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
|
1178 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
|
1179 { |
9162
3727bfc568b9
Search: Perform all lookups from cache before attempting any uncached lookups.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
1180 static enum mail_lookup_abort cache_lookups[] = { |
3727bfc568b9
Search: Perform all lookups from cache before attempting any uncached lookups.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
1181 MAIL_LOOKUP_ABORT_NOT_IN_CACHE, |
3727bfc568b9
Search: Perform all lookups from cache before attempting any uncached lookups.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
1182 MAIL_LOOKUP_ABORT_READ_MAIL, |
3727bfc568b9
Search: Perform all lookups from cache before attempting any uncached lookups.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
1183 MAIL_LOOKUP_ABORT_NEVER |
3727bfc568b9
Search: Perform all lookups from cache before attempting any uncached lookups.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
1184 }; |
3727bfc568b9
Search: Perform all lookups from cache before attempting any uncached lookups.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
1185 unsigned int i; |
3727bfc568b9
Search: Perform all lookups from cache before attempting any uncached lookups.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
1186 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
|
1187 |
12608
b96efbad2fa4
lib-storage: Index search context is now more accessible by backends.
Timo Sirainen <tss@iki.fi>
parents:
12550
diff
changeset
|
1188 if (ctx->recheck_index_args) { |
b96efbad2fa4
lib-storage: Index search context is now more accessible by backends.
Timo Sirainen <tss@iki.fi>
parents:
12550
diff
changeset
|
1189 /* these were already checked in search_next_update_seq(), |
b96efbad2fa4
lib-storage: Index search context is now more accessible by backends.
Timo Sirainen <tss@iki.fi>
parents:
12550
diff
changeset
|
1190 but someone reset the args and we have to recheck them */ |
b96efbad2fa4
lib-storage: Index search context is now more accessible by backends.
Timo Sirainen <tss@iki.fi>
parents:
12550
diff
changeset
|
1191 ret = mail_search_args_foreach(ctx->mail_ctx.args->args, |
b96efbad2fa4
lib-storage: Index search context is now more accessible by backends.
Timo Sirainen <tss@iki.fi>
parents:
12550
diff
changeset
|
1192 search_seqset_arg, ctx); |
b96efbad2fa4
lib-storage: Index search context is now more accessible by backends.
Timo Sirainen <tss@iki.fi>
parents:
12550
diff
changeset
|
1193 if (ctx->have_index_args) { |
b96efbad2fa4
lib-storage: Index search context is now more accessible by backends.
Timo Sirainen <tss@iki.fi>
parents:
12550
diff
changeset
|
1194 ret = mail_search_args_foreach(ctx->mail_ctx.args->args, |
b96efbad2fa4
lib-storage: Index search context is now more accessible by backends.
Timo Sirainen <tss@iki.fi>
parents:
12550
diff
changeset
|
1195 search_index_arg, ctx); |
b96efbad2fa4
lib-storage: Index search context is now more accessible by backends.
Timo Sirainen <tss@iki.fi>
parents:
12550
diff
changeset
|
1196 } |
b96efbad2fa4
lib-storage: Index search context is now more accessible by backends.
Timo Sirainen <tss@iki.fi>
parents:
12550
diff
changeset
|
1197 } |
b96efbad2fa4
lib-storage: Index search context is now more accessible by backends.
Timo Sirainen <tss@iki.fi>
parents:
12550
diff
changeset
|
1198 |
11238
dedf835014a2
lib-storage: Fixes/optimizations to SEARCH_MAILBOX*.
Timo Sirainen <tss@iki.fi>
parents:
11234
diff
changeset
|
1199 if (ctx->have_mailbox_args) { |
dedf835014a2
lib-storage: Fixes/optimizations to SEARCH_MAILBOX*.
Timo Sirainen <tss@iki.fi>
parents:
11234
diff
changeset
|
1200 ret = mail_search_args_foreach(ctx->mail_ctx.args->args, |
dedf835014a2
lib-storage: Fixes/optimizations to SEARCH_MAILBOX*.
Timo Sirainen <tss@iki.fi>
parents:
11234
diff
changeset
|
1201 search_mailbox_arg, ctx); |
dedf835014a2
lib-storage: Fixes/optimizations to SEARCH_MAILBOX*.
Timo Sirainen <tss@iki.fi>
parents:
11234
diff
changeset
|
1202 if (ret >= 0) |
dedf835014a2
lib-storage: Fixes/optimizations to SEARCH_MAILBOX*.
Timo Sirainen <tss@iki.fi>
parents:
11234
diff
changeset
|
1203 return ret > 0; |
dedf835014a2
lib-storage: Fixes/optimizations to SEARCH_MAILBOX*.
Timo Sirainen <tss@iki.fi>
parents:
11234
diff
changeset
|
1204 } |
dedf835014a2
lib-storage: Fixes/optimizations to SEARCH_MAILBOX*.
Timo Sirainen <tss@iki.fi>
parents:
11234
diff
changeset
|
1205 |
9162
3727bfc568b9
Search: Perform all lookups from cache before attempting any uncached lookups.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
1206 /* try to avoid doing extra work for as long as possible */ |
3727bfc568b9
Search: Perform all lookups from cache before attempting any uncached lookups.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
1207 for (i = 0; i < N_ELEMENTS(cache_lookups) && ret < 0; i++) { |
3727bfc568b9
Search: Perform all lookups from cache before attempting any uncached lookups.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
1208 ctx->mail->lookup_abort = cache_lookups[i]; |
3727bfc568b9
Search: Perform all lookups from cache before attempting any uncached lookups.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
1209 ret = mail_search_args_foreach(ctx->mail_ctx.args->args, |
3727bfc568b9
Search: Perform all lookups from cache before attempting any uncached lookups.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
1210 search_cached_arg, ctx); |
3727bfc568b9
Search: Perform all lookups from cache before attempting any uncached lookups.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
1211 if (ret >= 0) |
3727bfc568b9
Search: Perform all lookups from cache before attempting any uncached lookups.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
1212 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
|
1213 |
9164
9b8bf57405c8
Use the new mail_private.stats_* fields to stop non-blocking searches after about 250 ms.
Timo Sirainen <tss@iki.fi>
parents:
9162
diff
changeset
|
1214 ret = search_arg_match_text(ctx->mail_ctx.args->args, ctx, ret); |
9162
3727bfc568b9
Search: Perform all lookups from cache before attempting any uncached lookups.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
1215 if (ret >= 0) |
3727bfc568b9
Search: Perform all lookups from cache before attempting any uncached lookups.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
1216 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
|
1217 } |
9162
3727bfc568b9
Search: Perform all lookups from cache before attempting any uncached lookups.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
1218 ctx->mail->lookup_abort = MAIL_LOOKUP_ABORT_NEVER; |
3727bfc568b9
Search: Perform all lookups from cache before attempting any uncached lookups.
Timo Sirainen <tss@iki.fi>
parents:
8590
diff
changeset
|
1219 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
|
1220 } |
8920600a8cfc
Index cache file rewrite. It's not finished yet and mbox support is
Timo Sirainen <tss@iki.fi>
parents:
1638
diff
changeset
|
1221 |
4949
a959d4208b54
Moved storage callbacks to struct mail_storage. If searching takes over 10
Timo Sirainen <tss@iki.fi>
parents:
4942
diff
changeset
|
1222 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
|
1223 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
|
1224 { |
a959d4208b54
Moved storage callbacks to struct mail_storage. If searching takes over 10
Timo Sirainen <tss@iki.fi>
parents:
4942
diff
changeset
|
1225 float percentage; |
a959d4208b54
Moved storage callbacks to struct mail_storage. If searching takes over 10
Timo Sirainen <tss@iki.fi>
parents:
4942
diff
changeset
|
1226 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
|
1227 |
a959d4208b54
Moved storage callbacks to struct mail_storage. If searching takes over 10
Timo Sirainen <tss@iki.fi>
parents:
4942
diff
changeset
|
1228 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
|
1229 /* 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
|
1230 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
|
1231 ctx->search_start_time = ioloop_timeval; |
9453
2a3390530f6a
struct mail_storage.callbacks is no longer a pointer.
Timo Sirainen <tss@iki.fi>
parents:
9305
diff
changeset
|
1232 } else if (box->storage->callbacks.notify_ok != NULL && |
8508
689a63a99363
fts: Hide "Searching .." notify while indexing.
Timo Sirainen <tss@iki.fi>
parents:
8507
diff
changeset
|
1233 !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
|
1234 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
|
1235 ctx->mail_ctx.progress_max; |
9769
8716936443db
Moved all struct timeval comparing/calculation code to lib/time-util.
Timo Sirainen <tss@iki.fi>
parents:
9704
diff
changeset
|
1236 msecs = timeval_diff_msecs(&ioloop_timeval, |
8716936443db
Moved all struct timeval comparing/calculation code to lib/time-util.
Timo Sirainen <tss@iki.fi>
parents:
9704
diff
changeset
|
1237 &ctx->search_start_time); |
4949
a959d4208b54
Moved storage callbacks to struct mail_storage. If searching takes over 10
Timo Sirainen <tss@iki.fi>
parents:
4942
diff
changeset
|
1238 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
|
1239 |
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
|
1240 T_BEGIN { |
6940
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6899
diff
changeset
|
1241 const char *text; |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6899
diff
changeset
|
1242 |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6899
diff
changeset
|
1243 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
|
1244 "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
|
1245 secs/60, secs%60); |
9453
2a3390530f6a
struct mail_storage.callbacks is no longer a pointer.
Timo Sirainen <tss@iki.fi>
parents:
9305
diff
changeset
|
1246 box->storage->callbacks. |
6940
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6899
diff
changeset
|
1247 notify_ok(box, text, |
414c9d631a81
Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents:
6899
diff
changeset
|
1248 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
|
1249 } 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
|
1250 } |
a959d4208b54
Moved storage callbacks to struct mail_storage. If searching takes over 10
Timo Sirainen <tss@iki.fi>
parents:
4942
diff
changeset
|
1251 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
|
1252 } |
a959d4208b54
Moved storage callbacks to struct mail_storage. If searching takes over 10
Timo Sirainen <tss@iki.fi>
parents:
4942
diff
changeset
|
1253 |
7647
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
7642
diff
changeset
|
1254 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
|
1255 { |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
7642
diff
changeset
|
1256 struct mail_search_arg *subarg; |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
7642
diff
changeset
|
1257 |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
7642
diff
changeset
|
1258 switch (arg->type) { |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
7642
diff
changeset
|
1259 case SEARCH_OR: |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
7642
diff
changeset
|
1260 case SEARCH_SUB: |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
7642
diff
changeset
|
1261 /* they're static only if all subargs are static */ |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
7642
diff
changeset
|
1262 subarg = arg->value.subargs; |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
7642
diff
changeset
|
1263 for (; subarg != NULL; subarg = subarg->next) { |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
7642
diff
changeset
|
1264 if (!search_arg_is_static(subarg)) |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
7642
diff
changeset
|
1265 return FALSE; |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
7642
diff
changeset
|
1266 } |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
7642
diff
changeset
|
1267 return TRUE; |
7908
1e69c84a1e5a
Search code cleanups and minor optimizations.
Timo Sirainen <tss@iki.fi>
parents:
7828
diff
changeset
|
1268 case SEARCH_SEQSET: |
1e69c84a1e5a
Search code cleanups and minor optimizations.
Timo Sirainen <tss@iki.fi>
parents:
7828
diff
changeset
|
1269 /* 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
|
1270 currently. seqsets should be converted to uidsets first. */ |
7647
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
7642
diff
changeset
|
1271 case SEARCH_FLAGS: |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
7642
diff
changeset
|
1272 case SEARCH_KEYWORDS: |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
7642
diff
changeset
|
1273 case SEARCH_MODSEQ: |
7909
bf9c51edbc66
Added non-optimized support for SEARCH INTHREAD.
Timo Sirainen <tss@iki.fi>
parents:
7908
diff
changeset
|
1274 case SEARCH_INTHREAD: |
7647
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
7642
diff
changeset
|
1275 break; |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
7642
diff
changeset
|
1276 case SEARCH_ALL: |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
7642
diff
changeset
|
1277 case SEARCH_UIDSET: |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
7642
diff
changeset
|
1278 case SEARCH_BEFORE: |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
7642
diff
changeset
|
1279 case SEARCH_ON: |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
7642
diff
changeset
|
1280 case SEARCH_SINCE: |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
7642
diff
changeset
|
1281 case SEARCH_SMALLER: |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
7642
diff
changeset
|
1282 case SEARCH_LARGER: |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
7642
diff
changeset
|
1283 case SEARCH_HEADER: |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
7642
diff
changeset
|
1284 case SEARCH_HEADER_ADDRESS: |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
7642
diff
changeset
|
1285 case SEARCH_HEADER_COMPRESS_LWSP: |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
7642
diff
changeset
|
1286 case SEARCH_BODY: |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
7642
diff
changeset
|
1287 case SEARCH_TEXT: |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
7642
diff
changeset
|
1288 case SEARCH_BODY_FAST: |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
7642
diff
changeset
|
1289 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
|
1290 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
|
1291 case SEARCH_MAILBOX: |
11232
389a251c9cfe
lib-storage: Added support for searching with mailbox GUID.
Timo Sirainen <tss@iki.fi>
parents:
11197
diff
changeset
|
1292 case SEARCH_MAILBOX_GUID: |
11197
3c9770bae39e
lib-storage: Added MAILBOX_GLOB search arg. Query builders now use it instead of MAILBOX.
Timo Sirainen <tss@iki.fi>
parents:
11141
diff
changeset
|
1293 case SEARCH_MAILBOX_GLOB: |
7647
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
7642
diff
changeset
|
1294 return TRUE; |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
7642
diff
changeset
|
1295 } |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
7642
diff
changeset
|
1296 return FALSE; |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
7642
diff
changeset
|
1297 } |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
7642
diff
changeset
|
1298 |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
7642
diff
changeset
|
1299 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
|
1300 { |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
7642
diff
changeset
|
1301 for (; arg != NULL; arg = arg->next) { |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
7642
diff
changeset
|
1302 if (search_arg_is_static(arg)) |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
7642
diff
changeset
|
1303 arg->result = 1; |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
7642
diff
changeset
|
1304 } |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
7642
diff
changeset
|
1305 } |
879208fdc7e3
Implemented CONTEXT=SEARCH extension.
Timo Sirainen <tss@iki.fi>
parents:
7642
diff
changeset
|
1306 |
7671
882888286bf5
Saved search results: Remember what messages' static checks never match, so
Timo Sirainen <tss@iki.fi>
parents:
7647
diff
changeset
|
1307 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
|
1308 { |
882888286bf5
Saved search results: Remember what messages' static checks never match, so
Timo Sirainen <tss@iki.fi>
parents:
7647
diff
changeset
|
1309 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
|
1310 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
|
1311 return TRUE; |
882888286bf5
Saved search results: Remember what messages' static checks never match, so
Timo Sirainen <tss@iki.fi>
parents:
7647
diff
changeset
|
1312 } |
882888286bf5
Saved search results: Remember what messages' static checks never match, so
Timo Sirainen <tss@iki.fi>
parents:
7647
diff
changeset
|
1313 return FALSE; |
882888286bf5
Saved search results: Remember what messages' static checks never match, so
Timo Sirainen <tss@iki.fi>
parents:
7647
diff
changeset
|
1314 } |
882888286bf5
Saved search results: Remember what messages' static checks never match, so
Timo Sirainen <tss@iki.fi>
parents:
7647
diff
changeset
|
1315 |
9164
9b8bf57405c8
Use the new mail_private.stats_* fields to stop non-blocking searches after about 250 ms.
Timo Sirainen <tss@iki.fi>
parents:
9162
diff
changeset
|
1316 static unsigned long long search_mail_get_cost(struct mail_private *mail) |
9b8bf57405c8
Use the new mail_private.stats_* fields to stop non-blocking searches after about 250 ms.
Timo Sirainen <tss@iki.fi>
parents:
9162
diff
changeset
|
1317 { |
9174
1ad6926f46a2
Split struct mail_private.stats_dentry_lookup_count to open/stat counts.
Timo Sirainen <tss@iki.fi>
parents:
9164
diff
changeset
|
1318 return mail->stats_open_lookup_count * SEARCH_COST_DENTRY + |
1ad6926f46a2
Split struct mail_private.stats_dentry_lookup_count to open/stat counts.
Timo Sirainen <tss@iki.fi>
parents:
9164
diff
changeset
|
1319 mail->stats_stat_lookup_count * SEARCH_COST_DENTRY + |
1ad6926f46a2
Split struct mail_private.stats_dentry_lookup_count to open/stat counts.
Timo Sirainen <tss@iki.fi>
parents:
9164
diff
changeset
|
1320 mail->stats_fstat_lookup_count * SEARCH_COST_ATTR + |
9164
9b8bf57405c8
Use the new mail_private.stats_* fields to stop non-blocking searches after about 250 ms.
Timo Sirainen <tss@iki.fi>
parents:
9162
diff
changeset
|
1321 mail->stats_cache_hit_count * SEARCH_COST_CACHE + |
9b8bf57405c8
Use the new mail_private.stats_* fields to stop non-blocking searches after about 250 ms.
Timo Sirainen <tss@iki.fi>
parents:
9162
diff
changeset
|
1322 mail->stats_files_read_count * SEARCH_COST_FILES_READ + |
9b8bf57405c8
Use the new mail_private.stats_* fields to stop non-blocking searches after about 250 ms.
Timo Sirainen <tss@iki.fi>
parents:
9162
diff
changeset
|
1323 (mail->stats_files_read_bytes/1024) * SEARCH_COST_KBYTE; |
9b8bf57405c8
Use the new mail_private.stats_* fields to stop non-blocking searches after about 250 ms.
Timo Sirainen <tss@iki.fi>
parents:
9162
diff
changeset
|
1324 } |
9b8bf57405c8
Use the new mail_private.stats_* fields to stop non-blocking searches after about 250 ms.
Timo Sirainen <tss@iki.fi>
parents:
9162
diff
changeset
|
1325 |
9b8bf57405c8
Use the new mail_private.stats_* fields to stop non-blocking searches after about 250 ms.
Timo Sirainen <tss@iki.fi>
parents:
9162
diff
changeset
|
1326 static bool search_would_block(struct index_search_context *ctx) |
9b8bf57405c8
Use the new mail_private.stats_* fields to stop non-blocking searches after about 250 ms.
Timo Sirainen <tss@iki.fi>
parents:
9162
diff
changeset
|
1327 { |
9b8bf57405c8
Use the new mail_private.stats_* fields to stop non-blocking searches after about 250 ms.
Timo Sirainen <tss@iki.fi>
parents:
9162
diff
changeset
|
1328 struct timeval now; |
9b8bf57405c8
Use the new mail_private.stats_* fields to stop non-blocking searches after about 250 ms.
Timo Sirainen <tss@iki.fi>
parents:
9162
diff
changeset
|
1329 unsigned long long guess_cost; |
9769
8716936443db
Moved all struct timeval comparing/calculation code to lib/time-util.
Timo Sirainen <tss@iki.fi>
parents:
9704
diff
changeset
|
1330 long long usecs; |
9164
9b8bf57405c8
Use the new mail_private.stats_* fields to stop non-blocking searches after about 250 ms.
Timo Sirainen <tss@iki.fi>
parents:
9162
diff
changeset
|
1331 bool ret; |
9b8bf57405c8
Use the new mail_private.stats_* fields to stop non-blocking searches after about 250 ms.
Timo Sirainen <tss@iki.fi>
parents:
9162
diff
changeset
|
1332 |
9b8bf57405c8
Use the new mail_private.stats_* fields to stop non-blocking searches after about 250 ms.
Timo Sirainen <tss@iki.fi>
parents:
9162
diff
changeset
|
1333 if (ctx->cost < ctx->next_time_check_cost) |
9b8bf57405c8
Use the new mail_private.stats_* fields to stop non-blocking searches after about 250 ms.
Timo Sirainen <tss@iki.fi>
parents:
9162
diff
changeset
|
1334 return FALSE; |
9b8bf57405c8
Use the new mail_private.stats_* fields to stop non-blocking searches after about 250 ms.
Timo Sirainen <tss@iki.fi>
parents:
9162
diff
changeset
|
1335 |
9b8bf57405c8
Use the new mail_private.stats_* fields to stop non-blocking searches after about 250 ms.
Timo Sirainen <tss@iki.fi>
parents:
9162
diff
changeset
|
1336 if (gettimeofday(&now, NULL) < 0) |
9b8bf57405c8
Use the new mail_private.stats_* fields to stop non-blocking searches after about 250 ms.
Timo Sirainen <tss@iki.fi>
parents:
9162
diff
changeset
|
1337 i_fatal("gettimeofday() failed: %m"); |
9769
8716936443db
Moved all struct timeval comparing/calculation code to lib/time-util.
Timo Sirainen <tss@iki.fi>
parents:
9704
diff
changeset
|
1338 |
8716936443db
Moved all struct timeval comparing/calculation code to lib/time-util.
Timo Sirainen <tss@iki.fi>
parents:
9704
diff
changeset
|
1339 usecs = timeval_diff_usecs(&now, &ctx->last_nonblock_timeval); |
8716936443db
Moved all struct timeval comparing/calculation code to lib/time-util.
Timo Sirainen <tss@iki.fi>
parents:
9704
diff
changeset
|
1340 if (usecs < 0) { |
9164
9b8bf57405c8
Use the new mail_private.stats_* fields to stop non-blocking searches after about 250 ms.
Timo Sirainen <tss@iki.fi>
parents:
9162
diff
changeset
|
1341 /* clock moved backwards. */ |
9b8bf57405c8
Use the new mail_private.stats_* fields to stop non-blocking searches after about 250 ms.
Timo Sirainen <tss@iki.fi>
parents:
9162
diff
changeset
|
1342 ctx->last_nonblock_timeval = now; |
9b8bf57405c8
Use the new mail_private.stats_* fields to stop non-blocking searches after about 250 ms.
Timo Sirainen <tss@iki.fi>
parents:
9162
diff
changeset
|
1343 ctx->next_time_check_cost = SEARCH_INITIAL_MAX_COST; |
9b8bf57405c8
Use the new mail_private.stats_* fields to stop non-blocking searches after about 250 ms.
Timo Sirainen <tss@iki.fi>
parents:
9162
diff
changeset
|
1344 return TRUE; |
9b8bf57405c8
Use the new mail_private.stats_* fields to stop non-blocking searches after about 250 ms.
Timo Sirainen <tss@iki.fi>
parents:
9162
diff
changeset
|
1345 } else if (usecs < SEARCH_MIN_NONBLOCK_USECS) { |
9b8bf57405c8
Use the new mail_private.stats_* fields to stop non-blocking searches after about 250 ms.
Timo Sirainen <tss@iki.fi>
parents:
9162
diff
changeset
|
1346 /* not finished yet. estimate the next time lookup */ |
9b8bf57405c8
Use the new mail_private.stats_* fields to stop non-blocking searches after about 250 ms.
Timo Sirainen <tss@iki.fi>
parents:
9162
diff
changeset
|
1347 ret = FALSE; |
9b8bf57405c8
Use the new mail_private.stats_* fields to stop non-blocking searches after about 250 ms.
Timo Sirainen <tss@iki.fi>
parents:
9162
diff
changeset
|
1348 } else { |
9b8bf57405c8
Use the new mail_private.stats_* fields to stop non-blocking searches after about 250 ms.
Timo Sirainen <tss@iki.fi>
parents:
9162
diff
changeset
|
1349 /* done, or close enough anyway */ |
9b8bf57405c8
Use the new mail_private.stats_* fields to stop non-blocking searches after about 250 ms.
Timo Sirainen <tss@iki.fi>
parents:
9162
diff
changeset
|
1350 ctx->last_nonblock_timeval = now; |
9b8bf57405c8
Use the new mail_private.stats_* fields to stop non-blocking searches after about 250 ms.
Timo Sirainen <tss@iki.fi>
parents:
9162
diff
changeset
|
1351 ret = TRUE; |
9b8bf57405c8
Use the new mail_private.stats_* fields to stop non-blocking searches after about 250 ms.
Timo Sirainen <tss@iki.fi>
parents:
9162
diff
changeset
|
1352 } |
9b8bf57405c8
Use the new mail_private.stats_* fields to stop non-blocking searches after about 250 ms.
Timo Sirainen <tss@iki.fi>
parents:
9162
diff
changeset
|
1353 guess_cost = ctx->cost * |
9b8bf57405c8
Use the new mail_private.stats_* fields to stop non-blocking searches after about 250 ms.
Timo Sirainen <tss@iki.fi>
parents:
9162
diff
changeset
|
1354 (SEARCH_MAX_NONBLOCK_USECS / (double)usecs); |
9b8bf57405c8
Use the new mail_private.stats_* fields to stop non-blocking searches after about 250 ms.
Timo Sirainen <tss@iki.fi>
parents:
9162
diff
changeset
|
1355 if (usecs < SEARCH_RECALC_MIN_USECS) { |
9b8bf57405c8
Use the new mail_private.stats_* fields to stop non-blocking searches after about 250 ms.
Timo Sirainen <tss@iki.fi>
parents:
9162
diff
changeset
|
1356 /* the estimate may not be very good since we spent |
9b8bf57405c8
Use the new mail_private.stats_* fields to stop non-blocking searches after about 250 ms.
Timo Sirainen <tss@iki.fi>
parents:
9162
diff
changeset
|
1357 so little time doing this search. don't allow huge changes |
9b8bf57405c8
Use the new mail_private.stats_* fields to stop non-blocking searches after about 250 ms.
Timo Sirainen <tss@iki.fi>
parents:
9162
diff
changeset
|
1358 to the guess, but allow anyway large enough so that we can |
9b8bf57405c8
Use the new mail_private.stats_* fields to stop non-blocking searches after about 250 ms.
Timo Sirainen <tss@iki.fi>
parents:
9162
diff
changeset
|
1359 move to right direction. */ |
9b8bf57405c8
Use the new mail_private.stats_* fields to stop non-blocking searches after about 250 ms.
Timo Sirainen <tss@iki.fi>
parents:
9162
diff
changeset
|
1360 if (guess_cost > ctx->next_time_check_cost*3) |
9b8bf57405c8
Use the new mail_private.stats_* fields to stop non-blocking searches after about 250 ms.
Timo Sirainen <tss@iki.fi>
parents:
9162
diff
changeset
|
1361 guess_cost = ctx->next_time_check_cost*3; |
9b8bf57405c8
Use the new mail_private.stats_* fields to stop non-blocking searches after about 250 ms.
Timo Sirainen <tss@iki.fi>
parents:
9162
diff
changeset
|
1362 else if (guess_cost < ctx->next_time_check_cost/3) |
9b8bf57405c8
Use the new mail_private.stats_* fields to stop non-blocking searches after about 250 ms.
Timo Sirainen <tss@iki.fi>
parents:
9162
diff
changeset
|
1363 guess_cost = ctx->next_time_check_cost/3; |
9b8bf57405c8
Use the new mail_private.stats_* fields to stop non-blocking searches after about 250 ms.
Timo Sirainen <tss@iki.fi>
parents:
9162
diff
changeset
|
1364 } |
9b8bf57405c8
Use the new mail_private.stats_* fields to stop non-blocking searches after about 250 ms.
Timo Sirainen <tss@iki.fi>
parents:
9162
diff
changeset
|
1365 if (ret) |
9b8bf57405c8
Use the new mail_private.stats_* fields to stop non-blocking searches after about 250 ms.
Timo Sirainen <tss@iki.fi>
parents:
9162
diff
changeset
|
1366 ctx->cost = 0; |
9b8bf57405c8
Use the new mail_private.stats_* fields to stop non-blocking searches after about 250 ms.
Timo Sirainen <tss@iki.fi>
parents:
9162
diff
changeset
|
1367 ctx->next_time_check_cost = guess_cost; |
9b8bf57405c8
Use the new mail_private.stats_* fields to stop non-blocking searches after about 250 ms.
Timo Sirainen <tss@iki.fi>
parents:
9162
diff
changeset
|
1368 return ret; |
9b8bf57405c8
Use the new mail_private.stats_* fields to stop non-blocking searches after about 250 ms.
Timo Sirainen <tss@iki.fi>
parents:
9162
diff
changeset
|
1369 } |
9b8bf57405c8
Use the new mail_private.stats_* fields to stop non-blocking searches after about 250 ms.
Timo Sirainen <tss@iki.fi>
parents:
9162
diff
changeset
|
1370 |
10347
0156d98bc822
mailbox_search_next*() API changed to return bool.
Timo Sirainen <tss@iki.fi>
parents:
9769
diff
changeset
|
1371 bool index_storage_search_next_nonblock(struct mail_search_context *_ctx, |
0156d98bc822
mailbox_search_next*() API changed to return bool.
Timo Sirainen <tss@iki.fi>
parents:
9769
diff
changeset
|
1372 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
|
1373 { |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
1845
diff
changeset
|
1374 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
|
1375 struct mailbox *box = _ctx->transaction->box; |
8497
8a511d7da23f
Fixed searching in virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8481
diff
changeset
|
1376 struct mail_private *mail_private = (struct mail_private *)mail; |
9164
9b8bf57405c8
Use the new mail_private.stats_* fields to stop non-blocking searches after about 250 ms.
Timo Sirainen <tss@iki.fi>
parents:
9162
diff
changeset
|
1377 unsigned long long cost1, cost2; |
9b8bf57405c8
Use the new mail_private.stats_* fields to stop non-blocking searches after about 250 ms.
Timo Sirainen <tss@iki.fi>
parents:
9162
diff
changeset
|
1378 bool old_stats_track, match = FALSE; |
0 | 1379 |
4939
ff2272c228cc
Dovecot is now able to execute multiple commands at the same time.
Timo Sirainen <tss@iki.fi>
parents:
4907
diff
changeset
|
1380 *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
|
1381 |
ff2272c228cc
Dovecot is now able to execute multiple commands at the same time.
Timo Sirainen <tss@iki.fi>
parents:
4907
diff
changeset
|
1382 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
|
1383 /* 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
|
1384 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
|
1385 if (!index_sort_list_next(ctx->mail_ctx.sort_program, mail)) |
10347
0156d98bc822
mailbox_search_next*() API changed to return bool.
Timo Sirainen <tss@iki.fi>
parents:
9769
diff
changeset
|
1386 return FALSE; |
0156d98bc822
mailbox_search_next*() API changed to return bool.
Timo Sirainen <tss@iki.fi>
parents:
9769
diff
changeset
|
1387 return TRUE; |
4939
ff2272c228cc
Dovecot is now able to execute multiple commands at the same time.
Timo Sirainen <tss@iki.fi>
parents:
4907
diff
changeset
|
1388 } |
4303
5f03738219a6
Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4259
diff
changeset
|
1389 |
9164
9b8bf57405c8
Use the new mail_private.stats_* fields to stop non-blocking searches after about 250 ms.
Timo Sirainen <tss@iki.fi>
parents:
9162
diff
changeset
|
1390 if (search_would_block(ctx)) { |
9b8bf57405c8
Use the new mail_private.stats_* fields to stop non-blocking searches after about 250 ms.
Timo Sirainen <tss@iki.fi>
parents:
9162
diff
changeset
|
1391 /* this lookup is useful when a large number of |
9b8bf57405c8
Use the new mail_private.stats_* fields to stop non-blocking searches after about 250 ms.
Timo Sirainen <tss@iki.fi>
parents:
9162
diff
changeset
|
1392 messages match */ |
9b8bf57405c8
Use the new mail_private.stats_* fields to stop non-blocking searches after about 250 ms.
Timo Sirainen <tss@iki.fi>
parents:
9162
diff
changeset
|
1393 *tryagain_r = TRUE; |
10347
0156d98bc822
mailbox_search_next*() API changed to return bool.
Timo Sirainen <tss@iki.fi>
parents:
9769
diff
changeset
|
1394 return FALSE; |
9164
9b8bf57405c8
Use the new mail_private.stats_* fields to stop non-blocking searches after about 250 ms.
Timo Sirainen <tss@iki.fi>
parents:
9162
diff
changeset
|
1395 } |
9b8bf57405c8
Use the new mail_private.stats_* fields to stop non-blocking searches after about 250 ms.
Timo Sirainen <tss@iki.fi>
parents:
9162
diff
changeset
|
1396 |
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
|
1397 ctx->mail = mail; |
12611
16a541057e88
lib-storage: Moved setting "wanted fields/headers" fields for sort program from imap-specific code.
Timo Sirainen <tss@iki.fi>
parents:
12608
diff
changeset
|
1398 mail_private->extra_wanted_fields = ctx->extra_wanted_fields; |
16a541057e88
lib-storage: Moved setting "wanted fields/headers" fields for sort program from imap-specific code.
Timo Sirainen <tss@iki.fi>
parents:
12608
diff
changeset
|
1399 mail_private->extra_wanted_headers = ctx->extra_wanted_headers; |
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
|
1400 |
4949
a959d4208b54
Moved storage callbacks to struct mail_storage. If searching takes over 10
Timo Sirainen <tss@iki.fi>
parents:
4942
diff
changeset
|
1401 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
|
1402 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
|
1403 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
|
1404 |
9164
9b8bf57405c8
Use the new mail_private.stats_* fields to stop non-blocking searches after about 250 ms.
Timo Sirainen <tss@iki.fi>
parents:
9162
diff
changeset
|
1405 old_stats_track = mail_private->stats_track; |
9b8bf57405c8
Use the new mail_private.stats_* fields to stop non-blocking searches after about 250 ms.
Timo Sirainen <tss@iki.fi>
parents:
9162
diff
changeset
|
1406 mail_private->stats_track = TRUE; |
9b8bf57405c8
Use the new mail_private.stats_* fields to stop non-blocking searches after about 250 ms.
Timo Sirainen <tss@iki.fi>
parents:
9162
diff
changeset
|
1407 cost1 = search_mail_get_cost(mail_private); |
8477
c033b3e2d9b6
mail_storage.search_next_update_seq returns now bool. It was never failing.
Timo Sirainen <tss@iki.fi>
parents:
8411
diff
changeset
|
1408 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
|
1409 mail_set_seq(mail, _ctx->seq); |
11291
66bb67e074e2
lib-storage: Removed struct mail.get_index_mail(). get_real_mail() is basically the same.
Timo Sirainen <tss@iki.fi>
parents:
11238
diff
changeset
|
1410 ctx->imail = (struct index_mail *)mail_get_real_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
|
1411 |
8481
9db582413fef
Moved search update result checks to search_next_update_seq().
Timo Sirainen <tss@iki.fi>
parents:
8479
diff
changeset
|
1412 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
|
1413 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
|
1414 |
8411
abd0ef855a33
Implemented imap-response-codes draft.
Timo Sirainen <tss@iki.fi>
parents:
8146
diff
changeset
|
1415 if (ctx->mail->expunged) |
abd0ef855a33
Implemented imap-response-codes draft.
Timo Sirainen <tss@iki.fi>
parents:
8146
diff
changeset
|
1416 _ctx->seen_lost_data = TRUE; |
abd0ef855a33
Implemented imap-response-codes draft.
Timo Sirainen <tss@iki.fi>
parents:
8146
diff
changeset
|
1417 |
8477
c033b3e2d9b6
mail_storage.search_next_update_seq returns now bool. It was never failing.
Timo Sirainen <tss@iki.fi>
parents:
8411
diff
changeset
|
1418 if (!match && |
7671
882888286bf5
Saved search results: Remember what messages' static checks never match, so
Timo Sirainen <tss@iki.fi>
parents:
7647
diff
changeset
|
1419 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
|
1420 /* 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
|
1421 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
|
1422 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
|
1423 } |
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
|
1424 } T_END; |
9164
9b8bf57405c8
Use the new mail_private.stats_* fields to stop non-blocking searches after about 250 ms.
Timo Sirainen <tss@iki.fi>
parents:
9162
diff
changeset
|
1425 cost2 = search_mail_get_cost(mail_private); |
9b8bf57405c8
Use the new mail_private.stats_* fields to stop non-blocking searches after about 250 ms.
Timo Sirainen <tss@iki.fi>
parents:
9162
diff
changeset
|
1426 ctx->cost += cost2 - cost1; |
9b8bf57405c8
Use the new mail_private.stats_* fields to stop non-blocking searches after about 250 ms.
Timo Sirainen <tss@iki.fi>
parents:
9162
diff
changeset
|
1427 cost1 = cost2; |
1672
8920600a8cfc
Index cache file rewrite. It's not finished yet and mbox support is
Timo Sirainen <tss@iki.fi>
parents:
1638
diff
changeset
|
1428 |
7671
882888286bf5
Saved search results: Remember what messages' static checks never match, so
Timo Sirainen <tss@iki.fi>
parents:
7647
diff
changeset
|
1429 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
|
1430 |
1672
8920600a8cfc
Index cache file rewrite. It's not finished yet and mbox support is
Timo Sirainen <tss@iki.fi>
parents:
1638
diff
changeset
|
1431 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
|
1432 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
|
1433 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
|
1434 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
|
1435 break; |
5f03738219a6
Changed mail-storage API to do the mail sorting internally. Optimized it
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4259
diff
changeset
|
1436 |
7671
882888286bf5
Saved search results: Remember what messages' static checks never match, so
Timo Sirainen <tss@iki.fi>
parents:
7647
diff
changeset
|
1437 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
|
1438 } |
9164
9b8bf57405c8
Use the new mail_private.stats_* fields to stop non-blocking searches after about 250 ms.
Timo Sirainen <tss@iki.fi>
parents:
9162
diff
changeset
|
1439 match = FALSE; |
4939
ff2272c228cc
Dovecot is now able to execute multiple commands at the same time.
Timo Sirainen <tss@iki.fi>
parents:
4907
diff
changeset
|
1440 |
9164
9b8bf57405c8
Use the new mail_private.stats_* fields to stop non-blocking searches after about 250 ms.
Timo Sirainen <tss@iki.fi>
parents:
9162
diff
changeset
|
1441 if (search_would_block(ctx)) { |
4939
ff2272c228cc
Dovecot is now able to execute multiple commands at the same time.
Timo Sirainen <tss@iki.fi>
parents:
4907
diff
changeset
|
1442 *tryagain_r = TRUE; |
9164
9b8bf57405c8
Use the new mail_private.stats_* fields to stop non-blocking searches after about 250 ms.
Timo Sirainen <tss@iki.fi>
parents:
9162
diff
changeset
|
1443 break; |
4939
ff2272c228cc
Dovecot is now able to execute multiple commands at the same time.
Timo Sirainen <tss@iki.fi>
parents:
4907
diff
changeset
|
1444 } |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
1845
diff
changeset
|
1445 } |
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
|
1446 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
|
1447 ctx->imail = NULL; |
9164
9b8bf57405c8
Use the new mail_private.stats_* fields to stop non-blocking searches after about 250 ms.
Timo Sirainen <tss@iki.fi>
parents:
9162
diff
changeset
|
1448 mail_private->stats_track = old_stats_track; |
12611
16a541057e88
lib-storage: Moved setting "wanted fields/headers" fields for sort program from imap-specific code.
Timo Sirainen <tss@iki.fi>
parents:
12608
diff
changeset
|
1449 mail_private->extra_wanted_fields = 0; |
16a541057e88
lib-storage: Moved setting "wanted fields/headers" fields for sort program from imap-specific code.
Timo Sirainen <tss@iki.fi>
parents:
12608
diff
changeset
|
1450 mail_private->extra_wanted_headers = 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
|
1451 |
9164
9b8bf57405c8
Use the new mail_private.stats_* fields to stop non-blocking searches after about 250 ms.
Timo Sirainen <tss@iki.fi>
parents:
9162
diff
changeset
|
1452 if (!match && _ctx->sort_program != NULL && |
9b8bf57405c8
Use the new mail_private.stats_* fields to stop non-blocking searches after about 250 ms.
Timo Sirainen <tss@iki.fi>
parents:
9162
diff
changeset
|
1453 !*tryagain_r && !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
|
1454 /* 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
|
1455 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
|
1456 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
|
1457 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
|
1458 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
|
1459 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
|
1460 } |
10347
0156d98bc822
mailbox_search_next*() API changed to return bool.
Timo Sirainen <tss@iki.fi>
parents:
9769
diff
changeset
|
1461 return !ctx->failed && match; |
0 | 1462 } |
4196
6ac0d63b297f
Optimized searching a bit for cases where we can restrict search range by
Timo Sirainen <tss@iki.fi>
parents:
4062
diff
changeset
|
1463 |
8477
c033b3e2d9b6
mail_storage.search_next_update_seq returns now bool. It was never failing.
Timo Sirainen <tss@iki.fi>
parents:
8411
diff
changeset
|
1464 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
|
1465 { |
6ac0d63b297f
Optimized searching a bit for cases where we can restrict search range by
Timo Sirainen <tss@iki.fi>
parents:
4062
diff
changeset
|
1466 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
|
1467 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
|
1468 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
|
1469 |
6ac0d63b297f
Optimized searching a bit for cases where we can restrict search range by
Timo Sirainen <tss@iki.fi>
parents:
4062
diff
changeset
|
1470 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
|
1471 /* 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
|
1472 _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
|
1473 } else { |
6ac0d63b297f
Optimized searching a bit for cases where we can restrict search range by
Timo Sirainen <tss@iki.fi>
parents:
4062
diff
changeset
|
1474 _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
|
1475 } |
6ac0d63b297f
Optimized searching a bit for cases where we can restrict search range by
Timo Sirainen <tss@iki.fi>
parents:
4062
diff
changeset
|
1476 |
8481
9db582413fef
Moved search update result checks to search_next_update_seq().
Timo Sirainen <tss@iki.fi>
parents:
8479
diff
changeset
|
1477 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
|
1478 _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
|
1479 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
|
1480 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
|
1481 } |
4196
6ac0d63b297f
Optimized searching a bit for cases where we can restrict search range by
Timo Sirainen <tss@iki.fi>
parents:
4062
diff
changeset
|
1482 |
6ac0d63b297f
Optimized searching a bit for cases where we can restrict search range by
Timo Sirainen <tss@iki.fi>
parents:
4062
diff
changeset
|
1483 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
|
1484 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
|
1485 /* 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
|
1486 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
|
1487 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
|
1488 if (ret != 0 && ctx->have_index_args) { |
6966
7bb6ef75715c
Optimize searching flags and keywords.
Timo Sirainen <tss@iki.fi>
parents:
6965
diff
changeset
|
1489 /* check if flags/keywords match before anything else |
7bb6ef75715c
Optimize searching flags and keywords.
Timo Sirainen <tss@iki.fi>
parents:
6965
diff
changeset
|
1490 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
|
1491 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
|
1492 search_index_arg, ctx); |
7bb6ef75715c
Optimize searching flags and keywords.
Timo Sirainen <tss@iki.fi>
parents:
6965
diff
changeset
|
1493 } |
8481
9db582413fef
Moved search update result checks to search_next_update_seq().
Timo Sirainen <tss@iki.fi>
parents:
8479
diff
changeset
|
1494 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
|
1495 /* 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
|
1496 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
|
1497 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
|
1498 uid)) |
9db582413fef
Moved search update result checks to search_next_update_seq().
Timo Sirainen <tss@iki.fi>
parents:
8479
diff
changeset
|
1499 ret = 0; |
9db582413fef
Moved search update result checks to search_next_update_seq().
Timo Sirainen <tss@iki.fi>
parents:
8479
diff
changeset
|
1500 } |
9db582413fef
Moved search update result checks to search_next_update_seq().
Timo Sirainen <tss@iki.fi>
parents:
8479
diff
changeset
|
1501 if (ret != 0) |
9db582413fef
Moved search update result checks to search_next_update_seq().
Timo Sirainen <tss@iki.fi>
parents:
8479
diff
changeset
|
1502 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
|
1503 |
6ac0d63b297f
Optimized searching a bit for cases where we can restrict search range by
Timo Sirainen <tss@iki.fi>
parents:
4062
diff
changeset
|
1504 /* 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
|
1505 _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
|
1506 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
|
1507 } |
8481
9db582413fef
Moved search update result checks to search_next_update_seq().
Timo Sirainen <tss@iki.fi>
parents:
8479
diff
changeset
|
1508 |
9db582413fef
Moved search update result checks to search_next_update_seq().
Timo Sirainen <tss@iki.fi>
parents:
8479
diff
changeset
|
1509 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
|
1510 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
|
1511 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
|
1512 /* 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
|
1513 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
|
1514 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
|
1515 } |
9db582413fef
Moved search update result checks to search_next_update_seq().
Timo Sirainen <tss@iki.fi>
parents:
8479
diff
changeset
|
1516 } |
8507
f323bf2465bd
Give more correct "* OK searched n%" notifications with fts and virtual mailboxes.
Timo Sirainen <tss@iki.fi>
parents:
8497
diff
changeset
|
1517 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
|
1518 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
|
1519 } |