Mercurial > dovecot > core-2.2
annotate src/lib-storage/index/index-search.c @ 505:78ae6262d6ca HEAD
More (char *) -> (const char *) fixes
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Fri, 25 Oct 2002 04:57:20 +0300 |
parents | 00d857873975 |
children | 2cb2e0a3423b |
rev | line source |
---|---|
0 | 1 /* Copyright (C) 2002 Timo Sirainen */ |
2 | |
3 #include "lib.h" | |
410
1f0e7229ee58
Split IOBuffer into mmaped IBuffer, file IBuffer, memory data IBuffer and
Timo Sirainen <tss@iki.fi>
parents:
408
diff
changeset
|
4 #include "ibuffer.h" |
1f0e7229ee58
Split IOBuffer into mmaped IBuffer, file IBuffer, memory data IBuffer and
Timo Sirainen <tss@iki.fi>
parents:
408
diff
changeset
|
5 #include "obuffer.h" |
0 | 6 #include "mmap-util.h" |
7 #include "rfc822-tokenize.h" | |
408
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
8 #include "rfc822-date.h" |
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
9 #include "message-size.h" |
119
2f67de235489
Whops, we were using RFC822 dates everywhere instead of IMAP dates.
Timo Sirainen <tss@iki.fi>
parents:
109
diff
changeset
|
10 #include "imap-date.h" |
408
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
11 #include "imap-envelope.h" |
0 | 12 #include "index-storage.h" |
160
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
119
diff
changeset
|
13 #include "mail-index-util.h" |
327
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
14 #include "mail-modifylog.h" |
0 | 15 #include "mail-search.h" |
16 | |
17 #include <stdlib.h> | |
18 #include <ctype.h> | |
19 | |
20 #define ARG_SET_RESULT(arg, res) \ | |
21 STMT_START { \ | |
22 (arg)->result = !(arg)->not ? (res) : -(res); \ | |
23 } STMT_END | |
24 | |
25 typedef struct { | |
26 IndexMailbox *ibox; | |
27 MailIndexRecord *rec; | |
327
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
28 unsigned int client_seq; |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
29 } SearchIndexContext; |
0 | 30 |
31 typedef struct { | |
32 MailSearchArg *args; | |
33 int custom_header; | |
34 | |
35 const char *name, *value; | |
184 | 36 size_t name_len, value_len; |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
37 } SearchHeaderContext; |
0 | 38 |
39 typedef struct { | |
40 MailSearchArg *args; | |
41 const char *msg; | |
42 size_t size; | |
5
1b34ec11fff8
Message data is parsed in blocks (no longer entirely mmap()ed). Several
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
43 |
184 | 44 size_t max_searchword_len; |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
45 } SearchTextContext; |
0 | 46 |
47 static int msgset_contains(const char *set, unsigned int match_num, | |
48 unsigned int max_num) | |
49 { | |
50 unsigned int num, num2; | |
51 | |
52 while (*set != '\0') { | |
53 if (*set == '*') { | |
54 set++; | |
55 num = max_num; | |
56 } else { | |
57 num = 0; | |
58 while (*set >= '0' && *set <= '9') { | |
59 num = num*10 + (*set-'0'); | |
60 set++; | |
61 } | |
62 } | |
63 | |
64 if (*set == ',' || *set == '\0') { | |
65 if (num == match_num) | |
66 return TRUE; | |
67 if (*set == '\0') | |
68 return FALSE; | |
69 } else if (*set == ':') { | |
109
27fd7817b226
specifying messageset/uidset in SEARCH broke it
Timo Sirainen <tss@iki.fi>
parents:
66
diff
changeset
|
70 set++; |
27fd7817b226
specifying messageset/uidset in SEARCH broke it
Timo Sirainen <tss@iki.fi>
parents:
66
diff
changeset
|
71 |
0 | 72 if (*set == '*') { |
73 set++; | |
74 | |
75 if (match_num >= num && num <= max_num) | |
76 return TRUE; | |
77 } else { | |
78 num2 = 0; | |
79 while (*set >= '0' && *set <= '9') { | |
80 num2 = num2*10 + (*set-'0'); | |
81 set++; | |
82 } | |
83 | |
84 if (match_num >= num && match_num <= num2) | |
85 return TRUE; | |
86 } | |
87 | |
88 if (*set != ',') | |
89 return FALSE; | |
90 } | |
91 | |
92 set++; | |
93 } | |
94 | |
95 return FALSE; | |
96 } | |
97 | |
50
d493b9cc265e
Introduced uoff_t which is the unsigned-equilevant of off_t. This was needed
Timo Sirainen <tss@iki.fi>
parents:
46
diff
changeset
|
98 static uoff_t str_to_uoff_t(const char *str) |
46 | 99 { |
50
d493b9cc265e
Introduced uoff_t which is the unsigned-equilevant of off_t. This was needed
Timo Sirainen <tss@iki.fi>
parents:
46
diff
changeset
|
100 uoff_t num; |
46 | 101 |
102 num = 0; | |
103 while (*str != '\0') { | |
104 if (*str < '0' || *str > '9') | |
50
d493b9cc265e
Introduced uoff_t which is the unsigned-equilevant of off_t. This was needed
Timo Sirainen <tss@iki.fi>
parents:
46
diff
changeset
|
105 return 0; |
46 | 106 |
50
d493b9cc265e
Introduced uoff_t which is the unsigned-equilevant of off_t. This was needed
Timo Sirainen <tss@iki.fi>
parents:
46
diff
changeset
|
107 num = num*10 + (*str - '0'); |
46 | 108 } |
109 | |
110 return num; | |
111 } | |
112 | |
0 | 113 /* Returns >0 = matched, 0 = not matched, -1 = unknown */ |
114 static int search_arg_match_index(IndexMailbox *ibox, MailIndexRecord *rec, | |
327
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
115 unsigned int client_seq, |
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
116 MailSearchArgType type, const char *value) |
0 | 117 { |
118 time_t t; | |
441
4d77a27f7cd1
SEARCH SMALLER/LARGER - we may be able to handle the request using only
Timo Sirainen <tss@iki.fi>
parents:
410
diff
changeset
|
119 uoff_t size, user_size; |
0 | 120 |
121 switch (type) { | |
122 case SEARCH_ALL: | |
123 return TRUE; | |
124 case SEARCH_SET: | |
327
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
125 return msgset_contains(value, client_seq, |
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
126 ibox->synced_messages_count); |
0 | 127 case SEARCH_UID: |
128 return msgset_contains(value, rec->uid, | |
129 ibox->synced_messages_count); | |
130 | |
131 /* flags */ | |
132 case SEARCH_ANSWERED: | |
133 return rec->msg_flags & MAIL_ANSWERED; | |
134 case SEARCH_DELETED: | |
135 return rec->msg_flags & MAIL_DELETED; | |
136 case SEARCH_DRAFT: | |
137 return rec->msg_flags & MAIL_DRAFT; | |
138 case SEARCH_FLAGGED: | |
139 return rec->msg_flags & MAIL_FLAGGED; | |
140 case SEARCH_SEEN: | |
141 return rec->msg_flags & MAIL_SEEN; | |
142 case SEARCH_RECENT: | |
143 return rec->uid >= ibox->index->first_recent_uid; | |
144 case SEARCH_KEYWORD: | |
145 return FALSE; | |
146 | |
147 /* dates */ | |
148 case SEARCH_BEFORE: | |
119
2f67de235489
Whops, we were using RFC822 dates everywhere instead of IMAP dates.
Timo Sirainen <tss@iki.fi>
parents:
109
diff
changeset
|
149 if (!imap_parse_date(value, &t)) |
0 | 150 return FALSE; |
119
2f67de235489
Whops, we were using RFC822 dates everywhere instead of IMAP dates.
Timo Sirainen <tss@iki.fi>
parents:
109
diff
changeset
|
151 return rec->internal_date < t; |
0 | 152 case SEARCH_ON: |
119
2f67de235489
Whops, we were using RFC822 dates everywhere instead of IMAP dates.
Timo Sirainen <tss@iki.fi>
parents:
109
diff
changeset
|
153 if (!imap_parse_date(value, &t)) |
0 | 154 return FALSE; |
155 return rec->internal_date >= t && | |
156 rec->internal_date < t + 3600*24; | |
157 case SEARCH_SINCE: | |
119
2f67de235489
Whops, we were using RFC822 dates everywhere instead of IMAP dates.
Timo Sirainen <tss@iki.fi>
parents:
109
diff
changeset
|
158 if (!imap_parse_date(value, &t)) |
0 | 159 return FALSE; |
119
2f67de235489
Whops, we were using RFC822 dates everywhere instead of IMAP dates.
Timo Sirainen <tss@iki.fi>
parents:
109
diff
changeset
|
160 return rec->internal_date >= t; |
0 | 161 |
160
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
119
diff
changeset
|
162 /* sizes, only with fastscanning */ |
0 | 163 case SEARCH_SMALLER: |
441
4d77a27f7cd1
SEARCH SMALLER/LARGER - we may be able to handle the request using only
Timo Sirainen <tss@iki.fi>
parents:
410
diff
changeset
|
164 user_size = str_to_uoff_t(value); |
4d77a27f7cd1
SEARCH SMALLER/LARGER - we may be able to handle the request using only
Timo Sirainen <tss@iki.fi>
parents:
410
diff
changeset
|
165 if (mail_index_get_virtual_size(ibox->index, rec, TRUE, &size)) |
456
f557fb280fb4
If maildir files are unexpectedly deleted, don't treat it as error, and
Timo Sirainen <tss@iki.fi>
parents:
453
diff
changeset
|
166 return size > 0 && size < user_size; |
441
4d77a27f7cd1
SEARCH SMALLER/LARGER - we may be able to handle the request using only
Timo Sirainen <tss@iki.fi>
parents:
410
diff
changeset
|
167 |
4d77a27f7cd1
SEARCH SMALLER/LARGER - we may be able to handle the request using only
Timo Sirainen <tss@iki.fi>
parents:
410
diff
changeset
|
168 /* knowing physical size may be enough */ |
4d77a27f7cd1
SEARCH SMALLER/LARGER - we may be able to handle the request using only
Timo Sirainen <tss@iki.fi>
parents:
410
diff
changeset
|
169 if (rec->header_size + rec->body_size >= user_size) |
4d77a27f7cd1
SEARCH SMALLER/LARGER - we may be able to handle the request using only
Timo Sirainen <tss@iki.fi>
parents:
410
diff
changeset
|
170 return 0; |
4d77a27f7cd1
SEARCH SMALLER/LARGER - we may be able to handle the request using only
Timo Sirainen <tss@iki.fi>
parents:
410
diff
changeset
|
171 return -1; |
0 | 172 case SEARCH_LARGER: |
441
4d77a27f7cd1
SEARCH SMALLER/LARGER - we may be able to handle the request using only
Timo Sirainen <tss@iki.fi>
parents:
410
diff
changeset
|
173 user_size = str_to_uoff_t(value); |
4d77a27f7cd1
SEARCH SMALLER/LARGER - we may be able to handle the request using only
Timo Sirainen <tss@iki.fi>
parents:
410
diff
changeset
|
174 if (mail_index_get_virtual_size(ibox->index, rec, TRUE, &size)) |
4d77a27f7cd1
SEARCH SMALLER/LARGER - we may be able to handle the request using only
Timo Sirainen <tss@iki.fi>
parents:
410
diff
changeset
|
175 return size > user_size; |
0 | 176 |
441
4d77a27f7cd1
SEARCH SMALLER/LARGER - we may be able to handle the request using only
Timo Sirainen <tss@iki.fi>
parents:
410
diff
changeset
|
177 /* knowing physical size may be enough */ |
4d77a27f7cd1
SEARCH SMALLER/LARGER - we may be able to handle the request using only
Timo Sirainen <tss@iki.fi>
parents:
410
diff
changeset
|
178 if (rec->header_size + rec->body_size > user_size) |
4d77a27f7cd1
SEARCH SMALLER/LARGER - we may be able to handle the request using only
Timo Sirainen <tss@iki.fi>
parents:
410
diff
changeset
|
179 return 1; |
4d77a27f7cd1
SEARCH SMALLER/LARGER - we may be able to handle the request using only
Timo Sirainen <tss@iki.fi>
parents:
410
diff
changeset
|
180 return -1; |
0 | 181 default: |
182 return -1; | |
183 } | |
184 } | |
185 | |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
186 static void search_index_arg(MailSearchArg *arg, void *context) |
0 | 187 { |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
188 SearchIndexContext *ctx = context; |
0 | 189 |
327
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
190 switch (search_arg_match_index(ctx->ibox, ctx->rec, ctx->client_seq, |
0 | 191 arg->type, arg->value.str)) { |
192 case -1: | |
193 /* unknown */ | |
194 break; | |
195 case 0: | |
196 ARG_SET_RESULT(arg, -1); | |
197 break; | |
198 default: | |
199 ARG_SET_RESULT(arg, 1); | |
200 break; | |
201 } | |
202 } | |
203 | |
408
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
204 static int search_sent(MailSearchArgType type, const char *value, |
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
205 const char *sent_value) |
0 | 206 { |
408
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
207 time_t search_time, sent_time; |
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
208 int timezone_offset; |
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
209 |
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
210 if (!imap_parse_date(value, &search_time)) |
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
211 return 0; |
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
212 |
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
213 /* NOTE: RFC2060 doesn't specify if timezones should affect |
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
214 matching, so we ignore them. */ |
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
215 if (!rfc822_parse_date(sent_value, &sent_time, &timezone_offset)) |
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
216 return 0; |
0 | 217 |
408
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
218 switch (type) { |
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
219 case SEARCH_SENTBEFORE: |
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
220 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
|
221 case SEARCH_SENTON: |
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
222 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
|
223 sent_time < search_time + 3600*24; |
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
224 case SEARCH_SENTSINCE: |
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
225 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
|
226 default: |
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
227 i_assert(0); |
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
228 } |
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
229 } |
0 | 230 |
408
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
231 static int search_substr(const char *haystack, const char *needle) |
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
232 { |
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
233 size_t i, needle_len; |
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
234 |
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
235 /* note: needle is already uppercased */ |
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
236 needle_len = strlen(needle); |
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
237 for (i = 0; haystack[i] != '\0'; i++) { |
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
238 if (needle[0] == i_toupper(haystack[i]) && |
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
239 strncasecmp(needle, haystack+i, needle_len) == 0) |
0 | 240 return 1; |
241 } | |
242 | |
243 return 0; | |
244 } | |
245 | |
246 /* Returns >0 = matched, 0 = not matched, -1 = unknown */ | |
247 static int search_arg_match_cached(MailIndex *index, MailIndexRecord *rec, | |
248 MailSearchArgType type, const char *value) | |
249 { | |
408
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
250 ImapEnvelopeField env_field; |
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
251 const char *envelope, *field; |
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
252 int ret; |
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
253 |
0 | 254 switch (type) { |
408
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
255 case SEARCH_SENTBEFORE: |
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
256 case SEARCH_SENTON: |
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
257 case SEARCH_SENTSINCE: |
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
258 env_field = IMAP_ENVELOPE_DATE; |
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
259 break; |
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
260 |
0 | 261 case SEARCH_FROM: |
408
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
262 env_field = IMAP_ENVELOPE_FROM; |
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
263 break; |
0 | 264 case SEARCH_TO: |
408
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
265 env_field = IMAP_ENVELOPE_TO; |
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
266 break; |
0 | 267 case SEARCH_CC: |
408
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
268 env_field = IMAP_ENVELOPE_CC; |
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
269 break; |
0 | 270 case SEARCH_BCC: |
408
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
271 env_field = IMAP_ENVELOPE_BCC; |
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
272 break; |
0 | 273 case SEARCH_SUBJECT: |
408
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
274 env_field = IMAP_ENVELOPE_SUBJECT; |
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
275 break; |
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
276 |
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
277 case SEARCH_IN_REPLY_TO: |
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
278 env_field = IMAP_ENVELOPE_IN_REPLY_TO; |
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
279 break; |
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
280 case SEARCH_MESSAGE_ID: |
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
281 env_field = IMAP_ENVELOPE_MESSAGE_ID; |
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
282 break; |
0 | 283 default: |
284 return -1; | |
285 } | |
408
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
286 |
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
287 t_push(); |
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
288 |
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
289 /* get field from hopefully cached envelope */ |
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
290 envelope = index->lookup_field(index, rec, FIELD_TYPE_ENVELOPE); |
458
06377dd1e2a9
Added cache_fields_later() to MailIndex interface. That can be used to
Timo Sirainen <tss@iki.fi>
parents:
456
diff
changeset
|
291 if (envelope != NULL) |
06377dd1e2a9
Added cache_fields_later() to MailIndex interface. That can be used to
Timo Sirainen <tss@iki.fi>
parents:
456
diff
changeset
|
292 field = imap_envelope_parse(envelope, env_field); |
06377dd1e2a9
Added cache_fields_later() to MailIndex interface. That can be used to
Timo Sirainen <tss@iki.fi>
parents:
456
diff
changeset
|
293 else { |
461
00d857873975
cache_fields_later() doesn't need MailIndexRecord parameter.
Timo Sirainen <tss@iki.fi>
parents:
458
diff
changeset
|
294 index->cache_fields_later(index, FIELD_TYPE_ENVELOPE); |
458
06377dd1e2a9
Added cache_fields_later() to MailIndex interface. That can be used to
Timo Sirainen <tss@iki.fi>
parents:
456
diff
changeset
|
295 field = NULL; |
06377dd1e2a9
Added cache_fields_later() to MailIndex interface. That can be used to
Timo Sirainen <tss@iki.fi>
parents:
456
diff
changeset
|
296 } |
408
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
297 |
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
298 if (field == NULL) |
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
299 ret = -1; |
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
300 else { |
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
301 switch (type) { |
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
302 case SEARCH_SENTBEFORE: |
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
303 case SEARCH_SENTON: |
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
304 case SEARCH_SENTSINCE: |
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
305 ret = search_sent(type, value, field); |
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
306 default: |
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
307 ret = search_substr(field, value); |
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
308 } |
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
309 } |
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
310 t_pop(); |
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
311 return ret; |
0 | 312 } |
313 | |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
314 static void search_cached_arg(MailSearchArg *arg, void *context) |
0 | 315 { |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
316 SearchIndexContext *ctx = context; |
0 | 317 |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
318 switch (search_arg_match_cached(ctx->ibox->index, ctx->rec, |
0 | 319 arg->type, arg->value.str)) { |
320 case -1: | |
321 /* unknown */ | |
322 break; | |
323 case 0: | |
324 ARG_SET_RESULT(arg, -1); | |
325 break; | |
326 default: | |
327 ARG_SET_RESULT(arg, 1); | |
328 break; | |
329 } | |
330 } | |
331 | |
160
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
119
diff
changeset
|
332 /* Returns >0 = matched, 0 = not matched, -1 = unknown */ |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
119
diff
changeset
|
333 static int search_arg_match_slow(MailIndex *index, MailIndexRecord *rec, |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
119
diff
changeset
|
334 MailSearchArgType type, const char *value) |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
119
diff
changeset
|
335 { |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
119
diff
changeset
|
336 uoff_t size; |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
119
diff
changeset
|
337 |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
119
diff
changeset
|
338 switch (type) { |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
119
diff
changeset
|
339 /* sizes, only with fastscanning */ |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
119
diff
changeset
|
340 case SEARCH_SMALLER: |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
119
diff
changeset
|
341 if (!mail_index_get_virtual_size(index, rec, FALSE, &size)) |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
119
diff
changeset
|
342 return -1; |
456
f557fb280fb4
If maildir files are unexpectedly deleted, don't treat it as error, and
Timo Sirainen <tss@iki.fi>
parents:
453
diff
changeset
|
343 return size > 0 && size < str_to_uoff_t(value); |
160
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
119
diff
changeset
|
344 case SEARCH_LARGER: |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
119
diff
changeset
|
345 if (!mail_index_get_virtual_size(index, rec, FALSE, &size)) |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
119
diff
changeset
|
346 return -1; |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
119
diff
changeset
|
347 return size > str_to_uoff_t(value); |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
119
diff
changeset
|
348 |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
119
diff
changeset
|
349 default: |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
119
diff
changeset
|
350 return -1; |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
119
diff
changeset
|
351 } |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
119
diff
changeset
|
352 } |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
119
diff
changeset
|
353 |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
119
diff
changeset
|
354 static void search_slow_arg(MailSearchArg *arg, void *context) |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
119
diff
changeset
|
355 { |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
119
diff
changeset
|
356 SearchIndexContext *ctx = context; |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
119
diff
changeset
|
357 |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
119
diff
changeset
|
358 switch (search_arg_match_slow(ctx->ibox->index, ctx->rec, |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
119
diff
changeset
|
359 arg->type, arg->value.str)) { |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
119
diff
changeset
|
360 case -1: |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
119
diff
changeset
|
361 /* unknown */ |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
119
diff
changeset
|
362 break; |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
119
diff
changeset
|
363 case 0: |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
119
diff
changeset
|
364 ARG_SET_RESULT(arg, -1); |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
119
diff
changeset
|
365 break; |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
119
diff
changeset
|
366 default: |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
119
diff
changeset
|
367 ARG_SET_RESULT(arg, 1); |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
119
diff
changeset
|
368 break; |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
119
diff
changeset
|
369 } |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
119
diff
changeset
|
370 } |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
119
diff
changeset
|
371 |
0 | 372 /* needle must be uppercased */ |
184 | 373 static int header_value_match(const char *haystack, size_t haystack_len, |
0 | 374 const char *needle) |
375 { | |
376 const char *n; | |
184 | 377 size_t i, j, needle_len, max; |
0 | 378 |
379 if (*needle == '\0') | |
380 return TRUE; | |
381 | |
382 needle_len = strlen(needle); | |
383 if (haystack_len < needle_len) | |
384 return FALSE; | |
385 | |
386 max = haystack_len - needle_len; | |
387 for (i = 0; i <= max; i++) { | |
388 if (needle[0] != i_toupper(haystack[i])) | |
389 continue; | |
390 | |
391 for (j = i, n = needle; j < haystack_len; j++) { | |
392 if (haystack[j] == '\r') { | |
393 if (j+1 != haystack_len) | |
394 j++; | |
395 } | |
396 | |
397 if (haystack[j] == '\n' && j+1 < haystack_len && | |
398 IS_LWSP(haystack[j+1])) { | |
399 /* long header continuation */ | |
400 j++; | |
401 } | |
402 | |
403 if (*n++ != i_toupper(haystack[j])) | |
404 break; | |
405 | |
406 if (*n == '\0') | |
407 return 1; | |
408 } | |
409 } | |
410 | |
411 return -1; | |
412 } | |
413 | |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
414 static void search_header_arg(MailSearchArg *arg, void *context) |
0 | 415 { |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
416 SearchHeaderContext *ctx = context; |
0 | 417 const char *value; |
184 | 418 size_t len; |
0 | 419 int ret; |
420 | |
421 /* first check that the field name matches to argument. */ | |
422 switch (arg->type) { | |
408
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
423 case SEARCH_SENTBEFORE: |
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
424 case SEARCH_SENTON: |
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
425 case SEARCH_SENTSINCE: |
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
426 /* date is handled differently than others */ |
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
427 if (ctx->name_len == 4 && |
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
428 strncasecmp(ctx->name, "Date", 4) == 0) { |
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
429 search_sent(arg->type, arg->value.str, |
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
430 t_strndup(ctx->value, ctx->value_len)); |
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
431 } |
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
432 return; |
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
433 |
0 | 434 case SEARCH_FROM: |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
435 if (ctx->name_len != 4 || |
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
436 strncasecmp(ctx->name, "From", 4) != 0) |
0 | 437 return; |
438 value = arg->value.str; | |
439 break; | |
440 case SEARCH_TO: | |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
441 if (ctx->name_len != 2 || |
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
442 strncasecmp(ctx->name, "To", 2) != 0) |
0 | 443 return; |
444 value = arg->value.str; | |
445 break; | |
446 case SEARCH_CC: | |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
447 if (ctx->name_len != 2 || |
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
448 strncasecmp(ctx->name, "Cc", 2) != 0) |
0 | 449 return; |
450 value = arg->value.str; | |
451 break; | |
452 case SEARCH_BCC: | |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
453 if (ctx->name_len != 3 || |
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
454 strncasecmp(ctx->name, "Bcc", 3) != 0) |
0 | 455 return; |
456 value = arg->value.str; | |
457 break; | |
458 case SEARCH_SUBJECT: | |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
459 if (ctx->name_len != 7 || |
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
460 strncasecmp(ctx->name, "Subject", 7) != 0) |
0 | 461 return; |
462 value = arg->value.str; | |
463 break; | |
464 case SEARCH_HEADER: | |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
465 ctx->custom_header = TRUE; |
0 | 466 |
467 len = strlen(arg->value.str); | |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
468 if (ctx->name_len != len || |
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
469 strncasecmp(ctx->name, arg->value.str, len) != 0) |
0 | 470 return; |
471 | |
472 value = arg->hdr_value; | |
473 default: | |
474 return; | |
475 } | |
476 | |
477 /* then check if the value matches */ | |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
478 ret = header_value_match(ctx->value, ctx->value_len, value); |
0 | 479 ARG_SET_RESULT(arg, ret); |
480 } | |
481 | |
482 static void search_header(MessagePart *part __attr_unused__, | |
184 | 483 const char *name, size_t name_len, |
484 const char *value, size_t value_len, | |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
485 void *context) |
0 | 486 { |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
487 SearchHeaderContext *ctx = context; |
0 | 488 |
369
d037915978ca
message_parse_header() now calls the function with empty name/value at end
Timo Sirainen <tss@iki.fi>
parents:
364
diff
changeset
|
489 if ((name_len > 0 && ctx->custom_header) || |
408
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
490 (name_len == 4 && strncasecmp(name, "Date", 4) == 0) || |
0 | 491 (name_len == 4 && strncasecmp(name, "From", 4) == 0) || |
492 (name_len == 2 && strncasecmp(name, "To", 2) == 0) || | |
493 (name_len == 2 && strncasecmp(name, "Cc", 2) == 0) || | |
494 (name_len == 3 && strncasecmp(name, "Bcc", 3) == 0) || | |
495 (name_len == 7 && strncasecmp(name, "Subject", 7) == 0)) { | |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
496 ctx->name = name; |
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
497 ctx->value = value; |
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
498 ctx->name_len = name_len; |
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
499 ctx->value_len = value_len; |
0 | 500 |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
501 ctx->custom_header = FALSE; |
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
502 mail_search_args_foreach(ctx->args, search_header_arg, ctx); |
0 | 503 } |
504 } | |
505 | |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
506 static void search_text(MailSearchArg *arg, SearchTextContext *ctx) |
0 | 507 { |
508 const char *p; | |
184 | 509 size_t i, len, max; |
0 | 510 |
511 if (arg->result != 0) | |
512 return; | |
513 | |
514 len = strlen(arg->value.str); | |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
515 if (len > ctx->max_searchword_len) |
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
516 ctx->max_searchword_len = len; |
5
1b34ec11fff8
Message data is parsed in blocks (no longer entirely mmap()ed). Several
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
517 |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
518 if (ctx->size >= len) { |
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
519 max = ctx->size-len; |
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
520 for (i = 0, p = ctx->msg; i <= max; i++, p++) { |
5
1b34ec11fff8
Message data is parsed in blocks (no longer entirely mmap()ed). Several
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
521 if (i_toupper(*p) == arg->value.str[0] && |
1b34ec11fff8
Message data is parsed in blocks (no longer entirely mmap()ed). Several
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
522 strncasecmp(p, arg->value.str, len) == 0) { |
1b34ec11fff8
Message data is parsed in blocks (no longer entirely mmap()ed). Several
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
523 /* match */ |
1b34ec11fff8
Message data is parsed in blocks (no longer entirely mmap()ed). Several
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
524 ARG_SET_RESULT(arg, 1); |
1b34ec11fff8
Message data is parsed in blocks (no longer entirely mmap()ed). Several
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
525 return; |
1b34ec11fff8
Message data is parsed in blocks (no longer entirely mmap()ed). Several
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
526 } |
0 | 527 } |
528 } | |
529 } | |
530 | |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
531 static void search_text_header(MailSearchArg *arg, void *context) |
0 | 532 { |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
533 SearchTextContext *ctx = context; |
0 | 534 |
535 if (arg->type == SEARCH_TEXT) | |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
536 search_text(arg, ctx); |
0 | 537 } |
538 | |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
539 static void search_text_body(MailSearchArg *arg, void *context) |
0 | 540 { |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
541 SearchTextContext *ctx = context; |
0 | 542 |
543 if (arg->type == SEARCH_TEXT || arg->type == SEARCH_BODY) | |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
544 search_text(arg, ctx); |
0 | 545 } |
546 | |
410
1f0e7229ee58
Split IOBuffer into mmaped IBuffer, file IBuffer, memory data IBuffer and
Timo Sirainen <tss@iki.fi>
parents:
408
diff
changeset
|
547 static void search_arg_match_data(IBuffer *inbuf, uoff_t max_size, |
5
1b34ec11fff8
Message data is parsed in blocks (no longer entirely mmap()ed). Several
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
548 MailSearchArg *args, |
1b34ec11fff8
Message data is parsed in blocks (no longer entirely mmap()ed). Several
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
549 MailSearchForeachFunc search_func) |
1b34ec11fff8
Message data is parsed in blocks (no longer entirely mmap()ed). Several
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
550 { |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
551 SearchTextContext ctx; |
410
1f0e7229ee58
Split IOBuffer into mmaped IBuffer, file IBuffer, memory data IBuffer and
Timo Sirainen <tss@iki.fi>
parents:
408
diff
changeset
|
552 const unsigned char *data; |
290
3dcc2275b4ca
IOBuffer cleanup, hopefully fixes some mbox problems.
Timo Sirainen <tss@iki.fi>
parents:
223
diff
changeset
|
553 size_t size, max_searchword_len; |
5
1b34ec11fff8
Message data is parsed in blocks (no longer entirely mmap()ed). Several
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
554 |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
555 memset(&ctx, 0, sizeof(ctx)); |
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
556 ctx.args = args; |
5
1b34ec11fff8
Message data is parsed in blocks (no longer entirely mmap()ed). Several
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
557 |
290
3dcc2275b4ca
IOBuffer cleanup, hopefully fixes some mbox problems.
Timo Sirainen <tss@iki.fi>
parents:
223
diff
changeset
|
558 /* first get the max. search keyword length */ |
3dcc2275b4ca
IOBuffer cleanup, hopefully fixes some mbox problems.
Timo Sirainen <tss@iki.fi>
parents:
223
diff
changeset
|
559 mail_search_args_foreach(args, search_func, &ctx); |
3dcc2275b4ca
IOBuffer cleanup, hopefully fixes some mbox problems.
Timo Sirainen <tss@iki.fi>
parents:
223
diff
changeset
|
560 max_searchword_len = ctx.max_searchword_len; |
3dcc2275b4ca
IOBuffer cleanup, hopefully fixes some mbox problems.
Timo Sirainen <tss@iki.fi>
parents:
223
diff
changeset
|
561 |
410
1f0e7229ee58
Split IOBuffer into mmaped IBuffer, file IBuffer, memory data IBuffer and
Timo Sirainen <tss@iki.fi>
parents:
408
diff
changeset
|
562 i_buffer_set_read_limit(inbuf, inbuf->v_offset + max_size); |
290
3dcc2275b4ca
IOBuffer cleanup, hopefully fixes some mbox problems.
Timo Sirainen <tss@iki.fi>
parents:
223
diff
changeset
|
563 |
5
1b34ec11fff8
Message data is parsed in blocks (no longer entirely mmap()ed). Several
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
564 /* do this in blocks: read data, compare it for all search words, skip |
1b34ec11fff8
Message data is parsed in blocks (no longer entirely mmap()ed). Several
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
565 for block size - (strlen(largest_searchword)-1) and continue. */ |
410
1f0e7229ee58
Split IOBuffer into mmaped IBuffer, file IBuffer, memory data IBuffer and
Timo Sirainen <tss@iki.fi>
parents:
408
diff
changeset
|
566 while (i_buffer_read_data(inbuf, &data, &size, |
1f0e7229ee58
Split IOBuffer into mmaped IBuffer, file IBuffer, memory data IBuffer and
Timo Sirainen <tss@iki.fi>
parents:
408
diff
changeset
|
567 max_searchword_len-1) > 0) { |
505
78ae6262d6ca
More (char *) -> (const char *) fixes
Timo Sirainen <tss@iki.fi>
parents:
461
diff
changeset
|
568 ctx.msg = (const char *) data; |
290
3dcc2275b4ca
IOBuffer cleanup, hopefully fixes some mbox problems.
Timo Sirainen <tss@iki.fi>
parents:
223
diff
changeset
|
569 ctx.size = size; |
3dcc2275b4ca
IOBuffer cleanup, hopefully fixes some mbox problems.
Timo Sirainen <tss@iki.fi>
parents:
223
diff
changeset
|
570 mail_search_args_foreach(args, search_func, &ctx); |
410
1f0e7229ee58
Split IOBuffer into mmaped IBuffer, file IBuffer, memory data IBuffer and
Timo Sirainen <tss@iki.fi>
parents:
408
diff
changeset
|
571 i_buffer_skip(inbuf, size - (max_searchword_len-1)); |
290
3dcc2275b4ca
IOBuffer cleanup, hopefully fixes some mbox problems.
Timo Sirainen <tss@iki.fi>
parents:
223
diff
changeset
|
572 } |
5
1b34ec11fff8
Message data is parsed in blocks (no longer entirely mmap()ed). Several
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
573 |
290
3dcc2275b4ca
IOBuffer cleanup, hopefully fixes some mbox problems.
Timo Sirainen <tss@iki.fi>
parents:
223
diff
changeset
|
574 if (size > 0) { |
3dcc2275b4ca
IOBuffer cleanup, hopefully fixes some mbox problems.
Timo Sirainen <tss@iki.fi>
parents:
223
diff
changeset
|
575 /* last block */ |
410
1f0e7229ee58
Split IOBuffer into mmaped IBuffer, file IBuffer, memory data IBuffer and
Timo Sirainen <tss@iki.fi>
parents:
408
diff
changeset
|
576 ctx.msg = (const char *) data; |
290
3dcc2275b4ca
IOBuffer cleanup, hopefully fixes some mbox problems.
Timo Sirainen <tss@iki.fi>
parents:
223
diff
changeset
|
577 ctx.size = size; |
3dcc2275b4ca
IOBuffer cleanup, hopefully fixes some mbox problems.
Timo Sirainen <tss@iki.fi>
parents:
223
diff
changeset
|
578 mail_search_args_foreach(args, search_func, &ctx); |
410
1f0e7229ee58
Split IOBuffer into mmaped IBuffer, file IBuffer, memory data IBuffer and
Timo Sirainen <tss@iki.fi>
parents:
408
diff
changeset
|
579 i_buffer_skip(inbuf, size); |
290
3dcc2275b4ca
IOBuffer cleanup, hopefully fixes some mbox problems.
Timo Sirainen <tss@iki.fi>
parents:
223
diff
changeset
|
580 } |
5
1b34ec11fff8
Message data is parsed in blocks (no longer entirely mmap()ed). Several
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
581 |
410
1f0e7229ee58
Split IOBuffer into mmaped IBuffer, file IBuffer, memory data IBuffer and
Timo Sirainen <tss@iki.fi>
parents:
408
diff
changeset
|
582 i_buffer_set_read_limit(inbuf, 0); |
5
1b34ec11fff8
Message data is parsed in blocks (no longer entirely mmap()ed). Several
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
583 } |
1b34ec11fff8
Message data is parsed in blocks (no longer entirely mmap()ed). Several
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
584 |
0 | 585 static int search_arg_match_text(IndexMailbox *ibox, MailIndexRecord *rec, |
586 MailSearchArg *args) | |
587 { | |
410
1f0e7229ee58
Split IOBuffer into mmaped IBuffer, file IBuffer, memory data IBuffer and
Timo Sirainen <tss@iki.fi>
parents:
408
diff
changeset
|
588 IBuffer *inbuf; |
408
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
589 MessageSize hdr_size; |
456
f557fb280fb4
If maildir files are unexpectedly deleted, don't treat it as error, and
Timo Sirainen <tss@iki.fi>
parents:
453
diff
changeset
|
590 int have_headers, have_body, have_text, deleted; |
0 | 591 |
592 /* first check what we need to use */ | |
593 mail_search_args_analyze(args, &have_headers, &have_body, &have_text); | |
594 if (!have_headers && !have_body && !have_text) | |
595 return TRUE; | |
596 | |
456
f557fb280fb4
If maildir files are unexpectedly deleted, don't treat it as error, and
Timo Sirainen <tss@iki.fi>
parents:
453
diff
changeset
|
597 inbuf = ibox->index->open_mail(ibox->index, rec, &deleted); |
5
1b34ec11fff8
Message data is parsed in blocks (no longer entirely mmap()ed). Several
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
598 if (inbuf == NULL) |
0 | 599 return FALSE; |
600 | |
5
1b34ec11fff8
Message data is parsed in blocks (no longer entirely mmap()ed). Several
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
601 if (have_headers) { |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
602 SearchHeaderContext ctx; |
5
1b34ec11fff8
Message data is parsed in blocks (no longer entirely mmap()ed). Several
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
603 |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
604 memset(&ctx, 0, sizeof(ctx)); |
0 | 605 |
5
1b34ec11fff8
Message data is parsed in blocks (no longer entirely mmap()ed). Several
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
606 /* header checks */ |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
607 ctx.custom_header = TRUE; |
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
608 ctx.args = args; |
408
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
609 message_parse_header(NULL, inbuf, &hdr_size, |
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
610 search_header, &ctx); |
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
611 |
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
612 i_assert(rec->header_size == 0 || |
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
613 hdr_size.physical_size == rec->header_size); |
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
614 } else if (rec->header_size == 0) { |
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
615 message_get_header_size(inbuf, &hdr_size); |
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
616 } else { |
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
617 hdr_size.physical_size = rec->header_size; |
5
1b34ec11fff8
Message data is parsed in blocks (no longer entirely mmap()ed). Several
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
618 } |
0 | 619 |
5
1b34ec11fff8
Message data is parsed in blocks (no longer entirely mmap()ed). Several
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
620 if (have_text) { |
410
1f0e7229ee58
Split IOBuffer into mmaped IBuffer, file IBuffer, memory data IBuffer and
Timo Sirainen <tss@iki.fi>
parents:
408
diff
changeset
|
621 if (inbuf->v_offset != 0) { |
5
1b34ec11fff8
Message data is parsed in blocks (no longer entirely mmap()ed). Several
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
622 /* need to rewind back to beginning of headers */ |
410
1f0e7229ee58
Split IOBuffer into mmaped IBuffer, file IBuffer, memory data IBuffer and
Timo Sirainen <tss@iki.fi>
parents:
408
diff
changeset
|
623 if (!i_buffer_seek(inbuf, 0)) { |
1f0e7229ee58
Split IOBuffer into mmaped IBuffer, file IBuffer, memory data IBuffer and
Timo Sirainen <tss@iki.fi>
parents:
408
diff
changeset
|
624 errno = inbuf->buf_errno; |
1f0e7229ee58
Split IOBuffer into mmaped IBuffer, file IBuffer, memory data IBuffer and
Timo Sirainen <tss@iki.fi>
parents:
408
diff
changeset
|
625 i_error("i_buffer_seek() failed: %m"); |
5
1b34ec11fff8
Message data is parsed in blocks (no longer entirely mmap()ed). Several
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
626 return FALSE; |
1b34ec11fff8
Message data is parsed in blocks (no longer entirely mmap()ed). Several
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
627 } |
0 | 628 } |
629 | |
408
e057845d94ca
Dropped sent_time and alignment from MailIndexRecord. SEARCH can now use
Timo Sirainen <tss@iki.fi>
parents:
369
diff
changeset
|
630 search_arg_match_data(inbuf, 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
|
631 args, search_text_header); |
1b34ec11fff8
Message data is parsed in blocks (no longer entirely mmap()ed). Several
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
632 } |
0 | 633 |
5
1b34ec11fff8
Message data is parsed in blocks (no longer entirely mmap()ed). Several
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
634 if (have_text || have_body) { |
410
1f0e7229ee58
Split IOBuffer into mmaped IBuffer, file IBuffer, memory data IBuffer and
Timo Sirainen <tss@iki.fi>
parents:
408
diff
changeset
|
635 if (inbuf->v_offset == 0) { |
5
1b34ec11fff8
Message data is parsed in blocks (no longer entirely mmap()ed). Several
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
636 /* skip over headers */ |
410
1f0e7229ee58
Split IOBuffer into mmaped IBuffer, file IBuffer, memory data IBuffer and
Timo Sirainen <tss@iki.fi>
parents:
408
diff
changeset
|
637 i_buffer_skip(inbuf, hdr_size.physical_size); |
0 | 638 } |
639 | |
211
9ee27ef24ab8
crashfix for searching from message body
Timo Sirainen <tss@iki.fi>
parents:
184
diff
changeset
|
640 search_arg_match_data(inbuf, rec->body_size, args, |
9ee27ef24ab8
crashfix for searching from message body
Timo Sirainen <tss@iki.fi>
parents:
184
diff
changeset
|
641 search_text_body); |
0 | 642 } |
643 | |
410
1f0e7229ee58
Split IOBuffer into mmaped IBuffer, file IBuffer, memory data IBuffer and
Timo Sirainen <tss@iki.fi>
parents:
408
diff
changeset
|
644 i_buffer_unref(inbuf); |
5
1b34ec11fff8
Message data is parsed in blocks (no longer entirely mmap()ed). Several
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
645 return TRUE; |
0 | 646 } |
647 | |
648 static void seq_update(const char *set, unsigned int *first_seq, | |
649 unsigned int *last_seq, unsigned int max_value) | |
650 { | |
651 unsigned int seq; | |
652 | |
653 while (*set != '\0') { | |
654 if (*set == '*') { | |
655 seq = max_value; | |
656 set++; | |
657 } else { | |
658 seq = 0; | |
659 while (*set >= '0' && *set <= '9') { | |
660 seq = seq*10 + (*set-'0'); | |
661 set++; | |
662 } | |
663 } | |
664 | |
665 if (seq != 0) { | |
666 if (*first_seq == 0 || seq < *first_seq) | |
667 *first_seq = seq; | |
668 if (*last_seq == 0 || seq > *last_seq) | |
669 *last_seq = seq; | |
670 } | |
671 | |
46 | 672 set++; |
0 | 673 } |
674 } | |
675 | |
676 static void search_get_sequid(IndexMailbox *ibox, MailSearchArg *args, | |
677 unsigned int *first_seq, unsigned int *last_seq, | |
678 unsigned int *first_uid, unsigned int *last_uid) | |
679 { | |
680 for (; args != NULL; args = args->next) { | |
681 if (args->type == SEARCH_OR || args->type == SEARCH_SUB) { | |
682 search_get_sequid(ibox, args->value.subargs, | |
683 first_seq, last_seq, | |
684 first_uid, last_uid); | |
685 } if (args->type == SEARCH_SET) { | |
686 seq_update(args->value.str, first_seq, last_seq, | |
687 ibox->synced_messages_count); | |
688 } else if (args->type == SEARCH_UID) { | |
689 seq_update(args->value.str, first_uid, last_uid, | |
690 ibox->index->header->next_uid-1); | |
691 } else if (args->type == SEARCH_ALL) { | |
692 /* go through everything */ | |
693 *first_seq = 1; | |
694 *last_seq = ibox->synced_messages_count; | |
695 return; | |
696 } | |
697 } | |
698 } | |
699 | |
442
2a25bf21557b
SEARCH SEEN, UNSEEN, DELETED, UNDELETED, RECENT, UNRECENT optimizations.
Timo Sirainen <tss@iki.fi>
parents:
441
diff
changeset
|
700 static int search_limit_by_flags(IndexMailbox *ibox, MailSearchArg *args, |
2a25bf21557b
SEARCH SEEN, UNSEEN, DELETED, UNDELETED, RECENT, UNRECENT optimizations.
Timo Sirainen <tss@iki.fi>
parents:
441
diff
changeset
|
701 unsigned int *first_uid, |
2a25bf21557b
SEARCH SEEN, UNSEEN, DELETED, UNDELETED, RECENT, UNRECENT optimizations.
Timo Sirainen <tss@iki.fi>
parents:
441
diff
changeset
|
702 unsigned int *last_uid) |
2a25bf21557b
SEARCH SEEN, UNSEEN, DELETED, UNDELETED, RECENT, UNRECENT optimizations.
Timo Sirainen <tss@iki.fi>
parents:
441
diff
changeset
|
703 { |
2a25bf21557b
SEARCH SEEN, UNSEEN, DELETED, UNDELETED, RECENT, UNRECENT optimizations.
Timo Sirainen <tss@iki.fi>
parents:
441
diff
changeset
|
704 MailIndexHeader *hdr; |
2a25bf21557b
SEARCH SEEN, UNSEEN, DELETED, UNDELETED, RECENT, UNRECENT optimizations.
Timo Sirainen <tss@iki.fi>
parents:
441
diff
changeset
|
705 unsigned int uid; |
2a25bf21557b
SEARCH SEEN, UNSEEN, DELETED, UNDELETED, RECENT, UNRECENT optimizations.
Timo Sirainen <tss@iki.fi>
parents:
441
diff
changeset
|
706 |
2a25bf21557b
SEARCH SEEN, UNSEEN, DELETED, UNDELETED, RECENT, UNRECENT optimizations.
Timo Sirainen <tss@iki.fi>
parents:
441
diff
changeset
|
707 hdr = ibox->index->header; |
2a25bf21557b
SEARCH SEEN, UNSEEN, DELETED, UNDELETED, RECENT, UNRECENT optimizations.
Timo Sirainen <tss@iki.fi>
parents:
441
diff
changeset
|
708 for (; args != NULL; args = args->next) { |
2a25bf21557b
SEARCH SEEN, UNSEEN, DELETED, UNDELETED, RECENT, UNRECENT optimizations.
Timo Sirainen <tss@iki.fi>
parents:
441
diff
changeset
|
709 if (args->type == SEARCH_SEEN) { |
2a25bf21557b
SEARCH SEEN, UNSEEN, DELETED, UNDELETED, RECENT, UNRECENT optimizations.
Timo Sirainen <tss@iki.fi>
parents:
441
diff
changeset
|
710 /* SEEN with 0 seen? */ |
2a25bf21557b
SEARCH SEEN, UNSEEN, DELETED, UNDELETED, RECENT, UNRECENT optimizations.
Timo Sirainen <tss@iki.fi>
parents:
441
diff
changeset
|
711 if (!args->not && hdr->seen_messages_count == 0) |
2a25bf21557b
SEARCH SEEN, UNSEEN, DELETED, UNDELETED, RECENT, UNRECENT optimizations.
Timo Sirainen <tss@iki.fi>
parents:
441
diff
changeset
|
712 return FALSE; |
2a25bf21557b
SEARCH SEEN, UNSEEN, DELETED, UNDELETED, RECENT, UNRECENT optimizations.
Timo Sirainen <tss@iki.fi>
parents:
441
diff
changeset
|
713 |
2a25bf21557b
SEARCH SEEN, UNSEEN, DELETED, UNDELETED, RECENT, UNRECENT optimizations.
Timo Sirainen <tss@iki.fi>
parents:
441
diff
changeset
|
714 /* UNSEEN with all seen? */ |
2a25bf21557b
SEARCH SEEN, UNSEEN, DELETED, UNDELETED, RECENT, UNRECENT optimizations.
Timo Sirainen <tss@iki.fi>
parents:
441
diff
changeset
|
715 if (args->not && |
2a25bf21557b
SEARCH SEEN, UNSEEN, DELETED, UNDELETED, RECENT, UNRECENT optimizations.
Timo Sirainen <tss@iki.fi>
parents:
441
diff
changeset
|
716 hdr->seen_messages_count == hdr->messages_count) |
2a25bf21557b
SEARCH SEEN, UNSEEN, DELETED, UNDELETED, RECENT, UNRECENT optimizations.
Timo Sirainen <tss@iki.fi>
parents:
441
diff
changeset
|
717 return FALSE; |
2a25bf21557b
SEARCH SEEN, UNSEEN, DELETED, UNDELETED, RECENT, UNRECENT optimizations.
Timo Sirainen <tss@iki.fi>
parents:
441
diff
changeset
|
718 |
2a25bf21557b
SEARCH SEEN, UNSEEN, DELETED, UNDELETED, RECENT, UNRECENT optimizations.
Timo Sirainen <tss@iki.fi>
parents:
441
diff
changeset
|
719 /* UNSEEN with lowwater limiting */ |
2a25bf21557b
SEARCH SEEN, UNSEEN, DELETED, UNDELETED, RECENT, UNRECENT optimizations.
Timo Sirainen <tss@iki.fi>
parents:
441
diff
changeset
|
720 uid = hdr->first_unseen_uid_lowwater; |
2a25bf21557b
SEARCH SEEN, UNSEEN, DELETED, UNDELETED, RECENT, UNRECENT optimizations.
Timo Sirainen <tss@iki.fi>
parents:
441
diff
changeset
|
721 if (args->not && *first_uid < uid) |
2a25bf21557b
SEARCH SEEN, UNSEEN, DELETED, UNDELETED, RECENT, UNRECENT optimizations.
Timo Sirainen <tss@iki.fi>
parents:
441
diff
changeset
|
722 *first_uid = uid; |
2a25bf21557b
SEARCH SEEN, UNSEEN, DELETED, UNDELETED, RECENT, UNRECENT optimizations.
Timo Sirainen <tss@iki.fi>
parents:
441
diff
changeset
|
723 } |
2a25bf21557b
SEARCH SEEN, UNSEEN, DELETED, UNDELETED, RECENT, UNRECENT optimizations.
Timo Sirainen <tss@iki.fi>
parents:
441
diff
changeset
|
724 |
2a25bf21557b
SEARCH SEEN, UNSEEN, DELETED, UNDELETED, RECENT, UNRECENT optimizations.
Timo Sirainen <tss@iki.fi>
parents:
441
diff
changeset
|
725 if (args->type == SEARCH_DELETED) { |
2a25bf21557b
SEARCH SEEN, UNSEEN, DELETED, UNDELETED, RECENT, UNRECENT optimizations.
Timo Sirainen <tss@iki.fi>
parents:
441
diff
changeset
|
726 /* DELETED with 0 deleted? */ |
2a25bf21557b
SEARCH SEEN, UNSEEN, DELETED, UNDELETED, RECENT, UNRECENT optimizations.
Timo Sirainen <tss@iki.fi>
parents:
441
diff
changeset
|
727 if (!args->not && hdr->deleted_messages_count == 0) |
2a25bf21557b
SEARCH SEEN, UNSEEN, DELETED, UNDELETED, RECENT, UNRECENT optimizations.
Timo Sirainen <tss@iki.fi>
parents:
441
diff
changeset
|
728 return FALSE; |
2a25bf21557b
SEARCH SEEN, UNSEEN, DELETED, UNDELETED, RECENT, UNRECENT optimizations.
Timo Sirainen <tss@iki.fi>
parents:
441
diff
changeset
|
729 |
2a25bf21557b
SEARCH SEEN, UNSEEN, DELETED, UNDELETED, RECENT, UNRECENT optimizations.
Timo Sirainen <tss@iki.fi>
parents:
441
diff
changeset
|
730 /* UNDELETED with all deleted? */ |
2a25bf21557b
SEARCH SEEN, UNSEEN, DELETED, UNDELETED, RECENT, UNRECENT optimizations.
Timo Sirainen <tss@iki.fi>
parents:
441
diff
changeset
|
731 if (!args->not && |
2a25bf21557b
SEARCH SEEN, UNSEEN, DELETED, UNDELETED, RECENT, UNRECENT optimizations.
Timo Sirainen <tss@iki.fi>
parents:
441
diff
changeset
|
732 hdr->deleted_messages_count == hdr->messages_count) |
2a25bf21557b
SEARCH SEEN, UNSEEN, DELETED, UNDELETED, RECENT, UNRECENT optimizations.
Timo Sirainen <tss@iki.fi>
parents:
441
diff
changeset
|
733 return FALSE; |
2a25bf21557b
SEARCH SEEN, UNSEEN, DELETED, UNDELETED, RECENT, UNRECENT optimizations.
Timo Sirainen <tss@iki.fi>
parents:
441
diff
changeset
|
734 |
2a25bf21557b
SEARCH SEEN, UNSEEN, DELETED, UNDELETED, RECENT, UNRECENT optimizations.
Timo Sirainen <tss@iki.fi>
parents:
441
diff
changeset
|
735 /* DELETED with lowwater limiting */ |
2a25bf21557b
SEARCH SEEN, UNSEEN, DELETED, UNDELETED, RECENT, UNRECENT optimizations.
Timo Sirainen <tss@iki.fi>
parents:
441
diff
changeset
|
736 uid = hdr->first_deleted_uid_lowwater; |
2a25bf21557b
SEARCH SEEN, UNSEEN, DELETED, UNDELETED, RECENT, UNRECENT optimizations.
Timo Sirainen <tss@iki.fi>
parents:
441
diff
changeset
|
737 if (!args->not && *first_uid < uid) |
2a25bf21557b
SEARCH SEEN, UNSEEN, DELETED, UNDELETED, RECENT, UNRECENT optimizations.
Timo Sirainen <tss@iki.fi>
parents:
441
diff
changeset
|
738 *first_uid = uid; |
2a25bf21557b
SEARCH SEEN, UNSEEN, DELETED, UNDELETED, RECENT, UNRECENT optimizations.
Timo Sirainen <tss@iki.fi>
parents:
441
diff
changeset
|
739 } |
2a25bf21557b
SEARCH SEEN, UNSEEN, DELETED, UNDELETED, RECENT, UNRECENT optimizations.
Timo Sirainen <tss@iki.fi>
parents:
441
diff
changeset
|
740 |
2a25bf21557b
SEARCH SEEN, UNSEEN, DELETED, UNDELETED, RECENT, UNRECENT optimizations.
Timo Sirainen <tss@iki.fi>
parents:
441
diff
changeset
|
741 if (args->type == SEARCH_RECENT) { |
2a25bf21557b
SEARCH SEEN, UNSEEN, DELETED, UNDELETED, RECENT, UNRECENT optimizations.
Timo Sirainen <tss@iki.fi>
parents:
441
diff
changeset
|
742 uid = ibox->index->first_recent_uid; |
2a25bf21557b
SEARCH SEEN, UNSEEN, DELETED, UNDELETED, RECENT, UNRECENT optimizations.
Timo Sirainen <tss@iki.fi>
parents:
441
diff
changeset
|
743 if (!args->not && *first_uid < uid) |
2a25bf21557b
SEARCH SEEN, UNSEEN, DELETED, UNDELETED, RECENT, UNRECENT optimizations.
Timo Sirainen <tss@iki.fi>
parents:
441
diff
changeset
|
744 *first_uid = ibox->index->first_recent_uid; |
2a25bf21557b
SEARCH SEEN, UNSEEN, DELETED, UNDELETED, RECENT, UNRECENT optimizations.
Timo Sirainen <tss@iki.fi>
parents:
441
diff
changeset
|
745 else if (args->not && *last_uid >= uid) |
2a25bf21557b
SEARCH SEEN, UNSEEN, DELETED, UNDELETED, RECENT, UNRECENT optimizations.
Timo Sirainen <tss@iki.fi>
parents:
441
diff
changeset
|
746 *last_uid = uid-1; |
2a25bf21557b
SEARCH SEEN, UNSEEN, DELETED, UNDELETED, RECENT, UNRECENT optimizations.
Timo Sirainen <tss@iki.fi>
parents:
441
diff
changeset
|
747 } |
2a25bf21557b
SEARCH SEEN, UNSEEN, DELETED, UNDELETED, RECENT, UNRECENT optimizations.
Timo Sirainen <tss@iki.fi>
parents:
441
diff
changeset
|
748 } |
2a25bf21557b
SEARCH SEEN, UNSEEN, DELETED, UNDELETED, RECENT, UNRECENT optimizations.
Timo Sirainen <tss@iki.fi>
parents:
441
diff
changeset
|
749 |
2a25bf21557b
SEARCH SEEN, UNSEEN, DELETED, UNDELETED, RECENT, UNRECENT optimizations.
Timo Sirainen <tss@iki.fi>
parents:
441
diff
changeset
|
750 return *first_uid <= *last_uid; |
2a25bf21557b
SEARCH SEEN, UNSEEN, DELETED, UNDELETED, RECENT, UNRECENT optimizations.
Timo Sirainen <tss@iki.fi>
parents:
441
diff
changeset
|
751 } |
2a25bf21557b
SEARCH SEEN, UNSEEN, DELETED, UNDELETED, RECENT, UNRECENT optimizations.
Timo Sirainen <tss@iki.fi>
parents:
441
diff
changeset
|
752 |
327
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
753 static unsigned int client_seq_to_uid(MailIndex *index, unsigned int seq) |
0 | 754 { |
755 MailIndexRecord *rec; | |
327
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
756 unsigned int expunges_before; |
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
757 |
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
758 (void)mail_modifylog_seq_get_expunges(index->modifylog, seq, seq, |
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
759 &expunges_before); |
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
760 seq -= expunges_before; |
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
761 |
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
762 rec = index->lookup(index, seq); |
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
763 return rec == NULL ? 0 : rec->uid; |
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
764 } |
0 | 765 |
327
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
766 static int search_get_uid_range(IndexMailbox *ibox, MailSearchArg *args, |
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
767 unsigned int *first_uid, |
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
768 unsigned int *last_uid) |
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
769 { |
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
770 unsigned int first_seq, last_seq, uid; |
0 | 771 |
327
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
772 *first_uid = *last_uid = 0; |
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
773 first_seq = last_seq = 0; |
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
774 |
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
775 search_get_sequid(ibox, args, &first_seq, &last_seq, |
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
776 first_uid, last_uid); |
0 | 777 |
51 | 778 /* seq_update() should make sure that these can't happen */ |
327
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
779 i_assert(first_seq <= last_seq); |
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
780 i_assert(*first_uid <= *last_uid); |
51 | 781 |
327
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
782 if (first_seq > 1) { |
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
783 uid = client_seq_to_uid(ibox->index, first_seq); |
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
784 if (uid == 0) |
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
785 return FALSE; |
0 | 786 |
327
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
787 if (*first_uid == 0 || uid < *first_uid) |
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
788 *first_uid = uid; |
0 | 789 } |
790 | |
327
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
791 if (last_seq > 1 && last_seq != ibox->synced_messages_count) { |
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
792 uid = client_seq_to_uid(ibox->index, last_seq); |
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
793 if (uid == 0) |
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
794 return FALSE; |
51 | 795 |
327
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
796 if (uid > *last_uid) |
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
797 *last_uid = uid; |
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
798 } |
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
799 |
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
800 if (*first_uid == 0) |
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
801 *first_uid = 1; |
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
802 if (*last_uid == 0) |
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
803 *last_uid = ibox->index->header->next_uid-1; |
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
804 |
442
2a25bf21557b
SEARCH SEEN, UNSEEN, DELETED, UNDELETED, RECENT, UNRECENT optimizations.
Timo Sirainen <tss@iki.fi>
parents:
441
diff
changeset
|
805 /* UNSEEN and DELETED in root search level may limit the range */ |
2a25bf21557b
SEARCH SEEN, UNSEEN, DELETED, UNDELETED, RECENT, UNRECENT optimizations.
Timo Sirainen <tss@iki.fi>
parents:
441
diff
changeset
|
806 if (!search_limit_by_flags(ibox, args, first_uid, last_uid)) |
2a25bf21557b
SEARCH SEEN, UNSEEN, DELETED, UNDELETED, RECENT, UNRECENT optimizations.
Timo Sirainen <tss@iki.fi>
parents:
441
diff
changeset
|
807 return FALSE; |
2a25bf21557b
SEARCH SEEN, UNSEEN, DELETED, UNDELETED, RECENT, UNRECENT optimizations.
Timo Sirainen <tss@iki.fi>
parents:
441
diff
changeset
|
808 |
327
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
809 i_assert(*first_uid <= *last_uid); |
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
810 return TRUE; |
0 | 811 } |
812 | |
327
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
813 static int search_messages(IndexMailbox *ibox, MailSearchArg *args, |
410
1f0e7229ee58
Split IOBuffer into mmaped IBuffer, file IBuffer, memory data IBuffer and
Timo Sirainen <tss@iki.fi>
parents:
408
diff
changeset
|
814 OBuffer *outbuf, int uid_result) |
0 | 815 { |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
816 SearchIndexContext ctx; |
0 | 817 MailIndexRecord *rec; |
317
79d9a40fbb72
Only first search condition was checked.
Timo Sirainen <tss@iki.fi>
parents:
290
diff
changeset
|
818 MailSearchArg *arg; |
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
|
819 const ModifyLogExpunge *expunges; |
327
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
820 unsigned int first_uid, last_uid, client_seq, expunges_before; |
183
4a7ab9e94f25
size_t fixes for lib/. Changed OFF_T_FORMAT to PRIuOFF_T which is more
Timo Sirainen <tss@iki.fi>
parents:
160
diff
changeset
|
821 char num[MAX_LARGEST_T_STRLEN+10]; |
317
79d9a40fbb72
Only first search condition was checked.
Timo Sirainen <tss@iki.fi>
parents:
290
diff
changeset
|
822 int found; |
0 | 823 |
51 | 824 if (ibox->synced_messages_count == 0) |
327
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
825 return TRUE; |
51 | 826 |
0 | 827 /* see if we can limit the records we look at */ |
327
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
828 if (!search_get_uid_range(ibox, args, &first_uid, &last_uid)) |
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
829 return TRUE; |
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
830 |
355
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
352
diff
changeset
|
831 rec = ibox->index->lookup_uid_range(ibox->index, first_uid, last_uid, |
0dc59fd3faed
First version of binary tree file, still some locking issues while opening
Timo Sirainen <tss@iki.fi>
parents:
352
diff
changeset
|
832 &client_seq); |
327
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
833 if (rec == NULL) |
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
834 return TRUE; |
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
835 |
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
836 expunges = mail_modifylog_uid_get_expunges(ibox->index->modifylog, |
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
837 rec->uid, last_uid, |
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
838 &expunges_before); |
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
839 client_seq += expunges_before; |
0 | 840 |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
841 ctx.ibox = ibox; |
327
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
842 for (; rec != NULL && rec->uid <= last_uid; client_seq++) { |
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
|
843 while (expunges->uid1 != 0 && expunges->uid1 < rec->uid) { |
0f6fd6802265
Modify log now stores the changes in ranges, so store 1:100 doesn't
Timo Sirainen <tss@iki.fi>
parents:
450
diff
changeset
|
844 i_assert(expunges->uid2 < rec->uid); |
0f6fd6802265
Modify log now stores the changes in ranges, so store 1:100 doesn't
Timo Sirainen <tss@iki.fi>
parents:
450
diff
changeset
|
845 |
327
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
846 expunges++; |
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
|
847 client_seq += expunges->seq_count; |
327
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
848 } |
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
|
849 i_assert(!(expunges->uid1 <= rec->uid && |
0f6fd6802265
Modify log now stores the changes in ranges, so store 1:100 doesn't
Timo Sirainen <tss@iki.fi>
parents:
450
diff
changeset
|
850 expunges->uid2 >= rec->uid)); |
327
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
851 |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
852 ctx.rec = rec; |
327
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
853 ctx.client_seq = client_seq; |
0 | 854 |
855 mail_search_args_reset(args); | |
856 | |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
857 mail_search_args_foreach(args, search_index_arg, &ctx); |
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
858 mail_search_args_foreach(args, search_cached_arg, &ctx); |
160
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
119
diff
changeset
|
859 mail_search_args_foreach(args, search_slow_arg, &ctx); |
0 | 860 |
317
79d9a40fbb72
Only first search condition was checked.
Timo Sirainen <tss@iki.fi>
parents:
290
diff
changeset
|
861 if (search_arg_match_text(ibox, rec, args)) { |
79d9a40fbb72
Only first search condition was checked.
Timo Sirainen <tss@iki.fi>
parents:
290
diff
changeset
|
862 found = TRUE; |
79d9a40fbb72
Only first search condition was checked.
Timo Sirainen <tss@iki.fi>
parents:
290
diff
changeset
|
863 for (arg = args; arg != NULL; arg = arg->next) { |
79d9a40fbb72
Only first search condition was checked.
Timo Sirainen <tss@iki.fi>
parents:
290
diff
changeset
|
864 if (arg->result != 1) { |
79d9a40fbb72
Only first search condition was checked.
Timo Sirainen <tss@iki.fi>
parents:
290
diff
changeset
|
865 found = FALSE; |
79d9a40fbb72
Only first search condition was checked.
Timo Sirainen <tss@iki.fi>
parents:
290
diff
changeset
|
866 break; |
79d9a40fbb72
Only first search condition was checked.
Timo Sirainen <tss@iki.fi>
parents:
290
diff
changeset
|
867 } |
79d9a40fbb72
Only first search condition was checked.
Timo Sirainen <tss@iki.fi>
parents:
290
diff
changeset
|
868 } |
79d9a40fbb72
Only first search condition was checked.
Timo Sirainen <tss@iki.fi>
parents:
290
diff
changeset
|
869 |
79d9a40fbb72
Only first search condition was checked.
Timo Sirainen <tss@iki.fi>
parents:
290
diff
changeset
|
870 if (found) { |
79d9a40fbb72
Only first search condition was checked.
Timo Sirainen <tss@iki.fi>
parents:
290
diff
changeset
|
871 i_snprintf(num, sizeof(num), " %u", |
327
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
872 uid_result ? rec->uid : client_seq); |
410
1f0e7229ee58
Split IOBuffer into mmaped IBuffer, file IBuffer, memory data IBuffer and
Timo Sirainen <tss@iki.fi>
parents:
408
diff
changeset
|
873 o_buffer_send(outbuf, num, strlen(num)); |
317
79d9a40fbb72
Only first search condition was checked.
Timo Sirainen <tss@iki.fi>
parents:
290
diff
changeset
|
874 } |
0 | 875 } |
327
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
876 |
0 | 877 rec = ibox->index->next(ibox->index, rec); |
878 } | |
327
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
879 |
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
880 return TRUE; |
0 | 881 } |
882 | |
883 int index_storage_search(Mailbox *box, MailSearchArg *args, | |
410
1f0e7229ee58
Split IOBuffer into mmaped IBuffer, file IBuffer, memory data IBuffer and
Timo Sirainen <tss@iki.fi>
parents:
408
diff
changeset
|
884 OBuffer *outbuf, int uid_result) |
0 | 885 { |
886 IndexMailbox *ibox = (IndexMailbox *) box; | |
327
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
887 int failed; |
0 | 888 |
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
|
889 if (!index_storage_sync_index_if_possible(ibox, TRUE)) |
223
ca6967899c05
More cleanups. lib-storage should handle "out of disk space" conditions
Timo Sirainen <tss@iki.fi>
parents:
222
diff
changeset
|
890 return FALSE; |
222
cf4d065f2f85
lots of cleanups. also index/datafile is now capable of staying in memory,
Timo Sirainen <tss@iki.fi>
parents:
216
diff
changeset
|
891 |
0 | 892 if (!ibox->index->set_lock(ibox->index, MAIL_LOCK_SHARED)) |
51 | 893 return mail_storage_set_index_error(ibox); |
894 | |
410
1f0e7229ee58
Split IOBuffer into mmaped IBuffer, file IBuffer, memory data IBuffer and
Timo Sirainen <tss@iki.fi>
parents:
408
diff
changeset
|
895 o_buffer_send(outbuf, "* SEARCH", 8); |
327
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
896 failed = !search_messages(ibox, args, outbuf, uid_result); |
410
1f0e7229ee58
Split IOBuffer into mmaped IBuffer, file IBuffer, memory data IBuffer and
Timo Sirainen <tss@iki.fi>
parents:
408
diff
changeset
|
897 o_buffer_send(outbuf, "\r\n", 2); |
0 | 898 |
51 | 899 if (!ibox->index->set_lock(ibox->index, MAIL_LOCK_UNLOCK)) |
900 return mail_storage_set_index_error(ibox); | |
0 | 901 |
327
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
902 return !failed; |
0 | 903 } |