Mercurial > dovecot > core-2.2
annotate src/lib-storage/index/index-search.c @ 327:276b7a53c264 HEAD
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
numbers when some in the middle were externally deleted.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Sun, 29 Sep 2002 19:19:53 +0300 |
parents | 79d9a40fbb72 |
children | 693f93219218 |
rev | line source |
---|---|
0 | 1 /* Copyright (C) 2002 Timo Sirainen */ |
2 | |
3 #include "lib.h" | |
4 #include "iobuffer.h" | |
5 #include "mmap-util.h" | |
6 #include "rfc822-tokenize.h" | |
119
2f67de235489
Whops, we were using RFC822 dates everywhere instead of IMAP dates.
Timo Sirainen <tss@iki.fi>
parents:
109
diff
changeset
|
7 #include "imap-date.h" |
0 | 8 #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
|
9 #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
|
10 #include "mail-modifylog.h" |
0 | 11 #include "mail-search.h" |
12 | |
13 #include <stdlib.h> | |
14 #include <ctype.h> | |
15 | |
16 #define ARG_SET_RESULT(arg, res) \ | |
17 STMT_START { \ | |
18 (arg)->result = !(arg)->not ? (res) : -(res); \ | |
19 } STMT_END | |
20 | |
21 typedef struct { | |
22 IndexMailbox *ibox; | |
23 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
|
24 unsigned int client_seq; |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
25 } SearchIndexContext; |
0 | 26 |
27 typedef struct { | |
28 MailSearchArg *args; | |
29 int custom_header; | |
30 | |
31 const char *name, *value; | |
184 | 32 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
|
33 } SearchHeaderContext; |
0 | 34 |
35 typedef struct { | |
36 MailSearchArg *args; | |
37 const char *msg; | |
38 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
|
39 |
184 | 40 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
|
41 } SearchTextContext; |
0 | 42 |
43 static int msgset_contains(const char *set, unsigned int match_num, | |
44 unsigned int max_num) | |
45 { | |
46 unsigned int num, num2; | |
47 | |
48 while (*set != '\0') { | |
49 if (*set == '*') { | |
50 set++; | |
51 num = max_num; | |
52 } else { | |
53 num = 0; | |
54 while (*set >= '0' && *set <= '9') { | |
55 num = num*10 + (*set-'0'); | |
56 set++; | |
57 } | |
58 } | |
59 | |
60 if (*set == ',' || *set == '\0') { | |
61 if (num == match_num) | |
62 return TRUE; | |
63 if (*set == '\0') | |
64 return FALSE; | |
65 } else if (*set == ':') { | |
109
27fd7817b226
specifying messageset/uidset in SEARCH broke it
Timo Sirainen <tss@iki.fi>
parents:
66
diff
changeset
|
66 set++; |
27fd7817b226
specifying messageset/uidset in SEARCH broke it
Timo Sirainen <tss@iki.fi>
parents:
66
diff
changeset
|
67 |
0 | 68 if (*set == '*') { |
69 set++; | |
70 | |
71 if (match_num >= num && num <= max_num) | |
72 return TRUE; | |
73 } else { | |
74 num2 = 0; | |
75 while (*set >= '0' && *set <= '9') { | |
76 num2 = num2*10 + (*set-'0'); | |
77 set++; | |
78 } | |
79 | |
80 if (match_num >= num && match_num <= num2) | |
81 return TRUE; | |
82 } | |
83 | |
84 if (*set != ',') | |
85 return FALSE; | |
86 } | |
87 | |
88 set++; | |
89 } | |
90 | |
91 return FALSE; | |
92 } | |
93 | |
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
|
94 static uoff_t str_to_uoff_t(const char *str) |
46 | 95 { |
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
|
96 uoff_t num; |
46 | 97 |
98 num = 0; | |
99 while (*str != '\0') { | |
100 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
|
101 return 0; |
46 | 102 |
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
|
103 num = num*10 + (*str - '0'); |
46 | 104 } |
105 | |
106 return num; | |
107 } | |
108 | |
0 | 109 /* Returns >0 = matched, 0 = not matched, -1 = unknown */ |
110 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
|
111 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
|
112 MailSearchArgType type, const char *value) |
0 | 113 { |
114 time_t t; | |
160
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
119
diff
changeset
|
115 uoff_t size; |
0 | 116 |
117 switch (type) { | |
118 case SEARCH_ALL: | |
119 return TRUE; | |
120 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
|
121 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
|
122 ibox->synced_messages_count); |
0 | 123 case SEARCH_UID: |
124 return msgset_contains(value, rec->uid, | |
125 ibox->synced_messages_count); | |
126 | |
127 /* flags */ | |
128 case SEARCH_ANSWERED: | |
129 return rec->msg_flags & MAIL_ANSWERED; | |
130 case SEARCH_DELETED: | |
131 return rec->msg_flags & MAIL_DELETED; | |
132 case SEARCH_DRAFT: | |
133 return rec->msg_flags & MAIL_DRAFT; | |
134 case SEARCH_FLAGGED: | |
135 return rec->msg_flags & MAIL_FLAGGED; | |
136 case SEARCH_SEEN: | |
137 return rec->msg_flags & MAIL_SEEN; | |
138 case SEARCH_RECENT: | |
139 return rec->uid >= ibox->index->first_recent_uid; | |
140 case SEARCH_KEYWORD: | |
141 return FALSE; | |
142 | |
143 /* dates */ | |
144 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
|
145 if (!imap_parse_date(value, &t)) |
0 | 146 return FALSE; |
119
2f67de235489
Whops, we were using RFC822 dates everywhere instead of IMAP dates.
Timo Sirainen <tss@iki.fi>
parents:
109
diff
changeset
|
147 return rec->internal_date < t; |
0 | 148 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
|
149 if (!imap_parse_date(value, &t)) |
0 | 150 return FALSE; |
151 return rec->internal_date >= t && | |
152 rec->internal_date < t + 3600*24; | |
153 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
|
154 if (!imap_parse_date(value, &t)) |
0 | 155 return FALSE; |
119
2f67de235489
Whops, we were using RFC822 dates everywhere instead of IMAP dates.
Timo Sirainen <tss@iki.fi>
parents:
109
diff
changeset
|
156 return rec->internal_date >= t; |
0 | 157 |
158 case SEARCH_SENTBEFORE: | |
119
2f67de235489
Whops, we were using RFC822 dates everywhere instead of IMAP dates.
Timo Sirainen <tss@iki.fi>
parents:
109
diff
changeset
|
159 if (!imap_parse_date(value, &t)) |
0 | 160 return FALSE; |
119
2f67de235489
Whops, we were using RFC822 dates everywhere instead of IMAP dates.
Timo Sirainen <tss@iki.fi>
parents:
109
diff
changeset
|
161 return rec->sent_date < t; |
0 | 162 case SEARCH_SENTON: |
119
2f67de235489
Whops, we were using RFC822 dates everywhere instead of IMAP dates.
Timo Sirainen <tss@iki.fi>
parents:
109
diff
changeset
|
163 if (!imap_parse_date(value, &t)) |
0 | 164 return FALSE; |
119
2f67de235489
Whops, we were using RFC822 dates everywhere instead of IMAP dates.
Timo Sirainen <tss@iki.fi>
parents:
109
diff
changeset
|
165 return rec->sent_date >= t && rec->sent_date < t + 3600*24; |
0 | 166 case SEARCH_SENTSINCE: |
119
2f67de235489
Whops, we were using RFC822 dates everywhere instead of IMAP dates.
Timo Sirainen <tss@iki.fi>
parents:
109
diff
changeset
|
167 if (!imap_parse_date(value, &t)) |
0 | 168 return FALSE; |
119
2f67de235489
Whops, we were using RFC822 dates everywhere instead of IMAP dates.
Timo Sirainen <tss@iki.fi>
parents:
109
diff
changeset
|
169 return rec->sent_date >= t; |
0 | 170 |
160
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
119
diff
changeset
|
171 /* sizes, only with fastscanning */ |
0 | 172 case SEARCH_SMALLER: |
160
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
119
diff
changeset
|
173 if (!mail_index_get_virtual_size(ibox->index, rec, TRUE, &size)) |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
119
diff
changeset
|
174 return -1; |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
119
diff
changeset
|
175 return size < str_to_uoff_t(value); |
0 | 176 case SEARCH_LARGER: |
160
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
119
diff
changeset
|
177 if (!mail_index_get_virtual_size(ibox->index, rec, TRUE, &size)) |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
119
diff
changeset
|
178 return -1; |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
119
diff
changeset
|
179 return size > str_to_uoff_t(value); |
0 | 180 |
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 | |
204 static int match_field(MailIndex *index, MailIndexRecord *rec, | |
205 MailField field, const char *value) | |
206 { | |
207 const char *field_value; | |
184 | 208 size_t i, value_len; |
0 | 209 |
210 field_value = index->lookup_field(index, rec, field); | |
211 if (field_value == NULL) | |
212 return -1; | |
213 | |
214 /* note: value is already uppercased */ | |
215 value_len = strlen(value); | |
216 for (i = 0; field_value[i] != '\0'; i++) { | |
217 if (value[0] == i_toupper(field_value[i]) && | |
218 strncasecmp(value, field_value+i, value_len) == 0) | |
219 return 1; | |
220 } | |
221 | |
222 return 0; | |
223 } | |
224 | |
225 /* Returns >0 = matched, 0 = not matched, -1 = unknown */ | |
226 static int search_arg_match_cached(MailIndex *index, MailIndexRecord *rec, | |
227 MailSearchArgType type, const char *value) | |
228 { | |
229 switch (type) { | |
230 case SEARCH_FROM: | |
231 return match_field(index, rec, FIELD_TYPE_FROM, value); | |
232 case SEARCH_TO: | |
233 return match_field(index, rec, FIELD_TYPE_TO, value); | |
234 case SEARCH_CC: | |
235 return match_field(index, rec, FIELD_TYPE_CC, value); | |
236 case SEARCH_BCC: | |
237 return match_field(index, rec, FIELD_TYPE_BCC, value); | |
238 case SEARCH_SUBJECT: | |
239 return match_field(index, rec, FIELD_TYPE_SUBJECT, value); | |
240 default: | |
241 return -1; | |
242 } | |
243 } | |
244 | |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
245 static void search_cached_arg(MailSearchArg *arg, void *context) |
0 | 246 { |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
247 SearchIndexContext *ctx = context; |
0 | 248 |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
249 switch (search_arg_match_cached(ctx->ibox->index, ctx->rec, |
0 | 250 arg->type, arg->value.str)) { |
251 case -1: | |
252 /* unknown */ | |
253 break; | |
254 case 0: | |
255 ARG_SET_RESULT(arg, -1); | |
256 break; | |
257 default: | |
258 ARG_SET_RESULT(arg, 1); | |
259 break; | |
260 } | |
261 } | |
262 | |
160
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
119
diff
changeset
|
263 /* 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
|
264 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
|
265 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
|
266 { |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
119
diff
changeset
|
267 uoff_t size; |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
119
diff
changeset
|
268 |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
119
diff
changeset
|
269 switch (type) { |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
119
diff
changeset
|
270 /* 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
|
271 case SEARCH_SMALLER: |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
119
diff
changeset
|
272 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
|
273 return -1; |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
119
diff
changeset
|
274 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
|
275 case SEARCH_LARGER: |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
119
diff
changeset
|
276 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
|
277 return -1; |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
119
diff
changeset
|
278 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
|
279 |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
119
diff
changeset
|
280 default: |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
119
diff
changeset
|
281 return -1; |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
119
diff
changeset
|
282 } |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
119
diff
changeset
|
283 } |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
119
diff
changeset
|
284 |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
119
diff
changeset
|
285 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
|
286 { |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
119
diff
changeset
|
287 SearchIndexContext *ctx = context; |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
119
diff
changeset
|
288 |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
119
diff
changeset
|
289 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
|
290 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
|
291 case -1: |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
119
diff
changeset
|
292 /* unknown */ |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
119
diff
changeset
|
293 break; |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
119
diff
changeset
|
294 case 0: |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
119
diff
changeset
|
295 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
|
296 break; |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
119
diff
changeset
|
297 default: |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
119
diff
changeset
|
298 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
|
299 break; |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
119
diff
changeset
|
300 } |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
119
diff
changeset
|
301 } |
ff05b320482c
Bigger changes.. full_virtual_size was removed from index record and
Timo Sirainen <tss@iki.fi>
parents:
119
diff
changeset
|
302 |
0 | 303 /* needle must be uppercased */ |
184 | 304 static int header_value_match(const char *haystack, size_t haystack_len, |
0 | 305 const char *needle) |
306 { | |
307 const char *n; | |
184 | 308 size_t i, j, needle_len, max; |
0 | 309 |
310 if (*needle == '\0') | |
311 return TRUE; | |
312 | |
313 needle_len = strlen(needle); | |
314 if (haystack_len < needle_len) | |
315 return FALSE; | |
316 | |
317 max = haystack_len - needle_len; | |
318 for (i = 0; i <= max; i++) { | |
319 if (needle[0] != i_toupper(haystack[i])) | |
320 continue; | |
321 | |
322 for (j = i, n = needle; j < haystack_len; j++) { | |
323 if (haystack[j] == '\r') { | |
324 if (j+1 != haystack_len) | |
325 j++; | |
326 } | |
327 | |
328 if (haystack[j] == '\n' && j+1 < haystack_len && | |
329 IS_LWSP(haystack[j+1])) { | |
330 /* long header continuation */ | |
331 j++; | |
332 } | |
333 | |
334 if (*n++ != i_toupper(haystack[j])) | |
335 break; | |
336 | |
337 if (*n == '\0') | |
338 return 1; | |
339 } | |
340 } | |
341 | |
342 return -1; | |
343 } | |
344 | |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
345 static void search_header_arg(MailSearchArg *arg, void *context) |
0 | 346 { |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
347 SearchHeaderContext *ctx = context; |
0 | 348 const char *value; |
184 | 349 size_t len; |
0 | 350 int ret; |
351 | |
352 /* first check that the field name matches to argument. */ | |
353 switch (arg->type) { | |
354 case SEARCH_FROM: | |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
355 if (ctx->name_len != 4 || |
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
356 strncasecmp(ctx->name, "From", 4) != 0) |
0 | 357 return; |
358 value = arg->value.str; | |
359 break; | |
360 case SEARCH_TO: | |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
361 if (ctx->name_len != 2 || |
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
362 strncasecmp(ctx->name, "To", 2) != 0) |
0 | 363 return; |
364 value = arg->value.str; | |
365 break; | |
366 case SEARCH_CC: | |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
367 if (ctx->name_len != 2 || |
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
368 strncasecmp(ctx->name, "Cc", 2) != 0) |
0 | 369 return; |
370 value = arg->value.str; | |
371 break; | |
372 case SEARCH_BCC: | |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
373 if (ctx->name_len != 3 || |
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
374 strncasecmp(ctx->name, "Bcc", 3) != 0) |
0 | 375 return; |
376 value = arg->value.str; | |
377 break; | |
378 case SEARCH_SUBJECT: | |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
379 if (ctx->name_len != 7 || |
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
380 strncasecmp(ctx->name, "Subject", 7) != 0) |
0 | 381 return; |
382 value = arg->value.str; | |
383 break; | |
384 case SEARCH_HEADER: | |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
385 ctx->custom_header = TRUE; |
0 | 386 |
387 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
|
388 if (ctx->name_len != len || |
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
389 strncasecmp(ctx->name, arg->value.str, len) != 0) |
0 | 390 return; |
391 | |
392 value = arg->hdr_value; | |
393 default: | |
394 return; | |
395 } | |
396 | |
397 /* 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
|
398 ret = header_value_match(ctx->value, ctx->value_len, value); |
0 | 399 ARG_SET_RESULT(arg, ret); |
400 } | |
401 | |
402 static void search_header(MessagePart *part __attr_unused__, | |
184 | 403 const char *name, size_t name_len, |
404 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
|
405 void *context) |
0 | 406 { |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
407 SearchHeaderContext *ctx = context; |
0 | 408 |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
409 if (ctx->custom_header || |
0 | 410 (name_len == 4 && strncasecmp(name, "From", 4) == 0) || |
411 (name_len == 2 && strncasecmp(name, "To", 2) == 0) || | |
412 (name_len == 2 && strncasecmp(name, "Cc", 2) == 0) || | |
413 (name_len == 3 && strncasecmp(name, "Bcc", 3) == 0) || | |
414 (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
|
415 ctx->name = name; |
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
416 ctx->value = value; |
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
417 ctx->name_len = name_len; |
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
418 ctx->value_len = value_len; |
0 | 419 |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
420 ctx->custom_header = FALSE; |
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
421 mail_search_args_foreach(ctx->args, search_header_arg, ctx); |
0 | 422 } |
423 } | |
424 | |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
425 static void search_text(MailSearchArg *arg, SearchTextContext *ctx) |
0 | 426 { |
427 const char *p; | |
184 | 428 size_t i, len, max; |
0 | 429 |
430 if (arg->result != 0) | |
431 return; | |
432 | |
433 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
|
434 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
|
435 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
|
436 |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
437 if (ctx->size >= len) { |
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
438 max = ctx->size-len; |
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
439 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
|
440 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
|
441 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
|
442 /* match */ |
1b34ec11fff8
Message data is parsed in blocks (no longer entirely mmap()ed). Several
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
443 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
|
444 return; |
1b34ec11fff8
Message data is parsed in blocks (no longer entirely mmap()ed). Several
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
445 } |
0 | 446 } |
447 } | |
448 } | |
449 | |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
450 static void search_text_header(MailSearchArg *arg, void *context) |
0 | 451 { |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
452 SearchTextContext *ctx = context; |
0 | 453 |
454 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
|
455 search_text(arg, ctx); |
0 | 456 } |
457 | |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
458 static void search_text_body(MailSearchArg *arg, void *context) |
0 | 459 { |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
460 SearchTextContext *ctx = context; |
0 | 461 |
462 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
|
463 search_text(arg, ctx); |
0 | 464 } |
465 | |
211
9ee27ef24ab8
crashfix for searching from message body
Timo Sirainen <tss@iki.fi>
parents:
184
diff
changeset
|
466 static void search_arg_match_data(IOBuffer *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
|
467 MailSearchArg *args, |
1b34ec11fff8
Message data is parsed in blocks (no longer entirely mmap()ed). Several
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
468 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
|
469 { |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
470 SearchTextContext ctx; |
290
3dcc2275b4ca
IOBuffer cleanup, hopefully fixes some mbox problems.
Timo Sirainen <tss@iki.fi>
parents:
223
diff
changeset
|
471 unsigned char *data; |
3dcc2275b4ca
IOBuffer cleanup, hopefully fixes some mbox problems.
Timo Sirainen <tss@iki.fi>
parents:
223
diff
changeset
|
472 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
|
473 |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
474 memset(&ctx, 0, sizeof(ctx)); |
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
475 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
|
476 |
290
3dcc2275b4ca
IOBuffer cleanup, hopefully fixes some mbox problems.
Timo Sirainen <tss@iki.fi>
parents:
223
diff
changeset
|
477 /* first get the max. search keyword length */ |
3dcc2275b4ca
IOBuffer cleanup, hopefully fixes some mbox problems.
Timo Sirainen <tss@iki.fi>
parents:
223
diff
changeset
|
478 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
|
479 max_searchword_len = ctx.max_searchword_len; |
3dcc2275b4ca
IOBuffer cleanup, hopefully fixes some mbox problems.
Timo Sirainen <tss@iki.fi>
parents:
223
diff
changeset
|
480 |
3dcc2275b4ca
IOBuffer cleanup, hopefully fixes some mbox problems.
Timo Sirainen <tss@iki.fi>
parents:
223
diff
changeset
|
481 io_buffer_set_read_limit(inbuf, inbuf->offset + max_size); |
3dcc2275b4ca
IOBuffer cleanup, hopefully fixes some mbox problems.
Timo Sirainen <tss@iki.fi>
parents:
223
diff
changeset
|
482 |
5
1b34ec11fff8
Message data is parsed in blocks (no longer entirely mmap()ed). Several
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
483 /* 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
|
484 for block size - (strlen(largest_searchword)-1) and continue. */ |
290
3dcc2275b4ca
IOBuffer cleanup, hopefully fixes some mbox problems.
Timo Sirainen <tss@iki.fi>
parents:
223
diff
changeset
|
485 while (io_buffer_read_data_blocking(inbuf, &data, &size, |
3dcc2275b4ca
IOBuffer cleanup, hopefully fixes some mbox problems.
Timo Sirainen <tss@iki.fi>
parents:
223
diff
changeset
|
486 max_searchword_len-1) > 0) { |
3dcc2275b4ca
IOBuffer cleanup, hopefully fixes some mbox problems.
Timo Sirainen <tss@iki.fi>
parents:
223
diff
changeset
|
487 ctx.msg = data; |
3dcc2275b4ca
IOBuffer cleanup, hopefully fixes some mbox problems.
Timo Sirainen <tss@iki.fi>
parents:
223
diff
changeset
|
488 ctx.size = size; |
3dcc2275b4ca
IOBuffer cleanup, hopefully fixes some mbox problems.
Timo Sirainen <tss@iki.fi>
parents:
223
diff
changeset
|
489 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
|
490 io_buffer_skip(inbuf, size - (max_searchword_len-1)); |
3dcc2275b4ca
IOBuffer cleanup, hopefully fixes some mbox problems.
Timo Sirainen <tss@iki.fi>
parents:
223
diff
changeset
|
491 } |
5
1b34ec11fff8
Message data is parsed in blocks (no longer entirely mmap()ed). Several
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
492 |
290
3dcc2275b4ca
IOBuffer cleanup, hopefully fixes some mbox problems.
Timo Sirainen <tss@iki.fi>
parents:
223
diff
changeset
|
493 if (size > 0) { |
3dcc2275b4ca
IOBuffer cleanup, hopefully fixes some mbox problems.
Timo Sirainen <tss@iki.fi>
parents:
223
diff
changeset
|
494 /* last block */ |
3dcc2275b4ca
IOBuffer cleanup, hopefully fixes some mbox problems.
Timo Sirainen <tss@iki.fi>
parents:
223
diff
changeset
|
495 ctx.msg = data; |
3dcc2275b4ca
IOBuffer cleanup, hopefully fixes some mbox problems.
Timo Sirainen <tss@iki.fi>
parents:
223
diff
changeset
|
496 ctx.size = size; |
3dcc2275b4ca
IOBuffer cleanup, hopefully fixes some mbox problems.
Timo Sirainen <tss@iki.fi>
parents:
223
diff
changeset
|
497 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
|
498 io_buffer_skip(inbuf, size); |
3dcc2275b4ca
IOBuffer cleanup, hopefully fixes some mbox problems.
Timo Sirainen <tss@iki.fi>
parents:
223
diff
changeset
|
499 } |
5
1b34ec11fff8
Message data is parsed in blocks (no longer entirely mmap()ed). Several
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
500 |
290
3dcc2275b4ca
IOBuffer cleanup, hopefully fixes some mbox problems.
Timo Sirainen <tss@iki.fi>
parents:
223
diff
changeset
|
501 io_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
|
502 } |
1b34ec11fff8
Message data is parsed in blocks (no longer entirely mmap()ed). Several
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
503 |
0 | 504 static int search_arg_match_text(IndexMailbox *ibox, MailIndexRecord *rec, |
505 MailSearchArg *args) | |
506 { | |
5
1b34ec11fff8
Message data is parsed in blocks (no longer entirely mmap()ed). Several
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
507 IOBuffer *inbuf; |
0 | 508 int have_headers, have_body, have_text; |
509 | |
510 /* first check what we need to use */ | |
511 mail_search_args_analyze(args, &have_headers, &have_body, &have_text); | |
512 if (!have_headers && !have_body && !have_text) | |
513 return TRUE; | |
514 | |
5
1b34ec11fff8
Message data is parsed in blocks (no longer entirely mmap()ed). Several
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
515 inbuf = ibox->index->open_mail(ibox->index, rec); |
1b34ec11fff8
Message data is parsed in blocks (no longer entirely mmap()ed). Several
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
516 if (inbuf == NULL) |
0 | 517 return FALSE; |
518 | |
5
1b34ec11fff8
Message data is parsed in blocks (no longer entirely mmap()ed). Several
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
519 if (have_headers) { |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
520 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
|
521 |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
522 memset(&ctx, 0, sizeof(ctx)); |
0 | 523 |
5
1b34ec11fff8
Message data is parsed in blocks (no longer entirely mmap()ed). Several
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
524 /* header checks */ |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
525 ctx.custom_header = TRUE; |
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
526 ctx.args = args; |
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
527 message_parse_header(NULL, inbuf, NULL, search_header, &ctx); |
5
1b34ec11fff8
Message data is parsed in blocks (no longer entirely mmap()ed). Several
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
528 } |
0 | 529 |
5
1b34ec11fff8
Message data is parsed in blocks (no longer entirely mmap()ed). Several
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
530 if (have_text) { |
1b34ec11fff8
Message data is parsed in blocks (no longer entirely mmap()ed). Several
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
531 if (inbuf->offset != 0) { |
1b34ec11fff8
Message data is parsed in blocks (no longer entirely mmap()ed). Several
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
532 /* need to rewind back to beginning of headers */ |
1b34ec11fff8
Message data is parsed in blocks (no longer entirely mmap()ed). Several
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
533 if (!io_buffer_seek(inbuf, 0)) { |
1b34ec11fff8
Message data is parsed in blocks (no longer entirely mmap()ed). Several
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
534 i_error("io_buffer_seek() failed: %m"); |
1b34ec11fff8
Message data is parsed in blocks (no longer entirely mmap()ed). Several
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
535 return FALSE; |
1b34ec11fff8
Message data is parsed in blocks (no longer entirely mmap()ed). Several
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
536 } |
0 | 537 } |
538 | |
5
1b34ec11fff8
Message data is parsed in blocks (no longer entirely mmap()ed). Several
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
539 search_arg_match_data(inbuf, rec->header_size, |
1b34ec11fff8
Message data is parsed in blocks (no longer entirely mmap()ed). Several
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
540 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
|
541 } |
0 | 542 |
5
1b34ec11fff8
Message data is parsed in blocks (no longer entirely mmap()ed). Several
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
543 if (have_text || have_body) { |
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
|
544 if (inbuf->offset != 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
|
545 /* skip over headers */ |
1b34ec11fff8
Message data is parsed in blocks (no longer entirely mmap()ed). Several
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
546 i_assert(inbuf->offset == 0); |
1b34ec11fff8
Message data is parsed in blocks (no longer entirely mmap()ed). Several
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
547 io_buffer_skip(inbuf, rec->header_size); |
0 | 548 } |
549 | |
211
9ee27ef24ab8
crashfix for searching from message body
Timo Sirainen <tss@iki.fi>
parents:
184
diff
changeset
|
550 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
|
551 search_text_body); |
0 | 552 } |
553 | |
5
1b34ec11fff8
Message data is parsed in blocks (no longer entirely mmap()ed). Several
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
554 (void)close(inbuf->fd); |
1b34ec11fff8
Message data is parsed in blocks (no longer entirely mmap()ed). Several
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
555 io_buffer_destroy(inbuf); |
1b34ec11fff8
Message data is parsed in blocks (no longer entirely mmap()ed). Several
Timo Sirainen <tss@iki.fi>
parents:
0
diff
changeset
|
556 return TRUE; |
0 | 557 } |
558 | |
559 static void seq_update(const char *set, unsigned int *first_seq, | |
560 unsigned int *last_seq, unsigned int max_value) | |
561 { | |
562 unsigned int seq; | |
563 | |
564 while (*set != '\0') { | |
565 if (*set == '*') { | |
566 seq = max_value; | |
567 set++; | |
568 } else { | |
569 seq = 0; | |
570 while (*set >= '0' && *set <= '9') { | |
571 seq = seq*10 + (*set-'0'); | |
572 set++; | |
573 } | |
574 } | |
575 | |
576 if (seq != 0) { | |
577 if (*first_seq == 0 || seq < *first_seq) | |
578 *first_seq = seq; | |
579 if (*last_seq == 0 || seq > *last_seq) | |
580 *last_seq = seq; | |
581 } | |
582 | |
46 | 583 set++; |
0 | 584 } |
585 } | |
586 | |
587 static void search_get_sequid(IndexMailbox *ibox, MailSearchArg *args, | |
588 unsigned int *first_seq, unsigned int *last_seq, | |
589 unsigned int *first_uid, unsigned int *last_uid) | |
590 { | |
591 for (; args != NULL; args = args->next) { | |
592 if (args->type == SEARCH_OR || args->type == SEARCH_SUB) { | |
593 search_get_sequid(ibox, args->value.subargs, | |
594 first_seq, last_seq, | |
595 first_uid, last_uid); | |
596 } if (args->type == SEARCH_SET) { | |
597 seq_update(args->value.str, first_seq, last_seq, | |
598 ibox->synced_messages_count); | |
599 } else if (args->type == SEARCH_UID) { | |
600 seq_update(args->value.str, first_uid, last_uid, | |
601 ibox->index->header->next_uid-1); | |
602 } else if (args->type == SEARCH_ALL) { | |
603 /* go through everything */ | |
604 *first_seq = 1; | |
605 *last_seq = ibox->synced_messages_count; | |
606 return; | |
607 } | |
608 } | |
609 } | |
610 | |
327
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
611 static unsigned int client_seq_to_uid(MailIndex *index, unsigned int seq) |
0 | 612 { |
613 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
|
614 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
|
615 |
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
616 (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
|
617 &expunges_before); |
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
618 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
|
619 |
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
620 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
|
621 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
|
622 } |
0 | 623 |
327
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
624 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
|
625 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
|
626 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
|
627 { |
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
628 unsigned int first_seq, last_seq, uid; |
0 | 629 |
327
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
630 *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
|
631 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
|
632 |
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
633 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
|
634 first_uid, last_uid); |
0 | 635 |
51 | 636 /* 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
|
637 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
|
638 i_assert(*first_uid <= *last_uid); |
51 | 639 |
327
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
640 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
|
641 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
|
642 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
|
643 return FALSE; |
0 | 644 |
327
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
645 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
|
646 *first_uid = uid; |
0 | 647 } |
648 | |
327
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
649 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
|
650 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
|
651 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
|
652 return FALSE; |
51 | 653 |
327
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
654 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
|
655 *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
|
656 } |
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
657 |
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
658 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
|
659 *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
|
660 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
|
661 *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
|
662 |
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
663 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
|
664 return TRUE; |
0 | 665 } |
666 | |
327
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
667 static int search_messages(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
|
668 IOBuffer *outbuf, int uid_result) |
0 | 669 { |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
670 SearchIndexContext ctx; |
0 | 671 MailIndexRecord *rec; |
317
79d9a40fbb72
Only first search condition was checked.
Timo Sirainen <tss@iki.fi>
parents:
290
diff
changeset
|
672 MailSearchArg *arg; |
327
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
673 const unsigned int *expunges; |
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
674 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
|
675 char num[MAX_LARGEST_T_STRLEN+10]; |
317
79d9a40fbb72
Only first search condition was checked.
Timo Sirainen <tss@iki.fi>
parents:
290
diff
changeset
|
676 int found; |
0 | 677 |
51 | 678 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
|
679 return TRUE; |
51 | 680 |
0 | 681 /* 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
|
682 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
|
683 return TRUE; |
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
684 |
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
685 rec = ibox->index->lookup_uid_range(ibox->index, 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
|
686 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
|
687 return TRUE; |
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
688 |
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
689 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
|
690 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
|
691 &expunges_before); |
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
692 |
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
693 client_seq = ibox->index->get_sequence(ibox->index, rec); |
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
694 if (client_seq == 0) |
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
695 return mail_storage_set_index_error(ibox); |
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
696 |
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
697 client_seq += expunges_before; |
0 | 698 |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
699 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
|
700 for (; rec != NULL && rec->uid <= last_uid; client_seq++) { |
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
701 while (*expunges != 0 && *expunges < rec->uid) { |
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
702 expunges++; |
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
703 client_seq++; |
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
704 } |
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
705 i_assert(*expunges != rec->uid); |
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
706 |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
707 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
|
708 ctx.client_seq = client_seq; |
0 | 709 |
710 mail_search_args_reset(args); | |
711 | |
10
82b7de533f98
s/user_data/context/ and some s/Data/Context/
Timo Sirainen <tss@iki.fi>
parents:
5
diff
changeset
|
712 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
|
713 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
|
714 mail_search_args_foreach(args, search_slow_arg, &ctx); |
0 | 715 |
317
79d9a40fbb72
Only first search condition was checked.
Timo Sirainen <tss@iki.fi>
parents:
290
diff
changeset
|
716 if (search_arg_match_text(ibox, rec, args)) { |
79d9a40fbb72
Only first search condition was checked.
Timo Sirainen <tss@iki.fi>
parents:
290
diff
changeset
|
717 found = TRUE; |
79d9a40fbb72
Only first search condition was checked.
Timo Sirainen <tss@iki.fi>
parents:
290
diff
changeset
|
718 for (arg = args; arg != NULL; arg = arg->next) { |
79d9a40fbb72
Only first search condition was checked.
Timo Sirainen <tss@iki.fi>
parents:
290
diff
changeset
|
719 if (arg->result != 1) { |
79d9a40fbb72
Only first search condition was checked.
Timo Sirainen <tss@iki.fi>
parents:
290
diff
changeset
|
720 found = FALSE; |
79d9a40fbb72
Only first search condition was checked.
Timo Sirainen <tss@iki.fi>
parents:
290
diff
changeset
|
721 break; |
79d9a40fbb72
Only first search condition was checked.
Timo Sirainen <tss@iki.fi>
parents:
290
diff
changeset
|
722 } |
79d9a40fbb72
Only first search condition was checked.
Timo Sirainen <tss@iki.fi>
parents:
290
diff
changeset
|
723 } |
79d9a40fbb72
Only first search condition was checked.
Timo Sirainen <tss@iki.fi>
parents:
290
diff
changeset
|
724 |
79d9a40fbb72
Only first search condition was checked.
Timo Sirainen <tss@iki.fi>
parents:
290
diff
changeset
|
725 if (found) { |
79d9a40fbb72
Only first search condition was checked.
Timo Sirainen <tss@iki.fi>
parents:
290
diff
changeset
|
726 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
|
727 uid_result ? rec->uid : client_seq); |
317
79d9a40fbb72
Only first search condition was checked.
Timo Sirainen <tss@iki.fi>
parents:
290
diff
changeset
|
728 io_buffer_send(outbuf, num, strlen(num)); |
79d9a40fbb72
Only first search condition was checked.
Timo Sirainen <tss@iki.fi>
parents:
290
diff
changeset
|
729 } |
0 | 730 } |
327
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
731 |
0 | 732 rec = ibox->index->next(ibox->index, rec); |
733 } | |
327
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
734 |
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
735 return TRUE; |
0 | 736 } |
737 | |
738 int index_storage_search(Mailbox *box, MailSearchArg *args, | |
739 IOBuffer *outbuf, int uid_result) | |
740 { | |
741 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
|
742 int failed; |
0 | 743 |
223
ca6967899c05
More cleanups. lib-storage should handle "out of disk space" conditions
Timo Sirainen <tss@iki.fi>
parents:
222
diff
changeset
|
744 if (!index_storage_sync_if_possible(ibox)) |
ca6967899c05
More cleanups. lib-storage should handle "out of disk space" conditions
Timo Sirainen <tss@iki.fi>
parents:
222
diff
changeset
|
745 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
|
746 |
0 | 747 if (!ibox->index->set_lock(ibox->index, MAIL_LOCK_SHARED)) |
51 | 748 return mail_storage_set_index_error(ibox); |
749 | |
750 io_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
|
751 failed = !search_messages(ibox, args, outbuf, uid_result); |
51 | 752 io_buffer_send(outbuf, "\r\n", 2); |
0 | 753 |
51 | 754 if (!ibox->index->set_lock(ibox->index, MAIL_LOCK_UNLOCK)) |
755 return mail_storage_set_index_error(ibox); | |
0 | 756 |
327
276b7a53c264
Modify log fixes. STORE and SEARCH didn't handle properly message sequence
Timo Sirainen <tss@iki.fi>
parents:
317
diff
changeset
|
757 return !failed; |
0 | 758 } |