Mercurial > dovecot > original-hg > dovecot-1.2
annotate src/lib-storage/index/index-mail-headers.c @ 6842:d2c8269a0679 HEAD
Cleanups/rewrites to how/when date/size caching is done.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Thu, 22 Nov 2007 09:36:57 +0200 |
parents | efec8836586a |
children | 414c9d631a81 |
rev | line source |
---|---|
6429
65c69a53a7be
Replaced my Copyright notices. The year range always ends with 2007 now.
Timo Sirainen <tss@iki.fi>
parents:
6428
diff
changeset
|
1 /* Copyright (c) 2003-2007 Dovecot authors, see the included COPYING file */ |
1687
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2 |
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
3 #include "lib.h" |
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
4 #include "istream.h" |
3470
346a494c2feb
Moved array declaration to array-decl.h and include it in lib.h. So array.h
Timo Sirainen <tss@iki.fi>
parents:
3463
diff
changeset
|
5 #include "array.h" |
1687
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
6 #include "buffer.h" |
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
7 #include "str.h" |
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
8 #include "message-date.h" |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
1836
diff
changeset
|
9 #include "message-parser.h" |
6120
00d1a94a94c6
Added mail_get_first_header_utf8() and mail_get_headers_utf8().
Timo Sirainen <tss@iki.fi>
parents:
6083
diff
changeset
|
10 #include "message-header-decode.h" |
6083
1b0ef7a74448
Moved tee stream handling to index-mail code.
Timo Sirainen <tss@iki.fi>
parents:
6006
diff
changeset
|
11 #include "istream-tee.h" |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
12 #include "istream-header-filter.h" |
1687
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
13 #include "imap-envelope.h" |
1689
c07b98265577
If BODY/BODYSTRUCTURE is requested with some other headers, parse the
Timo Sirainen <tss@iki.fi>
parents:
1687
diff
changeset
|
14 #include "imap-bodystructure.h" |
1687
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
15 #include "index-storage.h" |
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
16 #include "index-mail.h" |
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
17 |
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
18 #include <stdlib.h> |
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
19 |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
20 struct index_header_lookup_ctx { |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
21 struct mailbox_header_lookup_ctx ctx; |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
22 pool_t pool; |
1687
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
23 |
3278
df372eecc5d0
Several size_t -> unsigned int changes. Try to keep "unsigned int" for
Timo Sirainen <tss@iki.fi>
parents:
3248
diff
changeset
|
24 unsigned int count; |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
25 unsigned int *idx; |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
26 const char **name; |
1687
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
27 }; |
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
28 |
5522
5dee807e53cf
Header parser has now flags parameter to tell it how to handle linefeeds.
Timo Sirainen <tss@iki.fi>
parents:
5516
diff
changeset
|
29 static const enum message_header_parser_flags hdr_parser_flags = |
5dee807e53cf
Header parser has now flags parameter to tell it how to handle linefeeds.
Timo Sirainen <tss@iki.fi>
parents:
5516
diff
changeset
|
30 MESSAGE_HEADER_PARSER_FLAG_SKIP_INITIAL_LWSP | |
5dee807e53cf
Header parser has now flags parameter to tell it how to handle linefeeds.
Timo Sirainen <tss@iki.fi>
parents:
5516
diff
changeset
|
31 MESSAGE_HEADER_PARSER_FLAG_DROP_CR; |
5dee807e53cf
Header parser has now flags parameter to tell it how to handle linefeeds.
Timo Sirainen <tss@iki.fi>
parents:
5516
diff
changeset
|
32 static const enum message_parser_flags msg_parser_flags = |
5dee807e53cf
Header parser has now flags parameter to tell it how to handle linefeeds.
Timo Sirainen <tss@iki.fi>
parents:
5516
diff
changeset
|
33 MESSAGE_PARSER_FLAG_SKIP_BODY_BLOCK; |
5dee807e53cf
Header parser has now flags parameter to tell it how to handle linefeeds.
Timo Sirainen <tss@iki.fi>
parents:
5516
diff
changeset
|
34 |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
35 static int header_line_cmp(const void *p1, const void *p2) |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
36 { |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
37 const struct index_mail_line *l1 = p1, *l2 = p2; |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
38 int diff; |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
39 |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
40 diff = (int)l1->field_idx - (int)l2->field_idx; |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
41 return diff != 0 ? diff : |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
42 (int)l1->line_num - (int)l2->line_num; |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
43 } |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
44 |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
45 static void index_mail_parse_header_finish(struct index_mail *mail) |
1687
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
46 { |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
47 struct index_mail_line *lines; |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
48 const unsigned char *header, *data; |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
49 const uint8_t *match; |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
50 buffer_t *buf; |
3247
e7166e2f8b9b
Changed some buffers to arrays.
Timo Sirainen <tss@iki.fi>
parents:
3209
diff
changeset
|
51 size_t data_size; |
e7166e2f8b9b
Changed some buffers to arrays.
Timo Sirainen <tss@iki.fi>
parents:
3209
diff
changeset
|
52 unsigned int i, j, count, match_idx, match_count; |
3863
55df57c028d4
Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents:
3525
diff
changeset
|
53 bool noncontiguous; |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
54 |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
55 t_push(); |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
56 |
4451
1a35d53c18fc
Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents:
4418
diff
changeset
|
57 lines = array_get_modifiable(&mail->header_lines, &count); |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
58 |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
59 /* sort it first so fields are grouped together and ordered by |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
60 line number */ |
3247
e7166e2f8b9b
Changed some buffers to arrays.
Timo Sirainen <tss@iki.fi>
parents:
3209
diff
changeset
|
61 qsort(lines, count, sizeof(*lines), header_line_cmp); |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
62 |
3247
e7166e2f8b9b
Changed some buffers to arrays.
Timo Sirainen <tss@iki.fi>
parents:
3209
diff
changeset
|
63 match = array_get(&mail->header_match, &match_count); |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
64 header = buffer_get_data(mail->header_data, NULL); |
2708
f1e9f3ec8135
Buffer API change: we no longer support limited sized buffers where
Timo Sirainen <tss@iki.fi>
parents:
2686
diff
changeset
|
65 buf = buffer_create_dynamic(pool_datastack_create(), 256); |
1687
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
66 |
3248
ff47e78ad717
Renamed mail_get_header() to mail_get_first_header() and mail_gets_headers()
Timo Sirainen <tss@iki.fi>
parents:
3247
diff
changeset
|
67 /* go through all the header lines we found */ |
3247
e7166e2f8b9b
Changed some buffers to arrays.
Timo Sirainen <tss@iki.fi>
parents:
3209
diff
changeset
|
68 for (i = match_idx = 0; i < count; i = j) { |
3248
ff47e78ad717
Renamed mail_get_header() to mail_get_first_header() and mail_gets_headers()
Timo Sirainen <tss@iki.fi>
parents:
3247
diff
changeset
|
69 /* matches and header lines are both sorted, all matches |
ff47e78ad717
Renamed mail_get_header() to mail_get_first_header() and mail_gets_headers()
Timo Sirainen <tss@iki.fi>
parents:
3247
diff
changeset
|
70 until lines[i] weren't found */ |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
71 while (match_idx < lines[i].field_idx && |
3247
e7166e2f8b9b
Changed some buffers to arrays.
Timo Sirainen <tss@iki.fi>
parents:
3209
diff
changeset
|
72 match_idx < match_count) { |
6840
efec8836586a
Don't cache all headers just because they're listed in cache file. First
Timo Sirainen <tss@iki.fi>
parents:
6838
diff
changeset
|
73 if (HEADER_MATCH_USABLE(mail, match[match_idx]) && |
efec8836586a
Don't cache all headers just because they're listed in cache file. First
Timo Sirainen <tss@iki.fi>
parents:
6838
diff
changeset
|
74 mail_cache_field_can_add(mail->trans->cache_trans, |
efec8836586a
Don't cache all headers just because they're listed in cache file. First
Timo Sirainen <tss@iki.fi>
parents:
6838
diff
changeset
|
75 mail->data.seq, |
efec8836586a
Don't cache all headers just because they're listed in cache file. First
Timo Sirainen <tss@iki.fi>
parents:
6838
diff
changeset
|
76 match_idx)) { |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
77 /* this header doesn't exist. remember that. */ |
6840
efec8836586a
Don't cache all headers just because they're listed in cache file. First
Timo Sirainen <tss@iki.fi>
parents:
6838
diff
changeset
|
78 i_assert((match[match_idx] & |
efec8836586a
Don't cache all headers just because they're listed in cache file. First
Timo Sirainen <tss@iki.fi>
parents:
6838
diff
changeset
|
79 HEADER_MATCH_FLAG_FOUND) == 0); |
4518
ed489df90232
index_mail_cache_add() was used with lib-storage's internal indexes for most
Timo Sirainen <tss@iki.fi>
parents:
4507
diff
changeset
|
80 index_mail_cache_add_idx(mail, match_idx, |
ed489df90232
index_mail_cache_add() was used with lib-storage's internal indexes for most
Timo Sirainen <tss@iki.fi>
parents:
4507
diff
changeset
|
81 NULL, 0); |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
82 } |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
83 match_idx++; |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
84 } |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
85 |
3248
ff47e78ad717
Renamed mail_get_header() to mail_get_first_header() and mail_gets_headers()
Timo Sirainen <tss@iki.fi>
parents:
3247
diff
changeset
|
86 if (match_idx < match_count) { |
ff47e78ad717
Renamed mail_get_header() to mail_get_first_header() and mail_gets_headers()
Timo Sirainen <tss@iki.fi>
parents:
3247
diff
changeset
|
87 /* save index to first header line */ |
ff47e78ad717
Renamed mail_get_header() to mail_get_first_header() and mail_gets_headers()
Timo Sirainen <tss@iki.fi>
parents:
3247
diff
changeset
|
88 j = i + 1; |
ff47e78ad717
Renamed mail_get_header() to mail_get_first_header() and mail_gets_headers()
Timo Sirainen <tss@iki.fi>
parents:
3247
diff
changeset
|
89 array_idx_set(&mail->header_match_lines, match_idx, &j); |
ff47e78ad717
Renamed mail_get_header() to mail_get_first_header() and mail_gets_headers()
Timo Sirainen <tss@iki.fi>
parents:
3247
diff
changeset
|
90 match_idx++; |
ff47e78ad717
Renamed mail_get_header() to mail_get_first_header() and mail_gets_headers()
Timo Sirainen <tss@iki.fi>
parents:
3247
diff
changeset
|
91 } |
ff47e78ad717
Renamed mail_get_header() to mail_get_first_header() and mail_gets_headers()
Timo Sirainen <tss@iki.fi>
parents:
3247
diff
changeset
|
92 |
6840
efec8836586a
Don't cache all headers just because they're listed in cache file. First
Timo Sirainen <tss@iki.fi>
parents:
6838
diff
changeset
|
93 if (!mail_cache_field_can_add(mail->trans->cache_trans, |
efec8836586a
Don't cache all headers just because they're listed in cache file. First
Timo Sirainen <tss@iki.fi>
parents:
6838
diff
changeset
|
94 mail->data.seq, |
efec8836586a
Don't cache all headers just because they're listed in cache file. First
Timo Sirainen <tss@iki.fi>
parents:
6838
diff
changeset
|
95 lines[i].field_idx)) { |
3456
5ec00b12f4db
Don't store headers into cache file if they are already there.
Timo Sirainen <tss@iki.fi>
parents:
3301
diff
changeset
|
96 /* header is already cached */ |
3525
8ac16ccc3c73
Fixed a hang if parsed header was already cached.
Timo Sirainen <tss@iki.fi>
parents:
3493
diff
changeset
|
97 j = i + 1; |
3456
5ec00b12f4db
Don't store headers into cache file if they are already there.
Timo Sirainen <tss@iki.fi>
parents:
3301
diff
changeset
|
98 continue; |
5ec00b12f4db
Don't store headers into cache file if they are already there.
Timo Sirainen <tss@iki.fi>
parents:
3301
diff
changeset
|
99 } |
5ec00b12f4db
Don't store headers into cache file if they are already there.
Timo Sirainen <tss@iki.fi>
parents:
3301
diff
changeset
|
100 |
3248
ff47e78ad717
Renamed mail_get_header() to mail_get_first_header() and mail_gets_headers()
Timo Sirainen <tss@iki.fi>
parents:
3247
diff
changeset
|
101 /* buffer contains: { uint32_t line_num[], 0, header texts } |
ff47e78ad717
Renamed mail_get_header() to mail_get_first_header() and mail_gets_headers()
Timo Sirainen <tss@iki.fi>
parents:
3247
diff
changeset
|
102 noncontiguous is just a small optimization.. */ |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
103 buffer_set_used_size(buf, 0); |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
104 buffer_append(buf, &lines[i].line_num, |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
105 sizeof(lines[i].line_num)); |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
106 |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
107 noncontiguous = FALSE; |
3247
e7166e2f8b9b
Changed some buffers to arrays.
Timo Sirainen <tss@iki.fi>
parents:
3209
diff
changeset
|
108 for (j = i+1; j < count; j++) { |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
109 if (lines[j].field_idx != lines[i].field_idx) |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
110 break; |
1687
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
111 |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
112 if (lines[j].start_pos != lines[j-1].end_pos) |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
113 noncontiguous = TRUE; |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
114 buffer_append(buf, &lines[j].line_num, |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
115 sizeof(lines[j].line_num)); |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
116 } |
3248
ff47e78ad717
Renamed mail_get_header() to mail_get_first_header() and mail_gets_headers()
Timo Sirainen <tss@iki.fi>
parents:
3247
diff
changeset
|
117 buffer_append_zero(buf, sizeof(uint32_t)); |
1687
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
118 |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
119 if (noncontiguous) { |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
120 for (; i < j; i++) { |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
121 buffer_append(buf, header + lines[i].start_pos, |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
122 lines[i].end_pos - |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
123 lines[i].start_pos); |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
124 } |
2339
406692edc12d
Cache fixes. Decisions are saved again.
Timo Sirainen <tss@iki.fi>
parents:
2336
diff
changeset
|
125 i--; |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
126 } else { |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
127 buffer_append(buf, header + lines[i].start_pos, |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
128 lines[j-1].end_pos - lines[i].start_pos); |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
129 } |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
130 |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
131 data = buffer_get_data(buf, &data_size); |
4518
ed489df90232
index_mail_cache_add() was used with lib-storage's internal indexes for most
Timo Sirainen <tss@iki.fi>
parents:
4507
diff
changeset
|
132 index_mail_cache_add_idx(mail, lines[i].field_idx, |
ed489df90232
index_mail_cache_add() was used with lib-storage's internal indexes for most
Timo Sirainen <tss@iki.fi>
parents:
4507
diff
changeset
|
133 data, data_size); |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
134 } |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
135 |
3247
e7166e2f8b9b
Changed some buffers to arrays.
Timo Sirainen <tss@iki.fi>
parents:
3209
diff
changeset
|
136 for (; match_idx < match_count; match_idx++) { |
6840
efec8836586a
Don't cache all headers just because they're listed in cache file. First
Timo Sirainen <tss@iki.fi>
parents:
6838
diff
changeset
|
137 if (HEADER_MATCH_USABLE(mail, match[match_idx]) && |
efec8836586a
Don't cache all headers just because they're listed in cache file. First
Timo Sirainen <tss@iki.fi>
parents:
6838
diff
changeset
|
138 mail_cache_field_can_add(mail->trans->cache_trans, |
efec8836586a
Don't cache all headers just because they're listed in cache file. First
Timo Sirainen <tss@iki.fi>
parents:
6838
diff
changeset
|
139 mail->data.seq, |
efec8836586a
Don't cache all headers just because they're listed in cache file. First
Timo Sirainen <tss@iki.fi>
parents:
6838
diff
changeset
|
140 match_idx)) { |
2336 | 141 /* this header doesn't exist. remember that. */ |
6840
efec8836586a
Don't cache all headers just because they're listed in cache file. First
Timo Sirainen <tss@iki.fi>
parents:
6838
diff
changeset
|
142 i_assert((match[match_idx] & |
efec8836586a
Don't cache all headers just because they're listed in cache file. First
Timo Sirainen <tss@iki.fi>
parents:
6838
diff
changeset
|
143 HEADER_MATCH_FLAG_FOUND) == 0); |
4518
ed489df90232
index_mail_cache_add() was used with lib-storage's internal indexes for most
Timo Sirainen <tss@iki.fi>
parents:
4507
diff
changeset
|
144 index_mail_cache_add_idx(mail, match_idx, NULL, 0); |
2336 | 145 } |
146 } | |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
147 t_pop(); |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
148 } |
1687
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
149 |
3458
0c264f105899
Try to be a bit smarter about when to parse header/body.
Timo Sirainen <tss@iki.fi>
parents:
3456
diff
changeset
|
150 static unsigned int |
0c264f105899
Try to be a bit smarter about when to parse header/body.
Timo Sirainen <tss@iki.fi>
parents:
3456
diff
changeset
|
151 get_header_field_idx(struct index_mailbox *ibox, const char *field) |
0c264f105899
Try to be a bit smarter about when to parse header/body.
Timo Sirainen <tss@iki.fi>
parents:
3456
diff
changeset
|
152 { |
0c264f105899
Try to be a bit smarter about when to parse header/body.
Timo Sirainen <tss@iki.fi>
parents:
3456
diff
changeset
|
153 struct mail_cache_field header_field = { |
0c264f105899
Try to be a bit smarter about when to parse header/body.
Timo Sirainen <tss@iki.fi>
parents:
3456
diff
changeset
|
154 NULL, 0, MAIL_CACHE_FIELD_HEADER, 0, |
0c264f105899
Try to be a bit smarter about when to parse header/body.
Timo Sirainen <tss@iki.fi>
parents:
3456
diff
changeset
|
155 MAIL_CACHE_DECISION_TEMP |
0c264f105899
Try to be a bit smarter about when to parse header/body.
Timo Sirainen <tss@iki.fi>
parents:
3456
diff
changeset
|
156 }; |
0c264f105899
Try to be a bit smarter about when to parse header/body.
Timo Sirainen <tss@iki.fi>
parents:
3456
diff
changeset
|
157 |
0c264f105899
Try to be a bit smarter about when to parse header/body.
Timo Sirainen <tss@iki.fi>
parents:
3456
diff
changeset
|
158 t_push(); |
0c264f105899
Try to be a bit smarter about when to parse header/body.
Timo Sirainen <tss@iki.fi>
parents:
3456
diff
changeset
|
159 header_field.name = t_strconcat("hdr.", field, NULL); |
0c264f105899
Try to be a bit smarter about when to parse header/body.
Timo Sirainen <tss@iki.fi>
parents:
3456
diff
changeset
|
160 mail_cache_register_fields(ibox->cache, &header_field, 1); |
0c264f105899
Try to be a bit smarter about when to parse header/body.
Timo Sirainen <tss@iki.fi>
parents:
3456
diff
changeset
|
161 t_pop(); |
0c264f105899
Try to be a bit smarter about when to parse header/body.
Timo Sirainen <tss@iki.fi>
parents:
3456
diff
changeset
|
162 return header_field.idx; |
0c264f105899
Try to be a bit smarter about when to parse header/body.
Timo Sirainen <tss@iki.fi>
parents:
3456
diff
changeset
|
163 } |
0c264f105899
Try to be a bit smarter about when to parse header/body.
Timo Sirainen <tss@iki.fi>
parents:
3456
diff
changeset
|
164 |
5516
96f0b56489a2
Don't feed index_mail_parser headers while searching message bodies, unless
Timo Sirainen <tss@iki.fi>
parents:
5506
diff
changeset
|
165 bool index_mail_want_parse_headers(struct index_mail *mail) |
96f0b56489a2
Don't feed index_mail_parser headers while searching message bodies, unless
Timo Sirainen <tss@iki.fi>
parents:
5506
diff
changeset
|
166 { |
6842
d2c8269a0679
Cleanups/rewrites to how/when date/size caching is done.
Timo Sirainen <tss@iki.fi>
parents:
6840
diff
changeset
|
167 if (mail->wanted_headers != NULL || |
d2c8269a0679
Cleanups/rewrites to how/when date/size caching is done.
Timo Sirainen <tss@iki.fi>
parents:
6840
diff
changeset
|
168 mail->data.save_bodystructure_header) |
d2c8269a0679
Cleanups/rewrites to how/when date/size caching is done.
Timo Sirainen <tss@iki.fi>
parents:
6840
diff
changeset
|
169 return TRUE; |
d2c8269a0679
Cleanups/rewrites to how/when date/size caching is done.
Timo Sirainen <tss@iki.fi>
parents:
6840
diff
changeset
|
170 |
d2c8269a0679
Cleanups/rewrites to how/when date/size caching is done.
Timo Sirainen <tss@iki.fi>
parents:
6840
diff
changeset
|
171 if ((mail->data.cache_fetch_fields & MAIL_FETCH_DATE) != 0 && |
d2c8269a0679
Cleanups/rewrites to how/when date/size caching is done.
Timo Sirainen <tss@iki.fi>
parents:
6840
diff
changeset
|
172 !mail->data.sent_date_parsed) |
d2c8269a0679
Cleanups/rewrites to how/when date/size caching is done.
Timo Sirainen <tss@iki.fi>
parents:
6840
diff
changeset
|
173 return TRUE; |
d2c8269a0679
Cleanups/rewrites to how/when date/size caching is done.
Timo Sirainen <tss@iki.fi>
parents:
6840
diff
changeset
|
174 return FALSE; |
5516
96f0b56489a2
Don't feed index_mail_parser headers while searching message bodies, unless
Timo Sirainen <tss@iki.fi>
parents:
5506
diff
changeset
|
175 } |
96f0b56489a2
Don't feed index_mail_parser headers while searching message bodies, unless
Timo Sirainen <tss@iki.fi>
parents:
5506
diff
changeset
|
176 |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
177 void index_mail_parse_header_init(struct index_mail *mail, |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
178 struct mailbox_header_lookup_ctx *_headers) |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
179 { |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
180 struct index_header_lookup_ctx *headers = |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
181 (struct index_header_lookup_ctx *)_headers; |
6006
9da1ec15340d
We didn't cache correctly headers that existed in cache file for other
Timo Sirainen <tss@iki.fi>
parents:
5625
diff
changeset
|
182 const struct mail_cache_field *all_cache_fields; |
9da1ec15340d
We didn't cache correctly headers that existed in cache file for other
Timo Sirainen <tss@iki.fi>
parents:
5625
diff
changeset
|
183 unsigned int i, count; |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
184 |
2355
e6b216ab4b4f
get_index() wasn't working with caching disabled
Timo Sirainen <tss@iki.fi>
parents:
2347
diff
changeset
|
185 mail->header_seq = mail->data.seq; |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
186 if (mail->header_data == NULL) { |
2708
f1e9f3ec8135
Buffer API change: we no longer support limited sized buffers where
Timo Sirainen <tss@iki.fi>
parents:
2686
diff
changeset
|
187 mail->header_data = buffer_create_dynamic(default_pool, 4096); |
4596
bf4e98a0de3f
Replaced ARRAY_CREATE() macro with [ipt]_array_init() macros. The macro
Timo Sirainen <tss@iki.fi>
parents:
4594
diff
changeset
|
188 i_array_init(&mail->header_lines, 32); |
bf4e98a0de3f
Replaced ARRAY_CREATE() macro with [ipt]_array_init() macros. The macro
Timo Sirainen <tss@iki.fi>
parents:
4594
diff
changeset
|
189 i_array_init(&mail->header_match, 32); |
bf4e98a0de3f
Replaced ARRAY_CREATE() macro with [ipt]_array_init() macros. The macro
Timo Sirainen <tss@iki.fi>
parents:
4594
diff
changeset
|
190 i_array_init(&mail->header_match_lines, 32); |
6840
efec8836586a
Don't cache all headers just because they're listed in cache file. First
Timo Sirainen <tss@iki.fi>
parents:
6838
diff
changeset
|
191 mail->header_match_value = HEADER_MATCH_SKIP_COUNT; |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
192 } else { |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
193 buffer_set_used_size(mail->header_data, 0); |
3247
e7166e2f8b9b
Changed some buffers to arrays.
Timo Sirainen <tss@iki.fi>
parents:
3209
diff
changeset
|
194 array_clear(&mail->header_lines); |
3248
ff47e78ad717
Renamed mail_get_header() to mail_get_first_header() and mail_gets_headers()
Timo Sirainen <tss@iki.fi>
parents:
3247
diff
changeset
|
195 array_clear(&mail->header_match_lines); |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
196 |
6840
efec8836586a
Don't cache all headers just because they're listed in cache file. First
Timo Sirainen <tss@iki.fi>
parents:
6838
diff
changeset
|
197 mail->header_match_value += HEADER_MATCH_SKIP_COUNT; |
efec8836586a
Don't cache all headers just because they're listed in cache file. First
Timo Sirainen <tss@iki.fi>
parents:
6838
diff
changeset
|
198 i_assert((mail->header_match_value & |
efec8836586a
Don't cache all headers just because they're listed in cache file. First
Timo Sirainen <tss@iki.fi>
parents:
6838
diff
changeset
|
199 (HEADER_MATCH_SKIP_COUNT-1)) == 0); |
efec8836586a
Don't cache all headers just because they're listed in cache file. First
Timo Sirainen <tss@iki.fi>
parents:
6838
diff
changeset
|
200 if (mail->header_match_value == 0) { |
efec8836586a
Don't cache all headers just because they're listed in cache file. First
Timo Sirainen <tss@iki.fi>
parents:
6838
diff
changeset
|
201 /* wrapped, we'll have to clear the buffer */ |
efec8836586a
Don't cache all headers just because they're listed in cache file. First
Timo Sirainen <tss@iki.fi>
parents:
6838
diff
changeset
|
202 array_clear(&mail->header_match); |
efec8836586a
Don't cache all headers just because they're listed in cache file. First
Timo Sirainen <tss@iki.fi>
parents:
6838
diff
changeset
|
203 mail->header_match_value = HEADER_MATCH_SKIP_COUNT; |
efec8836586a
Don't cache all headers just because they're listed in cache file. First
Timo Sirainen <tss@iki.fi>
parents:
6838
diff
changeset
|
204 } |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
205 } |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
206 |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
207 if (headers != NULL) { |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
208 for (i = 0; i < headers->count; i++) { |
3247
e7166e2f8b9b
Changed some buffers to arrays.
Timo Sirainen <tss@iki.fi>
parents:
3209
diff
changeset
|
209 array_idx_set(&mail->header_match, headers->idx[i], |
e7166e2f8b9b
Changed some buffers to arrays.
Timo Sirainen <tss@iki.fi>
parents:
3209
diff
changeset
|
210 &mail->header_match_value); |
1687
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
211 } |
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
212 } |
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
213 |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
214 if (mail->wanted_headers != NULL && mail->wanted_headers != headers) { |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
215 headers = mail->wanted_headers; |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
216 for (i = 0; i < headers->count; i++) { |
3247
e7166e2f8b9b
Changed some buffers to arrays.
Timo Sirainen <tss@iki.fi>
parents:
3209
diff
changeset
|
217 array_idx_set(&mail->header_match, headers->idx[i], |
e7166e2f8b9b
Changed some buffers to arrays.
Timo Sirainen <tss@iki.fi>
parents:
3209
diff
changeset
|
218 &mail->header_match_value); |
1687
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
219 } |
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
220 } |
3458
0c264f105899
Try to be a bit smarter about when to parse header/body.
Timo Sirainen <tss@iki.fi>
parents:
3456
diff
changeset
|
221 |
6842
d2c8269a0679
Cleanups/rewrites to how/when date/size caching is done.
Timo Sirainen <tss@iki.fi>
parents:
6840
diff
changeset
|
222 if ((mail->data.cache_fetch_fields & MAIL_FETCH_DATE) != 0) { |
3458
0c264f105899
Try to be a bit smarter about when to parse header/body.
Timo Sirainen <tss@iki.fi>
parents:
3456
diff
changeset
|
223 array_idx_set(&mail->header_match, |
0c264f105899
Try to be a bit smarter about when to parse header/body.
Timo Sirainen <tss@iki.fi>
parents:
3456
diff
changeset
|
224 get_header_field_idx(mail->ibox, "Date"), |
0c264f105899
Try to be a bit smarter about when to parse header/body.
Timo Sirainen <tss@iki.fi>
parents:
3456
diff
changeset
|
225 &mail->header_match_value); |
0c264f105899
Try to be a bit smarter about when to parse header/body.
Timo Sirainen <tss@iki.fi>
parents:
3456
diff
changeset
|
226 } |
3493
3cc5229f1560
Header caching was more or less broken.
Timo Sirainen <tss@iki.fi>
parents:
3470
diff
changeset
|
227 |
6006
9da1ec15340d
We didn't cache correctly headers that existed in cache file for other
Timo Sirainen <tss@iki.fi>
parents:
5625
diff
changeset
|
228 /* register also all the other headers that exist in cache file */ |
9da1ec15340d
We didn't cache correctly headers that existed in cache file for other
Timo Sirainen <tss@iki.fi>
parents:
5625
diff
changeset
|
229 t_push(); |
9da1ec15340d
We didn't cache correctly headers that existed in cache file for other
Timo Sirainen <tss@iki.fi>
parents:
5625
diff
changeset
|
230 all_cache_fields = |
3493
3cc5229f1560
Header caching was more or less broken.
Timo Sirainen <tss@iki.fi>
parents:
3470
diff
changeset
|
231 mail_cache_register_get_list(mail->ibox->cache, |
6006
9da1ec15340d
We didn't cache correctly headers that existed in cache file for other
Timo Sirainen <tss@iki.fi>
parents:
5625
diff
changeset
|
232 pool_datastack_create(), &count); |
9da1ec15340d
We didn't cache correctly headers that existed in cache file for other
Timo Sirainen <tss@iki.fi>
parents:
5625
diff
changeset
|
233 for (i = 0; i < count; i++) { |
6840
efec8836586a
Don't cache all headers just because they're listed in cache file. First
Timo Sirainen <tss@iki.fi>
parents:
6838
diff
changeset
|
234 if (strncasecmp(all_cache_fields[i].name, "hdr.", 4) != 0) |
efec8836586a
Don't cache all headers just because they're listed in cache file. First
Timo Sirainen <tss@iki.fi>
parents:
6838
diff
changeset
|
235 continue; |
efec8836586a
Don't cache all headers just because they're listed in cache file. First
Timo Sirainen <tss@iki.fi>
parents:
6838
diff
changeset
|
236 if (!mail_cache_field_want_add(mail->trans->cache_trans, |
efec8836586a
Don't cache all headers just because they're listed in cache file. First
Timo Sirainen <tss@iki.fi>
parents:
6838
diff
changeset
|
237 mail->data.seq, i)) |
efec8836586a
Don't cache all headers just because they're listed in cache file. First
Timo Sirainen <tss@iki.fi>
parents:
6838
diff
changeset
|
238 continue; |
efec8836586a
Don't cache all headers just because they're listed in cache file. First
Timo Sirainen <tss@iki.fi>
parents:
6838
diff
changeset
|
239 |
efec8836586a
Don't cache all headers just because they're listed in cache file. First
Timo Sirainen <tss@iki.fi>
parents:
6838
diff
changeset
|
240 array_idx_set(&mail->header_match, all_cache_fields[i].idx, |
efec8836586a
Don't cache all headers just because they're listed in cache file. First
Timo Sirainen <tss@iki.fi>
parents:
6838
diff
changeset
|
241 &mail->header_match_value); |
6006
9da1ec15340d
We didn't cache correctly headers that existed in cache file for other
Timo Sirainen <tss@iki.fi>
parents:
5625
diff
changeset
|
242 } |
9da1ec15340d
We didn't cache correctly headers that existed in cache file for other
Timo Sirainen <tss@iki.fi>
parents:
5625
diff
changeset
|
243 t_pop(); |
1687
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
244 } |
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
245 |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
246 static void index_mail_parse_finish_imap_envelope(struct index_mail *mail) |
1687
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
247 { |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
248 string_t *str; |
6842
d2c8269a0679
Cleanups/rewrites to how/when date/size caching is done.
Timo Sirainen <tss@iki.fi>
parents:
6840
diff
changeset
|
249 unsigned int cache_field; |
1687
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
250 |
3209
923ff19873d4
Major mail-storage API changes. It's now a bit cleaner and much more plugin
Timo Sirainen <tss@iki.fi>
parents:
3045
diff
changeset
|
251 str = str_new(mail->data_pool, 256); |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
252 imap_envelope_write_part_data(mail->data.envelope_data, str); |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
253 mail->data.envelope = str_c(str); |
1765
6c0c2ff2c113
Stop parsing cached headers when we've got everything.
Timo Sirainen <tss@iki.fi>
parents:
1758
diff
changeset
|
254 |
6842
d2c8269a0679
Cleanups/rewrites to how/when date/size caching is done.
Timo Sirainen <tss@iki.fi>
parents:
6840
diff
changeset
|
255 cache_field = mail->ibox->cache_fields[MAIL_CACHE_IMAP_ENVELOPE].idx; |
d2c8269a0679
Cleanups/rewrites to how/when date/size caching is done.
Timo Sirainen <tss@iki.fi>
parents:
6840
diff
changeset
|
256 if (mail_cache_field_want_add(mail->trans->cache_trans, |
d2c8269a0679
Cleanups/rewrites to how/when date/size caching is done.
Timo Sirainen <tss@iki.fi>
parents:
6840
diff
changeset
|
257 mail->data.seq, cache_field)) { |
d2c8269a0679
Cleanups/rewrites to how/when date/size caching is done.
Timo Sirainen <tss@iki.fi>
parents:
6840
diff
changeset
|
258 index_mail_cache_add_idx(mail, cache_field, |
d2c8269a0679
Cleanups/rewrites to how/when date/size caching is done.
Timo Sirainen <tss@iki.fi>
parents:
6840
diff
changeset
|
259 str_data(str), str_len(str)); |
d2c8269a0679
Cleanups/rewrites to how/when date/size caching is done.
Timo Sirainen <tss@iki.fi>
parents:
6840
diff
changeset
|
260 } |
1687
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
261 } |
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
262 |
3463
693baa083a79
Mark *all* non-found headers that are registered in cache file as non-found
Timo Sirainen <tss@iki.fi>
parents:
3458
diff
changeset
|
263 void index_mail_parse_header(struct message_part *part, |
693baa083a79
Mark *all* non-found headers that are registered in cache file as non-found
Timo Sirainen <tss@iki.fi>
parents:
3458
diff
changeset
|
264 struct message_header_line *hdr, |
693baa083a79
Mark *all* non-found headers that are registered in cache file as non-found
Timo Sirainen <tss@iki.fi>
parents:
3458
diff
changeset
|
265 struct index_mail *mail) |
1687
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
266 { |
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
267 struct index_mail_data *data = &mail->data; |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
268 const char *cache_field_name; |
3247
e7166e2f8b9b
Changed some buffers to arrays.
Timo Sirainen <tss@iki.fi>
parents:
3209
diff
changeset
|
269 unsigned int field_idx, count; |
3045
ccfd78cc07cc
mail->get_header() was pretty broken. This affected SORT/THREAD.
Timo Sirainen <tss@iki.fi>
parents:
2708
diff
changeset
|
270 uint8_t *match; |
1687
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
271 |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
272 data->parse_line_num++; |
1689
c07b98265577
If BODY/BODYSTRUCTURE is requested with some other headers, parse the
Timo Sirainen <tss@iki.fi>
parents:
1687
diff
changeset
|
273 |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
274 if (data->save_bodystructure_header) { |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
275 i_assert(part != NULL); |
3209
923ff19873d4
Major mail-storage API changes. It's now a bit cleaner and much more plugin
Timo Sirainen <tss@iki.fi>
parents:
3045
diff
changeset
|
276 imap_bodystructure_parse_header(mail->data_pool, part, hdr); |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
277 } |
1689
c07b98265577
If BODY/BODYSTRUCTURE is requested with some other headers, parse the
Timo Sirainen <tss@iki.fi>
parents:
1687
diff
changeset
|
278 |
1687
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
279 if (data->save_envelope) { |
3209
923ff19873d4
Major mail-storage API changes. It's now a bit cleaner and much more plugin
Timo Sirainen <tss@iki.fi>
parents:
3045
diff
changeset
|
280 imap_envelope_parse_header(mail->data_pool, |
1687
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
281 &data->envelope_data, hdr); |
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
282 |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
283 if (hdr == NULL) |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
284 index_mail_parse_finish_imap_envelope(mail); |
1687
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
285 } |
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
286 |
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
287 if (hdr == NULL) { |
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
288 /* end of headers */ |
6842
d2c8269a0679
Cleanups/rewrites to how/when date/size caching is done.
Timo Sirainen <tss@iki.fi>
parents:
6840
diff
changeset
|
289 if (mail->data.save_sent_date) |
d2c8269a0679
Cleanups/rewrites to how/when date/size caching is done.
Timo Sirainen <tss@iki.fi>
parents:
6840
diff
changeset
|
290 mail->data.sent_date_parsed = TRUE; |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
291 index_mail_parse_header_finish(mail); |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
292 data->save_bodystructure_header = FALSE; |
3463
693baa083a79
Mark *all* non-found headers that are registered in cache file as non-found
Timo Sirainen <tss@iki.fi>
parents:
3458
diff
changeset
|
293 return; |
1687
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
294 } |
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
295 |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
296 if (!hdr->continued) { |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
297 t_push(); |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
298 cache_field_name = t_strconcat("hdr.", hdr->name, NULL); |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
299 data->parse_line.field_idx = |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
300 mail_cache_register_lookup(mail->ibox->cache, |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
301 cache_field_name); |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
302 t_pop(); |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
303 } |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
304 field_idx = data->parse_line.field_idx; |
6840
efec8836586a
Don't cache all headers just because they're listed in cache file. First
Timo Sirainen <tss@iki.fi>
parents:
6838
diff
changeset
|
305 match = array_get_modifiable(&mail->header_match, &count); |
efec8836586a
Don't cache all headers just because they're listed in cache file. First
Timo Sirainen <tss@iki.fi>
parents:
6838
diff
changeset
|
306 if (field_idx >= count || |
efec8836586a
Don't cache all headers just because they're listed in cache file. First
Timo Sirainen <tss@iki.fi>
parents:
6838
diff
changeset
|
307 !HEADER_MATCH_USABLE(mail, match[field_idx])) { |
efec8836586a
Don't cache all headers just because they're listed in cache file. First
Timo Sirainen <tss@iki.fi>
parents:
6838
diff
changeset
|
308 /* we don't want this header. */ |
3463
693baa083a79
Mark *all* non-found headers that are registered in cache file as non-found
Timo Sirainen <tss@iki.fi>
parents:
3458
diff
changeset
|
309 return; |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
310 } |
1765
6c0c2ff2c113
Stop parsing cached headers when we've got everything.
Timo Sirainen <tss@iki.fi>
parents:
1758
diff
changeset
|
311 |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
312 if (!hdr->continued) { |
6840
efec8836586a
Don't cache all headers just because they're listed in cache file. First
Timo Sirainen <tss@iki.fi>
parents:
6838
diff
changeset
|
313 /* beginning of a line. add the header name. */ |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
314 data->parse_line.start_pos = str_len(mail->header_data); |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
315 data->parse_line.line_num = data->parse_line_num; |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
316 str_append(mail->header_data, hdr->name); |
2404
8ef002a26f1c
Added struct message_header_line.middle and middle_len to contain the ':'
Timo Sirainen <tss@iki.fi>
parents:
2355
diff
changeset
|
317 str_append_n(mail->header_data, hdr->middle, hdr->middle_len); |
6840
efec8836586a
Don't cache all headers just because they're listed in cache file. First
Timo Sirainen <tss@iki.fi>
parents:
6838
diff
changeset
|
318 |
efec8836586a
Don't cache all headers just because they're listed in cache file. First
Timo Sirainen <tss@iki.fi>
parents:
6838
diff
changeset
|
319 /* remember that we saw this header so we don't add it to |
efec8836586a
Don't cache all headers just because they're listed in cache file. First
Timo Sirainen <tss@iki.fi>
parents:
6838
diff
changeset
|
320 cache as nonexisting. */ |
efec8836586a
Don't cache all headers just because they're listed in cache file. First
Timo Sirainen <tss@iki.fi>
parents:
6838
diff
changeset
|
321 match[field_idx] |= HEADER_MATCH_FLAG_FOUND; |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
322 } |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
323 str_append_n(mail->header_data, hdr->value, hdr->value_len); |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
324 if (!hdr->no_newline) |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
325 str_append(mail->header_data, "\n"); |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
326 if (!hdr->continues) { |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
327 data->parse_line.end_pos = str_len(mail->header_data); |
3247
e7166e2f8b9b
Changed some buffers to arrays.
Timo Sirainen <tss@iki.fi>
parents:
3209
diff
changeset
|
328 array_append(&mail->header_lines, &data->parse_line, 1); |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
329 } |
1765
6c0c2ff2c113
Stop parsing cached headers when we've got everything.
Timo Sirainen <tss@iki.fi>
parents:
1758
diff
changeset
|
330 } |
6c0c2ff2c113
Stop parsing cached headers when we've got everything.
Timo Sirainen <tss@iki.fi>
parents:
1758
diff
changeset
|
331 |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
332 static void |
4259
fd315deac28f
Rewrote the message bodystructure parser to allow parsing from non-blocking streams. Also did a couple of API changes and cleanups.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4070
diff
changeset
|
333 index_mail_parse_part_header_cb(struct message_part *part, |
4907
5b4c9b20eba0
Replaced void *context from a lot of callbacks with the actual context
Timo Sirainen <tss@iki.fi>
parents:
4657
diff
changeset
|
334 struct message_header_line *hdr, |
5b4c9b20eba0
Replaced void *context from a lot of callbacks with the actual context
Timo Sirainen <tss@iki.fi>
parents:
4657
diff
changeset
|
335 struct index_mail *mail) |
1765
6c0c2ff2c113
Stop parsing cached headers when we've got everything.
Timo Sirainen <tss@iki.fi>
parents:
1758
diff
changeset
|
336 { |
3463
693baa083a79
Mark *all* non-found headers that are registered in cache file as non-found
Timo Sirainen <tss@iki.fi>
parents:
3458
diff
changeset
|
337 index_mail_parse_header(part, hdr, mail); |
1687
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
338 } |
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
339 |
4259
fd315deac28f
Rewrote the message bodystructure parser to allow parsing from non-blocking streams. Also did a couple of API changes and cleanups.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4070
diff
changeset
|
340 static void |
4907
5b4c9b20eba0
Replaced void *context from a lot of callbacks with the actual context
Timo Sirainen <tss@iki.fi>
parents:
4657
diff
changeset
|
341 index_mail_parse_header_cb(struct message_header_line *hdr, |
5b4c9b20eba0
Replaced void *context from a lot of callbacks with the actual context
Timo Sirainen <tss@iki.fi>
parents:
4657
diff
changeset
|
342 struct index_mail *mail) |
4259
fd315deac28f
Rewrote the message bodystructure parser to allow parsing from non-blocking streams. Also did a couple of API changes and cleanups.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4070
diff
changeset
|
343 { |
fd315deac28f
Rewrote the message bodystructure parser to allow parsing from non-blocking streams. Also did a couple of API changes and cleanups.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4070
diff
changeset
|
344 index_mail_parse_header(mail->data.parts, hdr, mail); |
fd315deac28f
Rewrote the message bodystructure parser to allow parsing from non-blocking streams. Also did a couple of API changes and cleanups.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4070
diff
changeset
|
345 } |
fd315deac28f
Rewrote the message bodystructure parser to allow parsing from non-blocking streams. Also did a couple of API changes and cleanups.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4070
diff
changeset
|
346 |
6265
0ee2b0691f3e
Cache received date, sent date, save date and physical size when saving
Timo Sirainen <tss@iki.fi>
parents:
6142
diff
changeset
|
347 struct istream * |
0ee2b0691f3e
Cache received date, sent date, save date and physical size when saving
Timo Sirainen <tss@iki.fi>
parents:
6142
diff
changeset
|
348 index_mail_cache_parse_init(struct mail *_mail, struct istream *input) |
5522
5dee807e53cf
Header parser has now flags parameter to tell it how to handle linefeeds.
Timo Sirainen <tss@iki.fi>
parents:
5516
diff
changeset
|
349 { |
5dee807e53cf
Header parser has now flags parameter to tell it how to handle linefeeds.
Timo Sirainen <tss@iki.fi>
parents:
5516
diff
changeset
|
350 struct index_mail *mail = (struct index_mail *)_mail; |
6083
1b0ef7a74448
Moved tee stream handling to index-mail code.
Timo Sirainen <tss@iki.fi>
parents:
6006
diff
changeset
|
351 struct tee_istream *tee; |
1b0ef7a74448
Moved tee stream handling to index-mail code.
Timo Sirainen <tss@iki.fi>
parents:
6006
diff
changeset
|
352 struct istream *input2; |
5522
5dee807e53cf
Header parser has now flags parameter to tell it how to handle linefeeds.
Timo Sirainen <tss@iki.fi>
parents:
5516
diff
changeset
|
353 |
5dee807e53cf
Header parser has now flags parameter to tell it how to handle linefeeds.
Timo Sirainen <tss@iki.fi>
parents:
5516
diff
changeset
|
354 i_assert(mail->data.parser_ctx == NULL); |
5dee807e53cf
Header parser has now flags parameter to tell it how to handle linefeeds.
Timo Sirainen <tss@iki.fi>
parents:
5516
diff
changeset
|
355 |
6526
c4205f6ac88f
Make sure we parse everything so they can be saved to cache.
Timo Sirainen <tss@iki.fi>
parents:
6445
diff
changeset
|
356 /* we're doing everything for now, figure out later if we want to |
c4205f6ac88f
Make sure we parse everything so they can be saved to cache.
Timo Sirainen <tss@iki.fi>
parents:
6445
diff
changeset
|
357 save them. */ |
c4205f6ac88f
Make sure we parse everything so they can be saved to cache.
Timo Sirainen <tss@iki.fi>
parents:
6445
diff
changeset
|
358 mail->data.save_sent_date = TRUE; |
c4205f6ac88f
Make sure we parse everything so they can be saved to cache.
Timo Sirainen <tss@iki.fi>
parents:
6445
diff
changeset
|
359 mail->data.save_bodystructure_header = TRUE; |
c4205f6ac88f
Make sure we parse everything so they can be saved to cache.
Timo Sirainen <tss@iki.fi>
parents:
6445
diff
changeset
|
360 mail->data.save_bodystructure_body = TRUE; |
c4205f6ac88f
Make sure we parse everything so they can be saved to cache.
Timo Sirainen <tss@iki.fi>
parents:
6445
diff
changeset
|
361 |
6142
6c0bfc35af03
Removed memory pool parameter from iostreams. Default pool was almost always
Timo Sirainen <tss@iki.fi>
parents:
6120
diff
changeset
|
362 tee = tee_i_stream_create(input); |
6c0bfc35af03
Removed memory pool parameter from iostreams. Default pool was almost always
Timo Sirainen <tss@iki.fi>
parents:
6120
diff
changeset
|
363 input = tee_i_stream_create_child(tee); |
6c0bfc35af03
Removed memory pool parameter from iostreams. Default pool was almost always
Timo Sirainen <tss@iki.fi>
parents:
6120
diff
changeset
|
364 input2 = tee_i_stream_create_child(tee); |
6083
1b0ef7a74448
Moved tee stream handling to index-mail code.
Timo Sirainen <tss@iki.fi>
parents:
6006
diff
changeset
|
365 |
5522
5dee807e53cf
Header parser has now flags parameter to tell it how to handle linefeeds.
Timo Sirainen <tss@iki.fi>
parents:
5516
diff
changeset
|
366 index_mail_parse_header_init(mail, NULL); |
5dee807e53cf
Header parser has now flags parameter to tell it how to handle linefeeds.
Timo Sirainen <tss@iki.fi>
parents:
5516
diff
changeset
|
367 mail->data.parser_ctx = |
5dee807e53cf
Header parser has now flags parameter to tell it how to handle linefeeds.
Timo Sirainen <tss@iki.fi>
parents:
5516
diff
changeset
|
368 message_parser_init(mail->data_pool, input, |
5dee807e53cf
Header parser has now flags parameter to tell it how to handle linefeeds.
Timo Sirainen <tss@iki.fi>
parents:
5516
diff
changeset
|
369 hdr_parser_flags, msg_parser_flags); |
6083
1b0ef7a74448
Moved tee stream handling to index-mail code.
Timo Sirainen <tss@iki.fi>
parents:
6006
diff
changeset
|
370 i_stream_unref(&input); |
1b0ef7a74448
Moved tee stream handling to index-mail code.
Timo Sirainen <tss@iki.fi>
parents:
6006
diff
changeset
|
371 return input2; |
5522
5dee807e53cf
Header parser has now flags parameter to tell it how to handle linefeeds.
Timo Sirainen <tss@iki.fi>
parents:
5516
diff
changeset
|
372 } |
5dee807e53cf
Header parser has now flags parameter to tell it how to handle linefeeds.
Timo Sirainen <tss@iki.fi>
parents:
5516
diff
changeset
|
373 |
5506
6cd889c652b0
Removed message_parse_from_parts(). Added message_parser_init_from_parts()
Timo Sirainen <tss@iki.fi>
parents:
4907
diff
changeset
|
374 static void index_mail_init_parser(struct index_mail *mail) |
6cd889c652b0
Removed message_parse_from_parts(). Added message_parser_init_from_parts()
Timo Sirainen <tss@iki.fi>
parents:
4907
diff
changeset
|
375 { |
6cd889c652b0
Removed message_parse_from_parts(). Added message_parser_init_from_parts()
Timo Sirainen <tss@iki.fi>
parents:
4907
diff
changeset
|
376 struct index_mail_data *data = &mail->data; |
6cd889c652b0
Removed message_parse_from_parts(). Added message_parser_init_from_parts()
Timo Sirainen <tss@iki.fi>
parents:
4907
diff
changeset
|
377 |
6cd889c652b0
Removed message_parse_from_parts(). Added message_parser_init_from_parts()
Timo Sirainen <tss@iki.fi>
parents:
4907
diff
changeset
|
378 if (data->parser_ctx != NULL) |
6cd889c652b0
Removed message_parse_from_parts(). Added message_parser_init_from_parts()
Timo Sirainen <tss@iki.fi>
parents:
4907
diff
changeset
|
379 (void)message_parser_deinit(&data->parser_ctx); |
6cd889c652b0
Removed message_parse_from_parts(). Added message_parser_init_from_parts()
Timo Sirainen <tss@iki.fi>
parents:
4907
diff
changeset
|
380 |
6cd889c652b0
Removed message_parse_from_parts(). Added message_parser_init_from_parts()
Timo Sirainen <tss@iki.fi>
parents:
4907
diff
changeset
|
381 if (data->parts == NULL) { |
5522
5dee807e53cf
Header parser has now flags parameter to tell it how to handle linefeeds.
Timo Sirainen <tss@iki.fi>
parents:
5516
diff
changeset
|
382 data->parser_ctx = message_parser_init(mail->data_pool, |
5dee807e53cf
Header parser has now flags parameter to tell it how to handle linefeeds.
Timo Sirainen <tss@iki.fi>
parents:
5516
diff
changeset
|
383 data->stream, |
5dee807e53cf
Header parser has now flags parameter to tell it how to handle linefeeds.
Timo Sirainen <tss@iki.fi>
parents:
5516
diff
changeset
|
384 hdr_parser_flags, |
5dee807e53cf
Header parser has now flags parameter to tell it how to handle linefeeds.
Timo Sirainen <tss@iki.fi>
parents:
5516
diff
changeset
|
385 msg_parser_flags); |
5506
6cd889c652b0
Removed message_parse_from_parts(). Added message_parser_init_from_parts()
Timo Sirainen <tss@iki.fi>
parents:
4907
diff
changeset
|
386 } else { |
6cd889c652b0
Removed message_parse_from_parts(). Added message_parser_init_from_parts()
Timo Sirainen <tss@iki.fi>
parents:
4907
diff
changeset
|
387 data->parser_ctx = |
6cd889c652b0
Removed message_parse_from_parts(). Added message_parser_init_from_parts()
Timo Sirainen <tss@iki.fi>
parents:
4907
diff
changeset
|
388 message_parser_init_from_parts(data->parts, |
5522
5dee807e53cf
Header parser has now flags parameter to tell it how to handle linefeeds.
Timo Sirainen <tss@iki.fi>
parents:
5516
diff
changeset
|
389 data->stream, |
5dee807e53cf
Header parser has now flags parameter to tell it how to handle linefeeds.
Timo Sirainen <tss@iki.fi>
parents:
5516
diff
changeset
|
390 hdr_parser_flags, |
5dee807e53cf
Header parser has now flags parameter to tell it how to handle linefeeds.
Timo Sirainen <tss@iki.fi>
parents:
5516
diff
changeset
|
391 msg_parser_flags); |
5506
6cd889c652b0
Removed message_parse_from_parts(). Added message_parser_init_from_parts()
Timo Sirainen <tss@iki.fi>
parents:
4907
diff
changeset
|
392 } |
6cd889c652b0
Removed message_parse_from_parts(). Added message_parser_init_from_parts()
Timo Sirainen <tss@iki.fi>
parents:
4907
diff
changeset
|
393 } |
6cd889c652b0
Removed message_parse_from_parts(). Added message_parser_init_from_parts()
Timo Sirainen <tss@iki.fi>
parents:
4907
diff
changeset
|
394 |
2336 | 395 int index_mail_parse_headers(struct index_mail *mail, |
396 struct mailbox_header_lookup_ctx *headers) | |
1687
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
397 { |
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
398 struct index_mail_data *data = &mail->data; |
6280
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
399 struct istream *input; |
4507
ebf140ebdb06
Restore data stream's offset after it has been internally changed, so that
Timo Sirainen <tss@iki.fi>
parents:
4451
diff
changeset
|
400 uoff_t old_offset; |
ebf140ebdb06
Restore data stream's offset after it has been internally changed, so that
Timo Sirainen <tss@iki.fi>
parents:
4451
diff
changeset
|
401 |
ebf140ebdb06
Restore data stream's offset after it has been internally changed, so that
Timo Sirainen <tss@iki.fi>
parents:
4451
diff
changeset
|
402 old_offset = data->stream == NULL ? 0 : data->stream->v_offset; |
1687
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
403 |
6280
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
404 if (mail_get_stream(&mail->mail.mail, NULL, NULL, &input) < 0) |
2509
146591955618
Fixed crash if mail data was fetched in specific order. Plus some minor
Timo Sirainen <tss@iki.fi>
parents:
2451
diff
changeset
|
405 return -1; |
1687
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
406 |
2336 | 407 index_mail_parse_header_init(mail, headers); |
1689
c07b98265577
If BODY/BODYSTRUCTURE is requested with some other headers, parse the
Timo Sirainen <tss@iki.fi>
parents:
1687
diff
changeset
|
408 |
5625
ebf443cae951
Assert-crashfix in some conditions.
Timo Sirainen <tss@iki.fi>
parents:
5522
diff
changeset
|
409 if (data->parts == NULL || data->save_bodystructure_header) { |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
410 /* initialize bodystructure parsing in case we read the whole |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
411 message. */ |
5506
6cd889c652b0
Removed message_parse_from_parts(). Added message_parser_init_from_parts()
Timo Sirainen <tss@iki.fi>
parents:
4907
diff
changeset
|
412 index_mail_init_parser(mail); |
1697
ef79ce6507ff
Message parsing can now be done in two parts - header and body. We're now
Timo Sirainen <tss@iki.fi>
parents:
1689
diff
changeset
|
413 message_parser_parse_header(data->parser_ctx, &data->hdr_size, |
4259
fd315deac28f
Rewrote the message bodystructure parser to allow parsing from non-blocking streams. Also did a couple of API changes and cleanups.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4070
diff
changeset
|
414 index_mail_parse_part_header_cb, |
fd315deac28f
Rewrote the message bodystructure parser to allow parsing from non-blocking streams. Also did a couple of API changes and cleanups.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4070
diff
changeset
|
415 mail); |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
416 } else { |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
417 /* just read the header */ |
4259
fd315deac28f
Rewrote the message bodystructure parser to allow parsing from non-blocking streams. Also did a couple of API changes and cleanups.
Timo Sirainen <timo.sirainen@movial.fi>
parents:
4070
diff
changeset
|
418 message_parse_header(data->stream, &data->hdr_size, |
5522
5dee807e53cf
Header parser has now flags parameter to tell it how to handle linefeeds.
Timo Sirainen <tss@iki.fi>
parents:
5516
diff
changeset
|
419 hdr_parser_flags, |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
420 index_mail_parse_header_cb, mail); |
1689
c07b98265577
If BODY/BODYSTRUCTURE is requested with some other headers, parse the
Timo Sirainen <tss@iki.fi>
parents:
1687
diff
changeset
|
421 } |
1697
ef79ce6507ff
Message parsing can now be done in two parts - header and body. We're now
Timo Sirainen <tss@iki.fi>
parents:
1689
diff
changeset
|
422 data->hdr_size_set = TRUE; |
3458
0c264f105899
Try to be a bit smarter about when to parse header/body.
Timo Sirainen <tss@iki.fi>
parents:
3456
diff
changeset
|
423 data->access_part &= ~PARSE_HDR; |
1687
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
424 |
4507
ebf140ebdb06
Restore data stream's offset after it has been internally changed, so that
Timo Sirainen <tss@iki.fi>
parents:
4451
diff
changeset
|
425 i_stream_seek(data->stream, old_offset); |
2509
146591955618
Fixed crash if mail data was fetched in specific order. Plus some minor
Timo Sirainen <tss@iki.fi>
parents:
2451
diff
changeset
|
426 return 0; |
1687
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
427 } |
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
428 |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
429 static void |
4907
5b4c9b20eba0
Replaced void *context from a lot of callbacks with the actual context
Timo Sirainen <tss@iki.fi>
parents:
4657
diff
changeset
|
430 imap_envelope_parse_callback(struct message_header_line *hdr, |
5b4c9b20eba0
Replaced void *context from a lot of callbacks with the actual context
Timo Sirainen <tss@iki.fi>
parents:
4657
diff
changeset
|
431 struct index_mail *mail) |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
432 { |
3209
923ff19873d4
Major mail-storage API changes. It's now a bit cleaner and much more plugin
Timo Sirainen <tss@iki.fi>
parents:
3045
diff
changeset
|
433 imap_envelope_parse_header(mail->data_pool, |
923ff19873d4
Major mail-storage API changes. It's now a bit cleaner and much more plugin
Timo Sirainen <tss@iki.fi>
parents:
3045
diff
changeset
|
434 &mail->data.envelope_data, hdr); |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
435 |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
436 if (hdr == NULL) |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
437 index_mail_parse_finish_imap_envelope(mail); |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
438 } |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
439 |
6280
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
440 int index_mail_headers_get_envelope(struct index_mail *mail) |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
441 { |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
442 struct mailbox_header_lookup_ctx *header_ctx; |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
443 struct istream *stream; |
4507
ebf140ebdb06
Restore data stream's offset after it has been internally changed, so that
Timo Sirainen <tss@iki.fi>
parents:
4451
diff
changeset
|
444 uoff_t old_offset; |
ebf140ebdb06
Restore data stream's offset after it has been internally changed, so that
Timo Sirainen <tss@iki.fi>
parents:
4451
diff
changeset
|
445 |
ebf140ebdb06
Restore data stream's offset after it has been internally changed, so that
Timo Sirainen <tss@iki.fi>
parents:
4451
diff
changeset
|
446 old_offset = mail->data.stream == NULL ? 0 : |
ebf140ebdb06
Restore data stream's offset after it has been internally changed, so that
Timo Sirainen <tss@iki.fi>
parents:
4451
diff
changeset
|
447 mail->data.stream->v_offset; |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
448 |
2328
6527f1da0ee3
Avoid parsing headers twice to get IMAP envelope.
Timo Sirainen <tss@iki.fi>
parents:
2327
diff
changeset
|
449 mail->data.save_envelope = TRUE; |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
450 header_ctx = mailbox_header_lookup_init(&mail->ibox->box, |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
451 imap_envelope_headers); |
6280
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
452 if (mail_get_header_stream(&mail->mail.mail, header_ctx, &stream) < 0) |
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
453 return -1; |
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
454 |
2686
6e0a7083a880
Don't crash if fetching ENVELOPE for expunged message.
Timo Sirainen <tss@iki.fi>
parents:
2509
diff
changeset
|
455 if (mail->data.envelope == NULL && stream != NULL) { |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
456 /* we got the headers from cache - parse them to get the |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
457 envelope */ |
5522
5dee807e53cf
Header parser has now flags parameter to tell it how to handle linefeeds.
Timo Sirainen <tss@iki.fi>
parents:
5516
diff
changeset
|
458 message_parse_header(stream, NULL, hdr_parser_flags, |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
459 imap_envelope_parse_callback, mail); |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
460 mail->data.save_envelope = FALSE; |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
461 } |
3879
928229f8b3e6
deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents:
3863
diff
changeset
|
462 mailbox_header_lookup_deinit(&header_ctx); |
4507
ebf140ebdb06
Restore data stream's offset after it has been internally changed, so that
Timo Sirainen <tss@iki.fi>
parents:
4451
diff
changeset
|
463 |
ebf140ebdb06
Restore data stream's offset after it has been internally changed, so that
Timo Sirainen <tss@iki.fi>
parents:
4451
diff
changeset
|
464 if (mail->data.stream != NULL) |
ebf140ebdb06
Restore data stream's offset after it has been internally changed, so that
Timo Sirainen <tss@iki.fi>
parents:
4451
diff
changeset
|
465 i_stream_seek(mail->data.stream, old_offset); |
6280
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
466 return 0; |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
467 } |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
468 |
2355
e6b216ab4b4f
get_index() wasn't working with caching disabled
Timo Sirainen <tss@iki.fi>
parents:
2347
diff
changeset
|
469 static size_t get_header_size(buffer_t *buffer, size_t pos) |
e6b216ab4b4f
get_index() wasn't working with caching disabled
Timo Sirainen <tss@iki.fi>
parents:
2347
diff
changeset
|
470 { |
e6b216ab4b4f
get_index() wasn't working with caching disabled
Timo Sirainen <tss@iki.fi>
parents:
2347
diff
changeset
|
471 const unsigned char *data; |
e6b216ab4b4f
get_index() wasn't working with caching disabled
Timo Sirainen <tss@iki.fi>
parents:
2347
diff
changeset
|
472 size_t i, size; |
e6b216ab4b4f
get_index() wasn't working with caching disabled
Timo Sirainen <tss@iki.fi>
parents:
2347
diff
changeset
|
473 |
e6b216ab4b4f
get_index() wasn't working with caching disabled
Timo Sirainen <tss@iki.fi>
parents:
2347
diff
changeset
|
474 data = buffer_get_data(buffer, &size); |
e6b216ab4b4f
get_index() wasn't working with caching disabled
Timo Sirainen <tss@iki.fi>
parents:
2347
diff
changeset
|
475 i_assert(pos <= size); |
e6b216ab4b4f
get_index() wasn't working with caching disabled
Timo Sirainen <tss@iki.fi>
parents:
2347
diff
changeset
|
476 |
e6b216ab4b4f
get_index() wasn't working with caching disabled
Timo Sirainen <tss@iki.fi>
parents:
2347
diff
changeset
|
477 for (i = pos; i < size; i++) { |
e6b216ab4b4f
get_index() wasn't working with caching disabled
Timo Sirainen <tss@iki.fi>
parents:
2347
diff
changeset
|
478 if (data[i] == '\n') { |
e6b216ab4b4f
get_index() wasn't working with caching disabled
Timo Sirainen <tss@iki.fi>
parents:
2347
diff
changeset
|
479 if (i+1 == size || |
e6b216ab4b4f
get_index() wasn't working with caching disabled
Timo Sirainen <tss@iki.fi>
parents:
2347
diff
changeset
|
480 (data[i+1] != ' ' && data[i+1] != '\t')) |
e6b216ab4b4f
get_index() wasn't working with caching disabled
Timo Sirainen <tss@iki.fi>
parents:
2347
diff
changeset
|
481 return i - pos; |
e6b216ab4b4f
get_index() wasn't working with caching disabled
Timo Sirainen <tss@iki.fi>
parents:
2347
diff
changeset
|
482 } |
e6b216ab4b4f
get_index() wasn't working with caching disabled
Timo Sirainen <tss@iki.fi>
parents:
2347
diff
changeset
|
483 } |
e6b216ab4b4f
get_index() wasn't working with caching disabled
Timo Sirainen <tss@iki.fi>
parents:
2347
diff
changeset
|
484 return size - pos; |
e6b216ab4b4f
get_index() wasn't working with caching disabled
Timo Sirainen <tss@iki.fi>
parents:
2347
diff
changeset
|
485 } |
e6b216ab4b4f
get_index() wasn't working with caching disabled
Timo Sirainen <tss@iki.fi>
parents:
2347
diff
changeset
|
486 |
e6b216ab4b4f
get_index() wasn't working with caching disabled
Timo Sirainen <tss@iki.fi>
parents:
2347
diff
changeset
|
487 static int index_mail_header_is_parsed(struct index_mail *mail, |
e6b216ab4b4f
get_index() wasn't working with caching disabled
Timo Sirainen <tss@iki.fi>
parents:
2347
diff
changeset
|
488 unsigned int field_idx) |
e6b216ab4b4f
get_index() wasn't working with caching disabled
Timo Sirainen <tss@iki.fi>
parents:
2347
diff
changeset
|
489 { |
e6b216ab4b4f
get_index() wasn't working with caching disabled
Timo Sirainen <tss@iki.fi>
parents:
2347
diff
changeset
|
490 const uint8_t *match; |
3247
e7166e2f8b9b
Changed some buffers to arrays.
Timo Sirainen <tss@iki.fi>
parents:
3209
diff
changeset
|
491 unsigned int count; |
2355
e6b216ab4b4f
get_index() wasn't working with caching disabled
Timo Sirainen <tss@iki.fi>
parents:
2347
diff
changeset
|
492 |
3247
e7166e2f8b9b
Changed some buffers to arrays.
Timo Sirainen <tss@iki.fi>
parents:
3209
diff
changeset
|
493 match = array_get(&mail->header_match, &count); |
6840
efec8836586a
Don't cache all headers just because they're listed in cache file. First
Timo Sirainen <tss@iki.fi>
parents:
6838
diff
changeset
|
494 if (field_idx < count && HEADER_MATCH_USABLE(mail, match[field_idx])) |
efec8836586a
Don't cache all headers just because they're listed in cache file. First
Timo Sirainen <tss@iki.fi>
parents:
6838
diff
changeset
|
495 return (match[field_idx] & HEADER_MATCH_FLAG_FOUND) != 0; |
2355
e6b216ab4b4f
get_index() wasn't working with caching disabled
Timo Sirainen <tss@iki.fi>
parents:
2347
diff
changeset
|
496 return -1; |
e6b216ab4b4f
get_index() wasn't working with caching disabled
Timo Sirainen <tss@iki.fi>
parents:
2347
diff
changeset
|
497 } |
e6b216ab4b4f
get_index() wasn't working with caching disabled
Timo Sirainen <tss@iki.fi>
parents:
2347
diff
changeset
|
498 |
3863
55df57c028d4
Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents:
3525
diff
changeset
|
499 static bool skip_header(const unsigned char **data, size_t len) |
3288
1fae8494f8f7
mail_get_headers() and mail_get_first_header() returned headers with "name:"
Timo Sirainen <tss@iki.fi>
parents:
3278
diff
changeset
|
500 { |
1fae8494f8f7
mail_get_headers() and mail_get_first_header() returned headers with "name:"
Timo Sirainen <tss@iki.fi>
parents:
3278
diff
changeset
|
501 const unsigned char *p = *data; |
1fae8494f8f7
mail_get_headers() and mail_get_first_header() returned headers with "name:"
Timo Sirainen <tss@iki.fi>
parents:
3278
diff
changeset
|
502 size_t i; |
1fae8494f8f7
mail_get_headers() and mail_get_first_header() returned headers with "name:"
Timo Sirainen <tss@iki.fi>
parents:
3278
diff
changeset
|
503 |
1fae8494f8f7
mail_get_headers() and mail_get_first_header() returned headers with "name:"
Timo Sirainen <tss@iki.fi>
parents:
3278
diff
changeset
|
504 for (i = 0; i < len; i++) { |
1fae8494f8f7
mail_get_headers() and mail_get_first_header() returned headers with "name:"
Timo Sirainen <tss@iki.fi>
parents:
3278
diff
changeset
|
505 if (p[i] == ':') |
1fae8494f8f7
mail_get_headers() and mail_get_first_header() returned headers with "name:"
Timo Sirainen <tss@iki.fi>
parents:
3278
diff
changeset
|
506 break; |
1fae8494f8f7
mail_get_headers() and mail_get_first_header() returned headers with "name:"
Timo Sirainen <tss@iki.fi>
parents:
3278
diff
changeset
|
507 } |
1fae8494f8f7
mail_get_headers() and mail_get_first_header() returned headers with "name:"
Timo Sirainen <tss@iki.fi>
parents:
3278
diff
changeset
|
508 if (i == len) |
1fae8494f8f7
mail_get_headers() and mail_get_first_header() returned headers with "name:"
Timo Sirainen <tss@iki.fi>
parents:
3278
diff
changeset
|
509 return FALSE; |
1fae8494f8f7
mail_get_headers() and mail_get_first_header() returned headers with "name:"
Timo Sirainen <tss@iki.fi>
parents:
3278
diff
changeset
|
510 |
1fae8494f8f7
mail_get_headers() and mail_get_first_header() returned headers with "name:"
Timo Sirainen <tss@iki.fi>
parents:
3278
diff
changeset
|
511 for (i++; i < len; i++) { |
1fae8494f8f7
mail_get_headers() and mail_get_first_header() returned headers with "name:"
Timo Sirainen <tss@iki.fi>
parents:
3278
diff
changeset
|
512 if (!IS_LWSP(p[i])) |
1fae8494f8f7
mail_get_headers() and mail_get_first_header() returned headers with "name:"
Timo Sirainen <tss@iki.fi>
parents:
3278
diff
changeset
|
513 break; |
1fae8494f8f7
mail_get_headers() and mail_get_first_header() returned headers with "name:"
Timo Sirainen <tss@iki.fi>
parents:
3278
diff
changeset
|
514 } |
1fae8494f8f7
mail_get_headers() and mail_get_first_header() returned headers with "name:"
Timo Sirainen <tss@iki.fi>
parents:
3278
diff
changeset
|
515 |
1fae8494f8f7
mail_get_headers() and mail_get_first_header() returned headers with "name:"
Timo Sirainen <tss@iki.fi>
parents:
3278
diff
changeset
|
516 *data = p + i; |
1fae8494f8f7
mail_get_headers() and mail_get_first_header() returned headers with "name:"
Timo Sirainen <tss@iki.fi>
parents:
3278
diff
changeset
|
517 return TRUE; |
1fae8494f8f7
mail_get_headers() and mail_get_first_header() returned headers with "name:"
Timo Sirainen <tss@iki.fi>
parents:
3278
diff
changeset
|
518 } |
1fae8494f8f7
mail_get_headers() and mail_get_first_header() returned headers with "name:"
Timo Sirainen <tss@iki.fi>
parents:
3278
diff
changeset
|
519 |
3248
ff47e78ad717
Renamed mail_get_header() to mail_get_first_header() and mail_gets_headers()
Timo Sirainen <tss@iki.fi>
parents:
3247
diff
changeset
|
520 static const char *const * |
2355
e6b216ab4b4f
get_index() wasn't working with caching disabled
Timo Sirainen <tss@iki.fi>
parents:
2347
diff
changeset
|
521 index_mail_get_parsed_header(struct index_mail *mail, unsigned int field_idx) |
e6b216ab4b4f
get_index() wasn't working with caching disabled
Timo Sirainen <tss@iki.fi>
parents:
2347
diff
changeset
|
522 { |
4451
1a35d53c18fc
Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents:
4418
diff
changeset
|
523 ARRAY_DEFINE(header_values, const char *); |
3248
ff47e78ad717
Renamed mail_get_header() to mail_get_first_header() and mail_gets_headers()
Timo Sirainen <tss@iki.fi>
parents:
3247
diff
changeset
|
524 const struct index_mail_line *lines; |
3288
1fae8494f8f7
mail_get_headers() and mail_get_first_header() returned headers with "name:"
Timo Sirainen <tss@iki.fi>
parents:
3278
diff
changeset
|
525 const unsigned char *header, *value_start, *value_end; |
3248
ff47e78ad717
Renamed mail_get_header() to mail_get_first_header() and mail_gets_headers()
Timo Sirainen <tss@iki.fi>
parents:
3247
diff
changeset
|
526 const unsigned int *line_idx; |
ff47e78ad717
Renamed mail_get_header() to mail_get_first_header() and mail_gets_headers()
Timo Sirainen <tss@iki.fi>
parents:
3247
diff
changeset
|
527 const char *value; |
ff47e78ad717
Renamed mail_get_header() to mail_get_first_header() and mail_gets_headers()
Timo Sirainen <tss@iki.fi>
parents:
3247
diff
changeset
|
528 unsigned int i, lines_count, first_line_idx; |
ff47e78ad717
Renamed mail_get_header() to mail_get_first_header() and mail_gets_headers()
Timo Sirainen <tss@iki.fi>
parents:
3247
diff
changeset
|
529 |
ff47e78ad717
Renamed mail_get_header() to mail_get_first_header() and mail_gets_headers()
Timo Sirainen <tss@iki.fi>
parents:
3247
diff
changeset
|
530 line_idx = array_idx(&mail->header_match_lines, field_idx); |
ff47e78ad717
Renamed mail_get_header() to mail_get_first_header() and mail_gets_headers()
Timo Sirainen <tss@iki.fi>
parents:
3247
diff
changeset
|
531 i_assert(*line_idx != 0); |
ff47e78ad717
Renamed mail_get_header() to mail_get_first_header() and mail_gets_headers()
Timo Sirainen <tss@iki.fi>
parents:
3247
diff
changeset
|
532 first_line_idx = *line_idx - 1; |
ff47e78ad717
Renamed mail_get_header() to mail_get_first_header() and mail_gets_headers()
Timo Sirainen <tss@iki.fi>
parents:
3247
diff
changeset
|
533 |
4596
bf4e98a0de3f
Replaced ARRAY_CREATE() macro with [ipt]_array_init() macros. The macro
Timo Sirainen <tss@iki.fi>
parents:
4594
diff
changeset
|
534 p_array_init(&header_values, mail->data_pool, 4); |
3248
ff47e78ad717
Renamed mail_get_header() to mail_get_first_header() and mail_gets_headers()
Timo Sirainen <tss@iki.fi>
parents:
3247
diff
changeset
|
535 header = buffer_get_data(mail->header_data, NULL); |
2355
e6b216ab4b4f
get_index() wasn't working with caching disabled
Timo Sirainen <tss@iki.fi>
parents:
2347
diff
changeset
|
536 |
3248
ff47e78ad717
Renamed mail_get_header() to mail_get_first_header() and mail_gets_headers()
Timo Sirainen <tss@iki.fi>
parents:
3247
diff
changeset
|
537 lines = array_get(&mail->header_lines, &lines_count); |
ff47e78ad717
Renamed mail_get_header() to mail_get_first_header() and mail_gets_headers()
Timo Sirainen <tss@iki.fi>
parents:
3247
diff
changeset
|
538 for (i = first_line_idx; i < lines_count; i++) { |
ff47e78ad717
Renamed mail_get_header() to mail_get_first_header() and mail_gets_headers()
Timo Sirainen <tss@iki.fi>
parents:
3247
diff
changeset
|
539 if (lines[i].field_idx != lines[first_line_idx].field_idx) |
ff47e78ad717
Renamed mail_get_header() to mail_get_first_header() and mail_gets_headers()
Timo Sirainen <tss@iki.fi>
parents:
3247
diff
changeset
|
540 break; |
2355
e6b216ab4b4f
get_index() wasn't working with caching disabled
Timo Sirainen <tss@iki.fi>
parents:
2347
diff
changeset
|
541 |
3288
1fae8494f8f7
mail_get_headers() and mail_get_first_header() returned headers with "name:"
Timo Sirainen <tss@iki.fi>
parents:
3278
diff
changeset
|
542 /* skip header: and drop ending LF */ |
1fae8494f8f7
mail_get_headers() and mail_get_first_header() returned headers with "name:"
Timo Sirainen <tss@iki.fi>
parents:
3278
diff
changeset
|
543 value_start = header + lines[i].start_pos; |
1fae8494f8f7
mail_get_headers() and mail_get_first_header() returned headers with "name:"
Timo Sirainen <tss@iki.fi>
parents:
3278
diff
changeset
|
544 value_end = header + lines[i].end_pos; |
1fae8494f8f7
mail_get_headers() and mail_get_first_header() returned headers with "name:"
Timo Sirainen <tss@iki.fi>
parents:
3278
diff
changeset
|
545 if (skip_header(&value_start, value_end - value_start)) { |
1fae8494f8f7
mail_get_headers() and mail_get_first_header() returned headers with "name:"
Timo Sirainen <tss@iki.fi>
parents:
3278
diff
changeset
|
546 if (value_start != value_end && value_end[-1] == '\n') |
1fae8494f8f7
mail_get_headers() and mail_get_first_header() returned headers with "name:"
Timo Sirainen <tss@iki.fi>
parents:
3278
diff
changeset
|
547 value_end--; |
1fae8494f8f7
mail_get_headers() and mail_get_first_header() returned headers with "name:"
Timo Sirainen <tss@iki.fi>
parents:
3278
diff
changeset
|
548 value = p_strndup(mail->data_pool, value_start, |
1fae8494f8f7
mail_get_headers() and mail_get_first_header() returned headers with "name:"
Timo Sirainen <tss@iki.fi>
parents:
3278
diff
changeset
|
549 value_end - value_start); |
1fae8494f8f7
mail_get_headers() and mail_get_first_header() returned headers with "name:"
Timo Sirainen <tss@iki.fi>
parents:
3278
diff
changeset
|
550 array_append(&header_values, &value, 1); |
1fae8494f8f7
mail_get_headers() and mail_get_first_header() returned headers with "name:"
Timo Sirainen <tss@iki.fi>
parents:
3278
diff
changeset
|
551 } |
3248
ff47e78ad717
Renamed mail_get_header() to mail_get_first_header() and mail_gets_headers()
Timo Sirainen <tss@iki.fi>
parents:
3247
diff
changeset
|
552 } |
ff47e78ad717
Renamed mail_get_header() to mail_get_first_header() and mail_gets_headers()
Timo Sirainen <tss@iki.fi>
parents:
3247
diff
changeset
|
553 |
6838
e726f298d87e
mail_get_headers() returned bad data when headers were already cached.
Timo Sirainen <tss@iki.fi>
parents:
6526
diff
changeset
|
554 (void)array_append_space(&header_values); |
3248
ff47e78ad717
Renamed mail_get_header() to mail_get_first_header() and mail_gets_headers()
Timo Sirainen <tss@iki.fi>
parents:
3247
diff
changeset
|
555 return array_idx(&header_values, 0); |
2355
e6b216ab4b4f
get_index() wasn't working with caching disabled
Timo Sirainen <tss@iki.fi>
parents:
2347
diff
changeset
|
556 } |
e6b216ab4b4f
get_index() wasn't working with caching disabled
Timo Sirainen <tss@iki.fi>
parents:
2347
diff
changeset
|
557 |
6280
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
558 static int |
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
559 index_mail_get_raw_headers(struct index_mail *mail, const char *field, |
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
560 const char *const **value_r) |
1687
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
561 { |
3248
ff47e78ad717
Renamed mail_get_header() to mail_get_first_header() and mail_gets_headers()
Timo Sirainen <tss@iki.fi>
parents:
3247
diff
changeset
|
562 const char *headers[2], *value; |
2336 | 563 struct mailbox_header_lookup_ctx *headers_ctx; |
3248
ff47e78ad717
Renamed mail_get_header() to mail_get_first_header() and mail_gets_headers()
Timo Sirainen <tss@iki.fi>
parents:
3247
diff
changeset
|
564 unsigned char *data; |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
565 unsigned int field_idx; |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
566 string_t *dest; |
2355
e6b216ab4b4f
get_index() wasn't working with caching disabled
Timo Sirainen <tss@iki.fi>
parents:
2347
diff
changeset
|
567 size_t i, len; |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
568 int ret; |
4451
1a35d53c18fc
Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents:
4418
diff
changeset
|
569 ARRAY_DEFINE(header_values, const char *); |
1687
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
570 |
3301
dd19f2e8575f
Don't even try to allow searching zero number of headers.
Timo Sirainen <tss@iki.fi>
parents:
3297
diff
changeset
|
571 i_assert(field != NULL); |
dd19f2e8575f
Don't even try to allow searching zero number of headers.
Timo Sirainen <tss@iki.fi>
parents:
3297
diff
changeset
|
572 |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
573 field_idx = get_header_field_idx(mail->ibox, field); |
1687
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
574 |
3209
923ff19873d4
Major mail-storage API changes. It's now a bit cleaner and much more plugin
Timo Sirainen <tss@iki.fi>
parents:
3045
diff
changeset
|
575 dest = str_new(mail->data_pool, 128); |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
576 if (mail_cache_lookup_headers(mail->trans->cache_view, dest, |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
577 mail->data.seq, &field_idx, 1) <= 0) { |
2355
e6b216ab4b4f
get_index() wasn't working with caching disabled
Timo Sirainen <tss@iki.fi>
parents:
2347
diff
changeset
|
578 /* not in cache / error - first see if it's already parsed */ |
3209
923ff19873d4
Major mail-storage API changes. It's now a bit cleaner and much more plugin
Timo Sirainen <tss@iki.fi>
parents:
3045
diff
changeset
|
579 p_free(mail->data_pool, dest); |
6445
4d33a6959d32
Don't assert-crash if looking up a non-parsed header after headers were
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
580 |
4d33a6959d32
Don't assert-crash if looking up a non-parsed header after headers were
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
581 if (mail->header_seq != mail->data.seq || |
4d33a6959d32
Don't assert-crash if looking up a non-parsed header after headers were
Timo Sirainen <tss@iki.fi>
parents:
6429
diff
changeset
|
582 index_mail_header_is_parsed(mail, field_idx) < 0) { |
6280
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
583 /* parse */ |
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
584 headers[0] = field; headers[1] = NULL; |
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
585 headers_ctx = mailbox_header_lookup_init( |
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
586 &mail->ibox->box, headers); |
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
587 ret = index_mail_parse_headers(mail, headers_ctx); |
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
588 mailbox_header_lookup_deinit(&headers_ctx); |
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
589 if (ret < 0) |
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
590 return -1; |
2355
e6b216ab4b4f
get_index() wasn't working with caching disabled
Timo Sirainen <tss@iki.fi>
parents:
2347
diff
changeset
|
591 } |
e6b216ab4b4f
get_index() wasn't working with caching disabled
Timo Sirainen <tss@iki.fi>
parents:
2347
diff
changeset
|
592 |
6280
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
593 if ((ret = index_mail_header_is_parsed(mail, field_idx)) <= 0) { |
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
594 /* not found */ |
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
595 i_assert(ret != -1); |
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
596 *value_r = p_new(mail->data_pool, const char *, 1); |
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
597 return 0; |
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
598 } |
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
599 *value_r = index_mail_get_parsed_header(mail, field_idx); |
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
600 return 0; |
1771
63254344ea0e
get_header() returned only first line of multiline headers
Timo Sirainen <tss@iki.fi>
parents:
1770
diff
changeset
|
601 } |
4451
1a35d53c18fc
Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents:
4418
diff
changeset
|
602 data = buffer_get_modifiable_data(dest, &len); |
1771
63254344ea0e
get_header() returned only first line of multiline headers
Timo Sirainen <tss@iki.fi>
parents:
1770
diff
changeset
|
603 |
3248
ff47e78ad717
Renamed mail_get_header() to mail_get_first_header() and mail_gets_headers()
Timo Sirainen <tss@iki.fi>
parents:
3247
diff
changeset
|
604 if (len == 0) { |
3045
ccfd78cc07cc
mail->get_header() was pretty broken. This affected SORT/THREAD.
Timo Sirainen <tss@iki.fi>
parents:
2708
diff
changeset
|
605 /* cached as non-existing. */ |
6280
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
606 *value_r = p_new(mail->data_pool, const char *, 1); |
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
607 return 0; |
3045
ccfd78cc07cc
mail->get_header() was pretty broken. This affected SORT/THREAD.
Timo Sirainen <tss@iki.fi>
parents:
2708
diff
changeset
|
608 } |
ccfd78cc07cc
mail->get_header() was pretty broken. This affected SORT/THREAD.
Timo Sirainen <tss@iki.fi>
parents:
2708
diff
changeset
|
609 |
4596
bf4e98a0de3f
Replaced ARRAY_CREATE() macro with [ipt]_array_init() macros. The macro
Timo Sirainen <tss@iki.fi>
parents:
4594
diff
changeset
|
610 p_array_init(&header_values, mail->data_pool, 4); |
3248
ff47e78ad717
Renamed mail_get_header() to mail_get_first_header() and mail_gets_headers()
Timo Sirainen <tss@iki.fi>
parents:
3247
diff
changeset
|
611 |
ff47e78ad717
Renamed mail_get_header() to mail_get_first_header() and mail_gets_headers()
Timo Sirainen <tss@iki.fi>
parents:
3247
diff
changeset
|
612 /* cached. skip "header name: " parts in dest. */ |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
613 for (i = 0; i < len; i++) { |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
614 if (data[i] == ':') { |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
615 if (i+1 != len && data[++i] == ' ') i++; |
3248
ff47e78ad717
Renamed mail_get_header() to mail_get_first_header() and mail_gets_headers()
Timo Sirainen <tss@iki.fi>
parents:
3247
diff
changeset
|
616 |
ff47e78ad717
Renamed mail_get_header() to mail_get_first_header() and mail_gets_headers()
Timo Sirainen <tss@iki.fi>
parents:
3247
diff
changeset
|
617 /* @UNSAFE */ |
ff47e78ad717
Renamed mail_get_header() to mail_get_first_header() and mail_gets_headers()
Timo Sirainen <tss@iki.fi>
parents:
3247
diff
changeset
|
618 len = get_header_size(dest, i); |
ff47e78ad717
Renamed mail_get_header() to mail_get_first_header() and mail_gets_headers()
Timo Sirainen <tss@iki.fi>
parents:
3247
diff
changeset
|
619 data[i + len] = '\0'; |
ff47e78ad717
Renamed mail_get_header() to mail_get_first_header() and mail_gets_headers()
Timo Sirainen <tss@iki.fi>
parents:
3247
diff
changeset
|
620 value = (const char *)data + i; |
ff47e78ad717
Renamed mail_get_header() to mail_get_first_header() and mail_gets_headers()
Timo Sirainen <tss@iki.fi>
parents:
3247
diff
changeset
|
621 i += len + 1; |
ff47e78ad717
Renamed mail_get_header() to mail_get_first_header() and mail_gets_headers()
Timo Sirainen <tss@iki.fi>
parents:
3247
diff
changeset
|
622 |
6838
e726f298d87e
mail_get_headers() returned bad data when headers were already cached.
Timo Sirainen <tss@iki.fi>
parents:
6526
diff
changeset
|
623 array_append(&header_values, &value, 1); |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
624 } |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
625 } |
1687
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
626 |
6838
e726f298d87e
mail_get_headers() returned bad data when headers were already cached.
Timo Sirainen <tss@iki.fi>
parents:
6526
diff
changeset
|
627 (void)array_append_space(&header_values); |
6280
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
628 *value_r = array_idx(&header_values, 0); |
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
629 return 0; |
3248
ff47e78ad717
Renamed mail_get_header() to mail_get_first_header() and mail_gets_headers()
Timo Sirainen <tss@iki.fi>
parents:
3247
diff
changeset
|
630 } |
ff47e78ad717
Renamed mail_get_header() to mail_get_first_header() and mail_gets_headers()
Timo Sirainen <tss@iki.fi>
parents:
3247
diff
changeset
|
631 |
6120
00d1a94a94c6
Added mail_get_first_header_utf8() and mail_get_headers_utf8().
Timo Sirainen <tss@iki.fi>
parents:
6083
diff
changeset
|
632 static const char *const * |
00d1a94a94c6
Added mail_get_first_header_utf8() and mail_get_headers_utf8().
Timo Sirainen <tss@iki.fi>
parents:
6083
diff
changeset
|
633 index_mail_headers_decode(struct index_mail *mail, const char *const *list, |
00d1a94a94c6
Added mail_get_first_header_utf8() and mail_get_headers_utf8().
Timo Sirainen <tss@iki.fi>
parents:
6083
diff
changeset
|
634 unsigned int max_count) |
3248
ff47e78ad717
Renamed mail_get_header() to mail_get_first_header() and mail_gets_headers()
Timo Sirainen <tss@iki.fi>
parents:
3247
diff
changeset
|
635 { |
6120
00d1a94a94c6
Added mail_get_first_header_utf8() and mail_get_headers_utf8().
Timo Sirainen <tss@iki.fi>
parents:
6083
diff
changeset
|
636 const char **decoded_list; |
00d1a94a94c6
Added mail_get_first_header_utf8() and mail_get_headers_utf8().
Timo Sirainen <tss@iki.fi>
parents:
6083
diff
changeset
|
637 unsigned int i, count; |
00d1a94a94c6
Added mail_get_first_header_utf8() and mail_get_headers_utf8().
Timo Sirainen <tss@iki.fi>
parents:
6083
diff
changeset
|
638 buffer_t *buf; |
00d1a94a94c6
Added mail_get_first_header_utf8() and mail_get_headers_utf8().
Timo Sirainen <tss@iki.fi>
parents:
6083
diff
changeset
|
639 |
6424
687efa138e77
Renamed strarray_length/remote() to str_array_length/remove()
Timo Sirainen <tss@iki.fi>
parents:
6423
diff
changeset
|
640 count = str_array_length(list); |
6120
00d1a94a94c6
Added mail_get_first_header_utf8() and mail_get_headers_utf8().
Timo Sirainen <tss@iki.fi>
parents:
6083
diff
changeset
|
641 if (count > max_count) |
00d1a94a94c6
Added mail_get_first_header_utf8() and mail_get_headers_utf8().
Timo Sirainen <tss@iki.fi>
parents:
6083
diff
changeset
|
642 count = max_count; |
00d1a94a94c6
Added mail_get_first_header_utf8() and mail_get_headers_utf8().
Timo Sirainen <tss@iki.fi>
parents:
6083
diff
changeset
|
643 decoded_list = p_new(mail->data_pool, const char *, count + 1); |
00d1a94a94c6
Added mail_get_first_header_utf8() and mail_get_headers_utf8().
Timo Sirainen <tss@iki.fi>
parents:
6083
diff
changeset
|
644 |
00d1a94a94c6
Added mail_get_first_header_utf8() and mail_get_headers_utf8().
Timo Sirainen <tss@iki.fi>
parents:
6083
diff
changeset
|
645 t_push(); |
00d1a94a94c6
Added mail_get_first_header_utf8() and mail_get_headers_utf8().
Timo Sirainen <tss@iki.fi>
parents:
6083
diff
changeset
|
646 buf = buffer_create_dynamic(pool_datastack_create(), 512); |
00d1a94a94c6
Added mail_get_first_header_utf8() and mail_get_headers_utf8().
Timo Sirainen <tss@iki.fi>
parents:
6083
diff
changeset
|
647 |
00d1a94a94c6
Added mail_get_first_header_utf8() and mail_get_headers_utf8().
Timo Sirainen <tss@iki.fi>
parents:
6083
diff
changeset
|
648 for (i = 0; i < count; i++) { |
00d1a94a94c6
Added mail_get_first_header_utf8() and mail_get_headers_utf8().
Timo Sirainen <tss@iki.fi>
parents:
6083
diff
changeset
|
649 buffer_set_used_size(buf, 0); |
00d1a94a94c6
Added mail_get_first_header_utf8() and mail_get_headers_utf8().
Timo Sirainen <tss@iki.fi>
parents:
6083
diff
changeset
|
650 if (!message_header_decode_utf8((const unsigned char *)list[i], |
00d1a94a94c6
Added mail_get_first_header_utf8() and mail_get_headers_utf8().
Timo Sirainen <tss@iki.fi>
parents:
6083
diff
changeset
|
651 strlen(list[i]), buf, FALSE)) |
00d1a94a94c6
Added mail_get_first_header_utf8() and mail_get_headers_utf8().
Timo Sirainen <tss@iki.fi>
parents:
6083
diff
changeset
|
652 decoded_list[i] = list[i]; |
00d1a94a94c6
Added mail_get_first_header_utf8() and mail_get_headers_utf8().
Timo Sirainen <tss@iki.fi>
parents:
6083
diff
changeset
|
653 else { |
00d1a94a94c6
Added mail_get_first_header_utf8() and mail_get_headers_utf8().
Timo Sirainen <tss@iki.fi>
parents:
6083
diff
changeset
|
654 decoded_list[i] = p_strndup(mail->data_pool, |
00d1a94a94c6
Added mail_get_first_header_utf8() and mail_get_headers_utf8().
Timo Sirainen <tss@iki.fi>
parents:
6083
diff
changeset
|
655 buf->data, buf->used); |
00d1a94a94c6
Added mail_get_first_header_utf8() and mail_get_headers_utf8().
Timo Sirainen <tss@iki.fi>
parents:
6083
diff
changeset
|
656 } |
00d1a94a94c6
Added mail_get_first_header_utf8() and mail_get_headers_utf8().
Timo Sirainen <tss@iki.fi>
parents:
6083
diff
changeset
|
657 } |
00d1a94a94c6
Added mail_get_first_header_utf8() and mail_get_headers_utf8().
Timo Sirainen <tss@iki.fi>
parents:
6083
diff
changeset
|
658 t_pop(); |
00d1a94a94c6
Added mail_get_first_header_utf8() and mail_get_headers_utf8().
Timo Sirainen <tss@iki.fi>
parents:
6083
diff
changeset
|
659 return decoded_list; |
00d1a94a94c6
Added mail_get_first_header_utf8() and mail_get_headers_utf8().
Timo Sirainen <tss@iki.fi>
parents:
6083
diff
changeset
|
660 } |
3248
ff47e78ad717
Renamed mail_get_header() to mail_get_first_header() and mail_gets_headers()
Timo Sirainen <tss@iki.fi>
parents:
3247
diff
changeset
|
661 |
6280
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
662 int index_mail_get_headers(struct mail *_mail, const char *field, |
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
663 bool decode_to_utf8, const char *const **value_r) |
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
664 { |
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
665 struct index_mail *mail = (struct index_mail *)_mail; |
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
666 |
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
667 if (index_mail_get_raw_headers(mail, field, value_r) < 0) |
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
668 return -1; |
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
669 if (!decode_to_utf8 || **value_r == NULL) |
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
670 return 0; |
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
671 |
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
672 *value_r = index_mail_headers_decode(mail, *value_r, (unsigned int)-1); |
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
673 return 0; |
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
674 } |
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
675 |
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
676 int index_mail_get_first_header(struct mail *_mail, const char *field, |
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
677 bool decode_to_utf8, const char **value_r) |
6120
00d1a94a94c6
Added mail_get_first_header_utf8() and mail_get_headers_utf8().
Timo Sirainen <tss@iki.fi>
parents:
6083
diff
changeset
|
678 { |
00d1a94a94c6
Added mail_get_first_header_utf8() and mail_get_headers_utf8().
Timo Sirainen <tss@iki.fi>
parents:
6083
diff
changeset
|
679 struct index_mail *mail = (struct index_mail *)_mail; |
00d1a94a94c6
Added mail_get_first_header_utf8() and mail_get_headers_utf8().
Timo Sirainen <tss@iki.fi>
parents:
6083
diff
changeset
|
680 const char *const *list; |
00d1a94a94c6
Added mail_get_first_header_utf8() and mail_get_headers_utf8().
Timo Sirainen <tss@iki.fi>
parents:
6083
diff
changeset
|
681 |
6280
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
682 if (index_mail_get_raw_headers(mail, field, &list) < 0) |
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
683 return -1; |
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
684 if (decode_to_utf8 && list[0] != NULL) |
6120
00d1a94a94c6
Added mail_get_first_header_utf8() and mail_get_headers_utf8().
Timo Sirainen <tss@iki.fi>
parents:
6083
diff
changeset
|
685 list = index_mail_headers_decode(mail, list, 1); |
6280
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
686 *value_r = list[0]; |
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
687 return list[0] != NULL ? 1 : 0; |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
688 } |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
689 |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
690 static void header_cache_callback(struct message_header_line *hdr, |
4907
5b4c9b20eba0
Replaced void *context from a lot of callbacks with the actual context
Timo Sirainen <tss@iki.fi>
parents:
4657
diff
changeset
|
691 bool *matched, struct index_mail *mail) |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
692 { |
2451
f6fef42f01b9
Changed istream-header-filter API a bit. Added HIDE_BODY option. Fixed
Timo Sirainen <tss@iki.fi>
parents:
2436
diff
changeset
|
693 if (hdr != NULL && hdr->eoh) |
f6fef42f01b9
Changed istream-header-filter API a bit. Added HIDE_BODY option. Fixed
Timo Sirainen <tss@iki.fi>
parents:
2436
diff
changeset
|
694 *matched = FALSE; |
f6fef42f01b9
Changed istream-header-filter API a bit. Added HIDE_BODY option. Fixed
Timo Sirainen <tss@iki.fi>
parents:
2436
diff
changeset
|
695 |
3463
693baa083a79
Mark *all* non-found headers that are registered in cache file as non-found
Timo Sirainen <tss@iki.fi>
parents:
3458
diff
changeset
|
696 index_mail_parse_header(NULL, hdr, mail); |
1687
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
697 } |
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
698 |
6280
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
699 int index_mail_get_header_stream(struct mail *_mail, |
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
700 struct mailbox_header_lookup_ctx *_headers, |
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
701 struct istream **stream_r) |
1687
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
702 { |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
703 struct index_mail *mail = (struct index_mail *)_mail; |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
704 struct index_header_lookup_ctx *headers = |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
705 (struct index_header_lookup_ctx *)_headers; |
6280
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
706 struct istream *input; |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
707 string_t *dest; |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
708 |
2509
146591955618
Fixed crash if mail data was fetched in specific order. Plus some minor
Timo Sirainen <tss@iki.fi>
parents:
2451
diff
changeset
|
709 if (mail->data.save_bodystructure_header) { |
146591955618
Fixed crash if mail data was fetched in specific order. Plus some minor
Timo Sirainen <tss@iki.fi>
parents:
2451
diff
changeset
|
710 /* we have to parse the header. */ |
146591955618
Fixed crash if mail data was fetched in specific order. Plus some minor
Timo Sirainen <tss@iki.fi>
parents:
2451
diff
changeset
|
711 if (index_mail_parse_headers(mail, _headers) < 0) |
6280
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
712 return -1; |
2509
146591955618
Fixed crash if mail data was fetched in specific order. Plus some minor
Timo Sirainen <tss@iki.fi>
parents:
2451
diff
changeset
|
713 } |
146591955618
Fixed crash if mail data was fetched in specific order. Plus some minor
Timo Sirainen <tss@iki.fi>
parents:
2451
diff
changeset
|
714 |
3209
923ff19873d4
Major mail-storage API changes. It's now a bit cleaner and much more plugin
Timo Sirainen <tss@iki.fi>
parents:
3045
diff
changeset
|
715 dest = str_new(mail->data_pool, 256); |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
716 if (mail_cache_lookup_headers(mail->trans->cache_view, dest, |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
717 mail->data.seq, headers->idx, |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
718 headers->count) > 0) { |
4062
788f5caab763
Last memory leak fix actually started crashing.
Timo Sirainen <tss@iki.fi>
parents:
3909
diff
changeset
|
719 if (mail->data.filter_stream != NULL) |
4070
71b8faa84ec6
Added i_stream_destroy() and o_stream_destroy() and used them instead of
Timo Sirainen <tss@iki.fi>
parents:
4062
diff
changeset
|
720 i_stream_destroy(&mail->data.filter_stream); |
4062
788f5caab763
Last memory leak fix actually started crashing.
Timo Sirainen <tss@iki.fi>
parents:
3909
diff
changeset
|
721 mail->data.filter_stream = |
6142
6c0bfc35af03
Removed memory pool parameter from iostreams. Default pool was almost always
Timo Sirainen <tss@iki.fi>
parents:
6120
diff
changeset
|
722 i_stream_create_from_data(str_data(dest), |
4062
788f5caab763
Last memory leak fix actually started crashing.
Timo Sirainen <tss@iki.fi>
parents:
3909
diff
changeset
|
723 str_len(dest)); |
6280
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
724 *stream_r = mail->data.filter_stream; |
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
725 return 0; |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
726 } |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
727 /* not in cache / error */ |
3209
923ff19873d4
Major mail-storage API changes. It's now a bit cleaner and much more plugin
Timo Sirainen <tss@iki.fi>
parents:
3045
diff
changeset
|
728 p_free(mail->data_pool, dest); |
1687
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
729 |
6280
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
730 if (mail_get_stream(&mail->mail.mail, NULL, NULL, &input) < 0) |
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
731 return -1; |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
732 |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
733 if (mail->data.filter_stream != NULL) |
4070
71b8faa84ec6
Added i_stream_destroy() and o_stream_destroy() and used them instead of
Timo Sirainen <tss@iki.fi>
parents:
4062
diff
changeset
|
734 i_stream_destroy(&mail->data.filter_stream); |
1687
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
735 |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
736 index_mail_parse_header_init(mail, _headers); |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
737 mail->data.filter_stream = |
2451
f6fef42f01b9
Changed istream-header-filter API a bit. Added HIDE_BODY option. Fixed
Timo Sirainen <tss@iki.fi>
parents:
2436
diff
changeset
|
738 i_stream_create_header_filter(mail->data.stream, |
f6fef42f01b9
Changed istream-header-filter API a bit. Added HIDE_BODY option. Fixed
Timo Sirainen <tss@iki.fi>
parents:
2436
diff
changeset
|
739 HEADER_FILTER_INCLUDE | |
f6fef42f01b9
Changed istream-header-filter API a bit. Added HIDE_BODY option. Fixed
Timo Sirainen <tss@iki.fi>
parents:
2436
diff
changeset
|
740 HEADER_FILTER_HIDE_BODY, |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
741 headers->name, headers->count, |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
742 header_cache_callback, mail); |
6280
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
743 *stream_r = mail->data.filter_stream; |
eb7c9d8ece54
mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents:
6265
diff
changeset
|
744 return 0; |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
745 } |
1687
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
746 |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
747 struct mailbox_header_lookup_ctx * |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
748 index_header_lookup_init(struct mailbox *box, const char *const headers[]) |
1687
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
749 { |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
750 struct index_mailbox *ibox = (struct index_mailbox *)box; |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
751 struct mail_cache_field *fields, header_field = { |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
752 NULL, 0, MAIL_CACHE_FIELD_HEADER, 0, |
2339
406692edc12d
Cache fixes. Decisions are saved again.
Timo Sirainen <tss@iki.fi>
parents:
2336
diff
changeset
|
753 MAIL_CACHE_DECISION_TEMP |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
754 }; |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
755 struct index_header_lookup_ctx *ctx; |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
756 const char *const *name; |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
757 const char **sorted_headers; |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
758 pool_t pool; |
3278
df372eecc5d0
Several size_t -> unsigned int changes. Try to keep "unsigned int" for
Timo Sirainen <tss@iki.fi>
parents:
3248
diff
changeset
|
759 unsigned int i, count; |
1687
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
760 |
3301
dd19f2e8575f
Don't even try to allow searching zero number of headers.
Timo Sirainen <tss@iki.fi>
parents:
3297
diff
changeset
|
761 i_assert(*headers != NULL); |
dd19f2e8575f
Don't even try to allow searching zero number of headers.
Timo Sirainen <tss@iki.fi>
parents:
3297
diff
changeset
|
762 |
3278
df372eecc5d0
Several size_t -> unsigned int changes. Try to keep "unsigned int" for
Timo Sirainen <tss@iki.fi>
parents:
3248
diff
changeset
|
763 for (count = 0, name = headers; *name != NULL; name++) |
df372eecc5d0
Several size_t -> unsigned int changes. Try to keep "unsigned int" for
Timo Sirainen <tss@iki.fi>
parents:
3248
diff
changeset
|
764 count++; |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
765 |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
766 t_push(); |
1687
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
767 |
3301
dd19f2e8575f
Don't even try to allow searching zero number of headers.
Timo Sirainen <tss@iki.fi>
parents:
3297
diff
changeset
|
768 /* @UNSAFE: headers need to be sorted for filter stream. */ |
dd19f2e8575f
Don't even try to allow searching zero number of headers.
Timo Sirainen <tss@iki.fi>
parents:
3297
diff
changeset
|
769 sorted_headers = t_new(const char *, count); |
dd19f2e8575f
Don't even try to allow searching zero number of headers.
Timo Sirainen <tss@iki.fi>
parents:
3297
diff
changeset
|
770 memcpy(sorted_headers, headers, count * sizeof(*sorted_headers)); |
6423
13b0a3ba5f7b
Added i_ prefix to strcmp_p(), strcasecmp_p() and memcasecmp().
Timo Sirainen <tss@iki.fi>
parents:
6280
diff
changeset
|
771 qsort(sorted_headers, count, sizeof(*sorted_headers), i_strcasecmp_p); |
3301
dd19f2e8575f
Don't even try to allow searching zero number of headers.
Timo Sirainen <tss@iki.fi>
parents:
3297
diff
changeset
|
772 headers = sorted_headers; |
1687
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
773 |
3278
df372eecc5d0
Several size_t -> unsigned int changes. Try to keep "unsigned int" for
Timo Sirainen <tss@iki.fi>
parents:
3248
diff
changeset
|
774 /* @UNSAFE */ |
df372eecc5d0
Several size_t -> unsigned int changes. Try to keep "unsigned int" for
Timo Sirainen <tss@iki.fi>
parents:
3248
diff
changeset
|
775 fields = t_new(struct mail_cache_field, count); |
df372eecc5d0
Several size_t -> unsigned int changes. Try to keep "unsigned int" for
Timo Sirainen <tss@iki.fi>
parents:
3248
diff
changeset
|
776 for (i = 0; i < count; i++) { |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
777 header_field.name = t_strconcat("hdr.", headers[i], NULL); |
3278
df372eecc5d0
Several size_t -> unsigned int changes. Try to keep "unsigned int" for
Timo Sirainen <tss@iki.fi>
parents:
3248
diff
changeset
|
778 fields[i] = header_field; |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
779 } |
3278
df372eecc5d0
Several size_t -> unsigned int changes. Try to keep "unsigned int" for
Timo Sirainen <tss@iki.fi>
parents:
3248
diff
changeset
|
780 mail_cache_register_fields(ibox->cache, fields, count); |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
781 |
4585
26bbf71e9b5e
Grow index_header_lookup_ctx pool initial size.
Timo Sirainen <tss@iki.fi>
parents:
4518
diff
changeset
|
782 pool = pool_alloconly_create("index_header_lookup_ctx", 1024); |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
783 ctx = p_new(pool, struct index_header_lookup_ctx, 1); |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
784 ctx->ctx.box = box; |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
785 ctx->pool = pool; |
3278
df372eecc5d0
Several size_t -> unsigned int changes. Try to keep "unsigned int" for
Timo Sirainen <tss@iki.fi>
parents:
3248
diff
changeset
|
786 ctx->count = count; |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
787 |
3301
dd19f2e8575f
Don't even try to allow searching zero number of headers.
Timo Sirainen <tss@iki.fi>
parents:
3297
diff
changeset
|
788 ctx->idx = p_new(pool, unsigned int, count); |
dd19f2e8575f
Don't even try to allow searching zero number of headers.
Timo Sirainen <tss@iki.fi>
parents:
3297
diff
changeset
|
789 ctx->name = p_new(pool, const char *, count); |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
790 |
3301
dd19f2e8575f
Don't even try to allow searching zero number of headers.
Timo Sirainen <tss@iki.fi>
parents:
3297
diff
changeset
|
791 /* @UNSAFE */ |
dd19f2e8575f
Don't even try to allow searching zero number of headers.
Timo Sirainen <tss@iki.fi>
parents:
3297
diff
changeset
|
792 for (i = 0; i < count; i++) { |
dd19f2e8575f
Don't even try to allow searching zero number of headers.
Timo Sirainen <tss@iki.fi>
parents:
3297
diff
changeset
|
793 ctx->idx[i] = fields[i].idx; |
dd19f2e8575f
Don't even try to allow searching zero number of headers.
Timo Sirainen <tss@iki.fi>
parents:
3297
diff
changeset
|
794 ctx->name[i] = p_strdup(pool, headers[i]); |
1687
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
795 } |
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
796 |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
797 t_pop(); |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
798 return &ctx->ctx; |
1687
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
799 } |
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
800 |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
801 void index_header_lookup_deinit(struct mailbox_header_lookup_ctx *_ctx) |
1687
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
802 { |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
803 struct index_header_lookup_ctx *ctx = |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2300
diff
changeset
|
804 (struct index_header_lookup_ctx *)_ctx; |
1687
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
805 |
6428
7cad076906eb
pool_unref() now takes ** pointer.
Timo Sirainen <tss@iki.fi>
parents:
6424
diff
changeset
|
806 pool_unref(&ctx->pool); |
1687
f5181233b04e
Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
807 } |