annotate src/lib-storage/index/index-mail-headers.c @ 6980:d373913cd763 HEAD

Memory leak fixes
author Timo Sirainen <tss@iki.fi>
date Sun, 09 Dec 2007 16:08:25 +0200
parents 414c9d631a81
children 7ed926ed7aa4
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
4451
1a35d53c18fc Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents: 4418
diff changeset
55 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
56
7d02e2a7672d Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents: 2300
diff changeset
57 /* 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
58 line number */
3247
e7166e2f8b9b Changed some buffers to arrays.
Timo Sirainen <tss@iki.fi>
parents: 3209
diff changeset
59 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
60
3247
e7166e2f8b9b Changed some buffers to arrays.
Timo Sirainen <tss@iki.fi>
parents: 3209
diff changeset
61 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
62 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
63 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
64
3248
ff47e78ad717 Renamed mail_get_header() to mail_get_first_header() and mail_gets_headers()
Timo Sirainen <tss@iki.fi>
parents: 3247
diff changeset
65 /* go through all the header lines we found */
3247
e7166e2f8b9b Changed some buffers to arrays.
Timo Sirainen <tss@iki.fi>
parents: 3209
diff changeset
66 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
67 /* 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
68 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
69 while (match_idx < lines[i].field_idx &&
3247
e7166e2f8b9b Changed some buffers to arrays.
Timo Sirainen <tss@iki.fi>
parents: 3209
diff changeset
70 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
71 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
72 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
73 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
74 match_idx)) {
2327
7d02e2a7672d Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents: 2300
diff changeset
75 /* 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
76 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
77 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
78 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
79 NULL, 0);
2327
7d02e2a7672d Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents: 2300
diff changeset
80 }
7d02e2a7672d Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents: 2300
diff changeset
81 match_idx++;
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
3248
ff47e78ad717 Renamed mail_get_header() to mail_get_first_header() and mail_gets_headers()
Timo Sirainen <tss@iki.fi>
parents: 3247
diff changeset
84 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
85 /* 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
86 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
87 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
88 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
89 }
ff47e78ad717 Renamed mail_get_header() to mail_get_first_header() and mail_gets_headers()
Timo Sirainen <tss@iki.fi>
parents: 3247
diff changeset
90
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
91 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
92 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
93 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
94 /* header is already cached */
3525
8ac16ccc3c73 Fixed a hang if parsed header was already cached.
Timo Sirainen <tss@iki.fi>
parents: 3493
diff changeset
95 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
96 continue;
5ec00b12f4db Don't store headers into cache file if they are already there.
Timo Sirainen <tss@iki.fi>
parents: 3301
diff changeset
97 }
5ec00b12f4db Don't store headers into cache file if they are already there.
Timo Sirainen <tss@iki.fi>
parents: 3301
diff changeset
98
3248
ff47e78ad717 Renamed mail_get_header() to mail_get_first_header() and mail_gets_headers()
Timo Sirainen <tss@iki.fi>
parents: 3247
diff changeset
99 /* 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
100 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
101 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
102 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
103 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
104
7d02e2a7672d Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents: 2300
diff changeset
105 noncontiguous = FALSE;
3247
e7166e2f8b9b Changed some buffers to arrays.
Timo Sirainen <tss@iki.fi>
parents: 3209
diff changeset
106 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
107 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
108 break;
1687
f5181233b04e Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
109
2327
7d02e2a7672d Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents: 2300
diff changeset
110 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
111 noncontiguous = TRUE;
7d02e2a7672d Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents: 2300
diff changeset
112 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
113 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
114 }
3248
ff47e78ad717 Renamed mail_get_header() to mail_get_first_header() and mail_gets_headers()
Timo Sirainen <tss@iki.fi>
parents: 3247
diff changeset
115 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
116
2327
7d02e2a7672d Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents: 2300
diff changeset
117 if (noncontiguous) {
7d02e2a7672d Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents: 2300
diff changeset
118 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
119 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
120 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
121 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 }
2339
406692edc12d Cache fixes. Decisions are saved again.
Timo Sirainen <tss@iki.fi>
parents: 2336
diff changeset
123 i--;
2327
7d02e2a7672d Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents: 2300
diff changeset
124 } else {
7d02e2a7672d Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents: 2300
diff changeset
125 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
126 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
127 }
7d02e2a7672d Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents: 2300
diff changeset
128
7d02e2a7672d Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents: 2300
diff changeset
129 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
130 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
131 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
132 }
7d02e2a7672d Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents: 2300
diff changeset
133
3247
e7166e2f8b9b Changed some buffers to arrays.
Timo Sirainen <tss@iki.fi>
parents: 3209
diff changeset
134 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
135 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
136 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
137 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
138 match_idx)) {
2336
d4577ee85f0f header caching fixes
Timo Sirainen <tss@iki.fi>
parents: 2328
diff changeset
139 /* 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
140 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
141 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
142 index_mail_cache_add_idx(mail, match_idx, NULL, 0);
2336
d4577ee85f0f header caching fixes
Timo Sirainen <tss@iki.fi>
parents: 2328
diff changeset
143 }
d4577ee85f0f header caching fixes
Timo Sirainen <tss@iki.fi>
parents: 2328
diff changeset
144 }
2327
7d02e2a7672d Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents: 2300
diff changeset
145 }
1687
f5181233b04e Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
146
3458
0c264f105899 Try to be a bit smarter about when to parse header/body.
Timo Sirainen <tss@iki.fi>
parents: 3456
diff changeset
147 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
148 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
149 {
0c264f105899 Try to be a bit smarter about when to parse header/body.
Timo Sirainen <tss@iki.fi>
parents: 3456
diff changeset
150 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
151 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
152 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
153 };
0c264f105899 Try to be a bit smarter about when to parse header/body.
Timo Sirainen <tss@iki.fi>
parents: 3456
diff changeset
154
6940
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6842
diff changeset
155 T_FRAME(
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6842
diff changeset
156 header_field.name = t_strconcat("hdr.", field, NULL);
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6842
diff changeset
157 mail_cache_register_fields(ibox->cache, &header_field, 1);
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6842
diff changeset
158 );
3458
0c264f105899 Try to be a bit smarter about when to parse header/body.
Timo Sirainen <tss@iki.fi>
parents: 3456
diff changeset
159 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
160 }
0c264f105899 Try to be a bit smarter about when to parse header/body.
Timo Sirainen <tss@iki.fi>
parents: 3456
diff changeset
161
5516
96f0b56489a2 Don't feed index_mail_parser headers while searching message bodies, unless
Timo Sirainen <tss@iki.fi>
parents: 5506
diff changeset
162 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
163 {
6842
d2c8269a0679 Cleanups/rewrites to how/when date/size caching is done.
Timo Sirainen <tss@iki.fi>
parents: 6840
diff changeset
164 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
165 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
166 return TRUE;
d2c8269a0679 Cleanups/rewrites to how/when date/size caching is done.
Timo Sirainen <tss@iki.fi>
parents: 6840
diff changeset
167
d2c8269a0679 Cleanups/rewrites to how/when date/size caching is done.
Timo Sirainen <tss@iki.fi>
parents: 6840
diff changeset
168 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
169 !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
170 return TRUE;
d2c8269a0679 Cleanups/rewrites to how/when date/size caching is done.
Timo Sirainen <tss@iki.fi>
parents: 6840
diff changeset
171 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
172 }
96f0b56489a2 Don't feed index_mail_parser headers while searching message bodies, unless
Timo Sirainen <tss@iki.fi>
parents: 5506
diff changeset
173
6940
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6842
diff changeset
174 static void index_mail_parse_header_register_all_wanted(struct index_mail *mail)
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6842
diff changeset
175 {
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6842
diff changeset
176 const struct mail_cache_field *all_cache_fields;
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6842
diff changeset
177 unsigned int i, count;
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6842
diff changeset
178
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6842
diff changeset
179 all_cache_fields =
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6842
diff changeset
180 mail_cache_register_get_list(mail->ibox->cache,
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6842
diff changeset
181 pool_datastack_create(), &count);
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6842
diff changeset
182 for (i = 0; i < count; i++) {
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6842
diff changeset
183 if (strncasecmp(all_cache_fields[i].name, "hdr.", 4) != 0)
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6842
diff changeset
184 continue;
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6842
diff changeset
185 if (!mail_cache_field_want_add(mail->trans->cache_trans,
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6842
diff changeset
186 mail->data.seq, i))
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6842
diff changeset
187 continue;
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6842
diff changeset
188
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6842
diff changeset
189 array_idx_set(&mail->header_match, all_cache_fields[i].idx,
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6842
diff changeset
190 &mail->header_match_value);
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6842
diff changeset
191 }
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6842
diff changeset
192 }
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6842
diff changeset
193
2327
7d02e2a7672d Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents: 2300
diff changeset
194 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
195 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
196 {
7d02e2a7672d Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents: 2300
diff changeset
197 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
198 (struct index_header_lookup_ctx *)_headers;
6940
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6842
diff changeset
199 unsigned int i;
2327
7d02e2a7672d Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents: 2300
diff changeset
200
2355
e6b216ab4b4f get_index() wasn't working with caching disabled
Timo Sirainen <tss@iki.fi>
parents: 2347
diff changeset
201 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
202 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
203 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
204 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
205 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
206 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
207 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
208 } else {
7d02e2a7672d Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents: 2300
diff changeset
209 buffer_set_used_size(mail->header_data, 0);
3247
e7166e2f8b9b Changed some buffers to arrays.
Timo Sirainen <tss@iki.fi>
parents: 3209
diff changeset
210 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
211 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
212
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
213 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
214 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
215 (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
216 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
217 /* 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
218 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
219 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
220 }
2327
7d02e2a7672d Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents: 2300
diff changeset
221 }
7d02e2a7672d Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents: 2300
diff changeset
222
7d02e2a7672d Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents: 2300
diff changeset
223 if (headers != NULL) {
7d02e2a7672d Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents: 2300
diff changeset
224 for (i = 0; i < headers->count; i++) {
3247
e7166e2f8b9b Changed some buffers to arrays.
Timo Sirainen <tss@iki.fi>
parents: 3209
diff changeset
225 array_idx_set(&mail->header_match, headers->idx[i],
e7166e2f8b9b Changed some buffers to arrays.
Timo Sirainen <tss@iki.fi>
parents: 3209
diff changeset
226 &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
227 }
f5181233b04e Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
228 }
f5181233b04e Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
229
2327
7d02e2a7672d Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents: 2300
diff changeset
230 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
231 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
232 for (i = 0; i < headers->count; i++) {
3247
e7166e2f8b9b Changed some buffers to arrays.
Timo Sirainen <tss@iki.fi>
parents: 3209
diff changeset
233 array_idx_set(&mail->header_match, headers->idx[i],
e7166e2f8b9b Changed some buffers to arrays.
Timo Sirainen <tss@iki.fi>
parents: 3209
diff changeset
234 &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
235 }
f5181233b04e Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
236 }
3458
0c264f105899 Try to be a bit smarter about when to parse header/body.
Timo Sirainen <tss@iki.fi>
parents: 3456
diff changeset
237
6842
d2c8269a0679 Cleanups/rewrites to how/when date/size caching is done.
Timo Sirainen <tss@iki.fi>
parents: 6840
diff changeset
238 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
239 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
240 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
241 &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
242 }
3493
3cc5229f1560 Header caching was more or less broken.
Timo Sirainen <tss@iki.fi>
parents: 3470
diff changeset
243
6006
9da1ec15340d We didn't cache correctly headers that existed in cache file for other
Timo Sirainen <tss@iki.fi>
parents: 5625
diff changeset
244 /* register also all the other headers that exist in cache file */
6940
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6842
diff changeset
245 T_FRAME(
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6842
diff changeset
246 index_mail_parse_header_register_all_wanted(mail);
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6842
diff changeset
247 );
1687
f5181233b04e Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
248 }
f5181233b04e Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
249
2327
7d02e2a7672d Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents: 2300
diff changeset
250 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
251 {
2327
7d02e2a7672d Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents: 2300
diff changeset
252 string_t *str;
6842
d2c8269a0679 Cleanups/rewrites to how/when date/size caching is done.
Timo Sirainen <tss@iki.fi>
parents: 6840
diff changeset
253 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
254
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
255 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
256 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
257 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
258
6842
d2c8269a0679 Cleanups/rewrites to how/when date/size caching is done.
Timo Sirainen <tss@iki.fi>
parents: 6840
diff changeset
259 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
260 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
261 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
262 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
263 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
264 }
1687
f5181233b04e Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
265 }
f5181233b04e Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
266
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
267 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
268 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
269 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
270 {
f5181233b04e Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
271 struct index_mail_data *data = &mail->data;
3247
e7166e2f8b9b Changed some buffers to arrays.
Timo Sirainen <tss@iki.fi>
parents: 3209
diff changeset
272 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
273 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
274
2327
7d02e2a7672d Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents: 2300
diff changeset
275 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
276
2327
7d02e2a7672d Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents: 2300
diff changeset
277 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
278 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
279 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
280 }
1689
c07b98265577 If BODY/BODYSTRUCTURE is requested with some other headers, parse the
Timo Sirainen <tss@iki.fi>
parents: 1687
diff changeset
281
1687
f5181233b04e Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
282 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
283 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
284 &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
285
2327
7d02e2a7672d Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents: 2300
diff changeset
286 if (hdr == NULL)
7d02e2a7672d Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents: 2300
diff changeset
287 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
288 }
f5181233b04e Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
289
f5181233b04e Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
290 if (hdr == NULL) {
f5181233b04e Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
291 /* end of headers */
6842
d2c8269a0679 Cleanups/rewrites to how/when date/size caching is done.
Timo Sirainen <tss@iki.fi>
parents: 6840
diff changeset
292 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
293 mail->data.sent_date_parsed = TRUE;
6940
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6842
diff changeset
294 T_FRAME(
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6842
diff changeset
295 index_mail_parse_header_finish(mail);
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6842
diff changeset
296 );
2327
7d02e2a7672d Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents: 2300
diff changeset
297 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
298 return;
1687
f5181233b04e Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
299 }
f5181233b04e Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
300
2327
7d02e2a7672d Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents: 2300
diff changeset
301 if (!hdr->continued) {
6940
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6842
diff changeset
302 T_FRAME(
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6842
diff changeset
303 const char *cache_field_name =
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6842
diff changeset
304 t_strconcat("hdr.", hdr->name, NULL);
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6842
diff changeset
305 data->parse_line.field_idx =
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6842
diff changeset
306 mail_cache_register_lookup(mail->ibox->cache,
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6842
diff changeset
307 cache_field_name);
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6842
diff changeset
308 );
2327
7d02e2a7672d Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents: 2300
diff changeset
309 }
7d02e2a7672d Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents: 2300
diff changeset
310 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
311 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
312 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
313 !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
314 /* 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
315 return;
2327
7d02e2a7672d Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents: 2300
diff changeset
316 }
1765
6c0c2ff2c113 Stop parsing cached headers when we've got everything.
Timo Sirainen <tss@iki.fi>
parents: 1758
diff changeset
317
2327
7d02e2a7672d Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents: 2300
diff changeset
318 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
319 /* 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
320 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
321 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
322 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
323 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
324
efec8836586a Don't cache all headers just because they're listed in cache file. First
Timo Sirainen <tss@iki.fi>
parents: 6838
diff changeset
325 /* 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
326 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
327 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
328 }
7d02e2a7672d Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents: 2300
diff changeset
329 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
330 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
331 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
332 if (!hdr->continues) {
7d02e2a7672d Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents: 2300
diff changeset
333 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
334 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
335 }
1765
6c0c2ff2c113 Stop parsing cached headers when we've got everything.
Timo Sirainen <tss@iki.fi>
parents: 1758
diff changeset
336 }
6c0c2ff2c113 Stop parsing cached headers when we've got everything.
Timo Sirainen <tss@iki.fi>
parents: 1758
diff changeset
337
2327
7d02e2a7672d Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents: 2300
diff changeset
338 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
339 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
340 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
341 struct index_mail *mail)
1765
6c0c2ff2c113 Stop parsing cached headers when we've got everything.
Timo Sirainen <tss@iki.fi>
parents: 1758
diff changeset
342 {
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
343 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
344 }
f5181233b04e Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
345
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
346 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
347 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
348 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
349 {
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
350 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
351 }
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
352
6265
0ee2b0691f3e Cache received date, sent date, save date and physical size when saving
Timo Sirainen <tss@iki.fi>
parents: 6142
diff changeset
353 struct istream *
0ee2b0691f3e Cache received date, sent date, save date and physical size when saving
Timo Sirainen <tss@iki.fi>
parents: 6142
diff changeset
354 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
355 {
5dee807e53cf Header parser has now flags parameter to tell it how to handle linefeeds.
Timo Sirainen <tss@iki.fi>
parents: 5516
diff changeset
356 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
357 struct tee_istream *tee;
1b0ef7a74448 Moved tee stream handling to index-mail code.
Timo Sirainen <tss@iki.fi>
parents: 6006
diff changeset
358 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
359
5dee807e53cf Header parser has now flags parameter to tell it how to handle linefeeds.
Timo Sirainen <tss@iki.fi>
parents: 5516
diff changeset
360 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
361
6526
c4205f6ac88f Make sure we parse everything so they can be saved to cache.
Timo Sirainen <tss@iki.fi>
parents: 6445
diff changeset
362 /* 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
363 save them. */
c4205f6ac88f Make sure we parse everything so they can be saved to cache.
Timo Sirainen <tss@iki.fi>
parents: 6445
diff changeset
364 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
365 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
366 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
367
6142
6c0bfc35af03 Removed memory pool parameter from iostreams. Default pool was almost always
Timo Sirainen <tss@iki.fi>
parents: 6120
diff changeset
368 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
369 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
370 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
371
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 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
373 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
374 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
375 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
376 i_stream_unref(&input);
1b0ef7a74448 Moved tee stream handling to index-mail code.
Timo Sirainen <tss@iki.fi>
parents: 6006
diff changeset
377 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
378 }
5dee807e53cf Header parser has now flags parameter to tell it how to handle linefeeds.
Timo Sirainen <tss@iki.fi>
parents: 5516
diff changeset
379
5506
6cd889c652b0 Removed message_parse_from_parts(). Added message_parser_init_from_parts()
Timo Sirainen <tss@iki.fi>
parents: 4907
diff changeset
380 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
381 {
6cd889c652b0 Removed message_parse_from_parts(). Added message_parser_init_from_parts()
Timo Sirainen <tss@iki.fi>
parents: 4907
diff changeset
382 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
383
6cd889c652b0 Removed message_parse_from_parts(). Added message_parser_init_from_parts()
Timo Sirainen <tss@iki.fi>
parents: 4907
diff changeset
384 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
385 (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
386
6cd889c652b0 Removed message_parse_from_parts(). Added message_parser_init_from_parts()
Timo Sirainen <tss@iki.fi>
parents: 4907
diff changeset
387 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
388 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
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 } else {
6cd889c652b0 Removed message_parse_from_parts(). Added message_parser_init_from_parts()
Timo Sirainen <tss@iki.fi>
parents: 4907
diff changeset
393 data->parser_ctx =
6cd889c652b0 Removed message_parse_from_parts(). Added message_parser_init_from_parts()
Timo Sirainen <tss@iki.fi>
parents: 4907
diff changeset
394 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
395 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
396 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
397 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
398 }
6cd889c652b0 Removed message_parse_from_parts(). Added message_parser_init_from_parts()
Timo Sirainen <tss@iki.fi>
parents: 4907
diff changeset
399 }
6cd889c652b0 Removed message_parse_from_parts(). Added message_parser_init_from_parts()
Timo Sirainen <tss@iki.fi>
parents: 4907
diff changeset
400
2336
d4577ee85f0f header caching fixes
Timo Sirainen <tss@iki.fi>
parents: 2328
diff changeset
401 int index_mail_parse_headers(struct index_mail *mail,
d4577ee85f0f header caching fixes
Timo Sirainen <tss@iki.fi>
parents: 2328
diff changeset
402 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
403 {
f5181233b04e Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
404 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
405 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
406 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
407
ebf140ebdb06 Restore data stream's offset after it has been internally changed, so that
Timo Sirainen <tss@iki.fi>
parents: 4451
diff changeset
408 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
409
6280
eb7c9d8ece54 mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents: 6265
diff changeset
410 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
411 return -1;
1687
f5181233b04e Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
412
2336
d4577ee85f0f header caching fixes
Timo Sirainen <tss@iki.fi>
parents: 2328
diff changeset
413 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
414
5625
ebf443cae951 Assert-crashfix in some conditions.
Timo Sirainen <tss@iki.fi>
parents: 5522
diff changeset
415 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
416 /* 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
417 message. */
5506
6cd889c652b0 Removed message_parse_from_parts(). Added message_parser_init_from_parts()
Timo Sirainen <tss@iki.fi>
parents: 4907
diff changeset
418 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
419 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
420 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
421 mail);
2327
7d02e2a7672d Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents: 2300
diff changeset
422 } else {
7d02e2a7672d Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents: 2300
diff changeset
423 /* 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
424 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
425 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
426 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
427 }
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
428 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
429 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
430
4507
ebf140ebdb06 Restore data stream's offset after it has been internally changed, so that
Timo Sirainen <tss@iki.fi>
parents: 4451
diff changeset
431 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
432 return 0;
1687
f5181233b04e Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
433 }
f5181233b04e Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
434
2327
7d02e2a7672d Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents: 2300
diff changeset
435 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
436 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
437 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
438 {
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
439 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
440 &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
441
7d02e2a7672d Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents: 2300
diff changeset
442 if (hdr == NULL)
7d02e2a7672d Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents: 2300
diff changeset
443 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
444 }
7d02e2a7672d Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents: 2300
diff changeset
445
6280
eb7c9d8ece54 mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents: 6265
diff changeset
446 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
447 {
7d02e2a7672d Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents: 2300
diff changeset
448 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
449 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
450 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
451
ebf140ebdb06 Restore data stream's offset after it has been internally changed, so that
Timo Sirainen <tss@iki.fi>
parents: 4451
diff changeset
452 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
453 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
454
2328
6527f1da0ee3 Avoid parsing headers twice to get IMAP envelope.
Timo Sirainen <tss@iki.fi>
parents: 2327
diff changeset
455 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
456 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
457 imap_envelope_headers);
6980
d373913cd763 Memory leak fixes
Timo Sirainen <tss@iki.fi>
parents: 6940
diff changeset
458 if (mail_get_header_stream(&mail->mail.mail, header_ctx, &stream) < 0) {
d373913cd763 Memory leak fixes
Timo Sirainen <tss@iki.fi>
parents: 6940
diff changeset
459 mailbox_header_lookup_deinit(&header_ctx);
6280
eb7c9d8ece54 mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents: 6265
diff changeset
460 return -1;
6980
d373913cd763 Memory leak fixes
Timo Sirainen <tss@iki.fi>
parents: 6940
diff changeset
461 }
6280
eb7c9d8ece54 mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents: 6265
diff changeset
462
2686
6e0a7083a880 Don't crash if fetching ENVELOPE for expunged message.
Timo Sirainen <tss@iki.fi>
parents: 2509
diff changeset
463 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
464 /* 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
465 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
466 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
467 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
468 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
469 }
3879
928229f8b3e6 deinit, unref, destroy, close, free, etc. functions now take a pointer to
Timo Sirainen <tss@iki.fi>
parents: 3863
diff changeset
470 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
471
ebf140ebdb06 Restore data stream's offset after it has been internally changed, so that
Timo Sirainen <tss@iki.fi>
parents: 4451
diff changeset
472 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
473 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
474 return 0;
2327
7d02e2a7672d Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents: 2300
diff changeset
475 }
7d02e2a7672d Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents: 2300
diff changeset
476
2355
e6b216ab4b4f get_index() wasn't working with caching disabled
Timo Sirainen <tss@iki.fi>
parents: 2347
diff changeset
477 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
478 {
e6b216ab4b4f get_index() wasn't working with caching disabled
Timo Sirainen <tss@iki.fi>
parents: 2347
diff changeset
479 const unsigned char *data;
e6b216ab4b4f get_index() wasn't working with caching disabled
Timo Sirainen <tss@iki.fi>
parents: 2347
diff changeset
480 size_t i, size;
e6b216ab4b4f get_index() wasn't working with caching disabled
Timo Sirainen <tss@iki.fi>
parents: 2347
diff changeset
481
e6b216ab4b4f get_index() wasn't working with caching disabled
Timo Sirainen <tss@iki.fi>
parents: 2347
diff changeset
482 data = buffer_get_data(buffer, &size);
e6b216ab4b4f get_index() wasn't working with caching disabled
Timo Sirainen <tss@iki.fi>
parents: 2347
diff changeset
483 i_assert(pos <= size);
e6b216ab4b4f get_index() wasn't working with caching disabled
Timo Sirainen <tss@iki.fi>
parents: 2347
diff changeset
484
e6b216ab4b4f get_index() wasn't working with caching disabled
Timo Sirainen <tss@iki.fi>
parents: 2347
diff changeset
485 for (i = pos; i < size; i++) {
e6b216ab4b4f get_index() wasn't working with caching disabled
Timo Sirainen <tss@iki.fi>
parents: 2347
diff changeset
486 if (data[i] == '\n') {
e6b216ab4b4f get_index() wasn't working with caching disabled
Timo Sirainen <tss@iki.fi>
parents: 2347
diff changeset
487 if (i+1 == size ||
e6b216ab4b4f get_index() wasn't working with caching disabled
Timo Sirainen <tss@iki.fi>
parents: 2347
diff changeset
488 (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
489 return i - pos;
e6b216ab4b4f get_index() wasn't working with caching disabled
Timo Sirainen <tss@iki.fi>
parents: 2347
diff changeset
490 }
e6b216ab4b4f get_index() wasn't working with caching disabled
Timo Sirainen <tss@iki.fi>
parents: 2347
diff changeset
491 }
e6b216ab4b4f get_index() wasn't working with caching disabled
Timo Sirainen <tss@iki.fi>
parents: 2347
diff changeset
492 return size - pos;
e6b216ab4b4f get_index() wasn't working with caching disabled
Timo Sirainen <tss@iki.fi>
parents: 2347
diff changeset
493 }
e6b216ab4b4f get_index() wasn't working with caching disabled
Timo Sirainen <tss@iki.fi>
parents: 2347
diff changeset
494
e6b216ab4b4f get_index() wasn't working with caching disabled
Timo Sirainen <tss@iki.fi>
parents: 2347
diff changeset
495 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
496 unsigned int field_idx)
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 const uint8_t *match;
3247
e7166e2f8b9b Changed some buffers to arrays.
Timo Sirainen <tss@iki.fi>
parents: 3209
diff changeset
499 unsigned int count;
2355
e6b216ab4b4f get_index() wasn't working with caching disabled
Timo Sirainen <tss@iki.fi>
parents: 2347
diff changeset
500
3247
e7166e2f8b9b Changed some buffers to arrays.
Timo Sirainen <tss@iki.fi>
parents: 3209
diff changeset
501 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
502 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
503 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
504 return -1;
e6b216ab4b4f get_index() wasn't working with caching disabled
Timo Sirainen <tss@iki.fi>
parents: 2347
diff changeset
505 }
e6b216ab4b4f get_index() wasn't working with caching disabled
Timo Sirainen <tss@iki.fi>
parents: 2347
diff changeset
506
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
507 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
508 {
1fae8494f8f7 mail_get_headers() and mail_get_first_header() returned headers with "name:"
Timo Sirainen <tss@iki.fi>
parents: 3278
diff changeset
509 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
510 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
511
1fae8494f8f7 mail_get_headers() and mail_get_first_header() returned headers with "name:"
Timo Sirainen <tss@iki.fi>
parents: 3278
diff changeset
512 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
513 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
514 break;
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 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
517 return FALSE;
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 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
520 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
521 break;
1fae8494f8f7 mail_get_headers() and mail_get_first_header() returned headers with "name:"
Timo Sirainen <tss@iki.fi>
parents: 3278
diff changeset
522 }
1fae8494f8f7 mail_get_headers() and mail_get_first_header() returned headers with "name:"
Timo Sirainen <tss@iki.fi>
parents: 3278
diff changeset
523
1fae8494f8f7 mail_get_headers() and mail_get_first_header() returned headers with "name:"
Timo Sirainen <tss@iki.fi>
parents: 3278
diff changeset
524 *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
525 return TRUE;
1fae8494f8f7 mail_get_headers() and mail_get_first_header() returned headers with "name:"
Timo Sirainen <tss@iki.fi>
parents: 3278
diff changeset
526 }
1fae8494f8f7 mail_get_headers() and mail_get_first_header() returned headers with "name:"
Timo Sirainen <tss@iki.fi>
parents: 3278
diff changeset
527
3248
ff47e78ad717 Renamed mail_get_header() to mail_get_first_header() and mail_gets_headers()
Timo Sirainen <tss@iki.fi>
parents: 3247
diff changeset
528 static const char *const *
2355
e6b216ab4b4f get_index() wasn't working with caching disabled
Timo Sirainen <tss@iki.fi>
parents: 2347
diff changeset
529 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
530 {
4451
1a35d53c18fc Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents: 4418
diff changeset
531 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
532 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
533 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
534 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
535 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
536 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
537
ff47e78ad717 Renamed mail_get_header() to mail_get_first_header() and mail_gets_headers()
Timo Sirainen <tss@iki.fi>
parents: 3247
diff changeset
538 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
539 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
540 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
541
4596
bf4e98a0de3f Replaced ARRAY_CREATE() macro with [ipt]_array_init() macros. The macro
Timo Sirainen <tss@iki.fi>
parents: 4594
diff changeset
542 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
543 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
544
3248
ff47e78ad717 Renamed mail_get_header() to mail_get_first_header() and mail_gets_headers()
Timo Sirainen <tss@iki.fi>
parents: 3247
diff changeset
545 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
546 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
547 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
548 break;
2355
e6b216ab4b4f get_index() wasn't working with caching disabled
Timo Sirainen <tss@iki.fi>
parents: 2347
diff changeset
549
3288
1fae8494f8f7 mail_get_headers() and mail_get_first_header() returned headers with "name:"
Timo Sirainen <tss@iki.fi>
parents: 3278
diff changeset
550 /* 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
551 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
552 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
553 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
554 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
555 value_end--;
1fae8494f8f7 mail_get_headers() and mail_get_first_header() returned headers with "name:"
Timo Sirainen <tss@iki.fi>
parents: 3278
diff changeset
556 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
557 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
558 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
559 }
3248
ff47e78ad717 Renamed mail_get_header() to mail_get_first_header() and mail_gets_headers()
Timo Sirainen <tss@iki.fi>
parents: 3247
diff changeset
560 }
ff47e78ad717 Renamed mail_get_header() to mail_get_first_header() and mail_gets_headers()
Timo Sirainen <tss@iki.fi>
parents: 3247
diff changeset
561
6838
e726f298d87e mail_get_headers() returned bad data when headers were already cached.
Timo Sirainen <tss@iki.fi>
parents: 6526
diff changeset
562 (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
563 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
564 }
e6b216ab4b4f get_index() wasn't working with caching disabled
Timo Sirainen <tss@iki.fi>
parents: 2347
diff changeset
565
6280
eb7c9d8ece54 mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents: 6265
diff changeset
566 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
567 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
568 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
569 {
3248
ff47e78ad717 Renamed mail_get_header() to mail_get_first_header() and mail_gets_headers()
Timo Sirainen <tss@iki.fi>
parents: 3247
diff changeset
570 const char *headers[2], *value;
2336
d4577ee85f0f header caching fixes
Timo Sirainen <tss@iki.fi>
parents: 2328
diff changeset
571 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
572 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
573 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
574 string_t *dest;
2355
e6b216ab4b4f get_index() wasn't working with caching disabled
Timo Sirainen <tss@iki.fi>
parents: 2347
diff changeset
575 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
576 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
577 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
578
3301
dd19f2e8575f Don't even try to allow searching zero number of headers.
Timo Sirainen <tss@iki.fi>
parents: 3297
diff changeset
579 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
580
2327
7d02e2a7672d Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents: 2300
diff changeset
581 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
582
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
583 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
584 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
585 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
586 /* 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
587 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
588
4d33a6959d32 Don't assert-crash if looking up a non-parsed header after headers were
Timo Sirainen <tss@iki.fi>
parents: 6429
diff changeset
589 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
590 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
591 /* parse */
eb7c9d8ece54 mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents: 6265
diff changeset
592 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
593 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
594 &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
595 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
596 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
597 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
598 return -1;
2355
e6b216ab4b4f get_index() wasn't working with caching disabled
Timo Sirainen <tss@iki.fi>
parents: 2347
diff changeset
599 }
e6b216ab4b4f get_index() wasn't working with caching disabled
Timo Sirainen <tss@iki.fi>
parents: 2347
diff changeset
600
6280
eb7c9d8ece54 mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents: 6265
diff changeset
601 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
602 /* 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
603 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
604 *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
605 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
606 }
eb7c9d8ece54 mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents: 6265
diff changeset
607 *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
608 return 0;
1771
63254344ea0e get_header() returned only first line of multiline headers
Timo Sirainen <tss@iki.fi>
parents: 1770
diff changeset
609 }
4451
1a35d53c18fc Array API redesigned to work using unions. It now provides type safety
Timo Sirainen <tss@iki.fi>
parents: 4418
diff changeset
610 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
611
3248
ff47e78ad717 Renamed mail_get_header() to mail_get_first_header() and mail_gets_headers()
Timo Sirainen <tss@iki.fi>
parents: 3247
diff changeset
612 if (len == 0) {
3045
ccfd78cc07cc mail->get_header() was pretty broken. This affected SORT/THREAD.
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
613 /* 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
614 *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
615 return 0;
3045
ccfd78cc07cc mail->get_header() was pretty broken. This affected SORT/THREAD.
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
616 }
ccfd78cc07cc mail->get_header() was pretty broken. This affected SORT/THREAD.
Timo Sirainen <tss@iki.fi>
parents: 2708
diff changeset
617
4596
bf4e98a0de3f Replaced ARRAY_CREATE() macro with [ipt]_array_init() macros. The macro
Timo Sirainen <tss@iki.fi>
parents: 4594
diff changeset
618 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
619
ff47e78ad717 Renamed mail_get_header() to mail_get_first_header() and mail_gets_headers()
Timo Sirainen <tss@iki.fi>
parents: 3247
diff changeset
620 /* 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
621 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
622 if (data[i] == ':') {
7d02e2a7672d Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents: 2300
diff changeset
623 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
624
ff47e78ad717 Renamed mail_get_header() to mail_get_first_header() and mail_gets_headers()
Timo Sirainen <tss@iki.fi>
parents: 3247
diff changeset
625 /* @UNSAFE */
ff47e78ad717 Renamed mail_get_header() to mail_get_first_header() and mail_gets_headers()
Timo Sirainen <tss@iki.fi>
parents: 3247
diff changeset
626 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
627 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
628 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
629 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
630
6838
e726f298d87e mail_get_headers() returned bad data when headers were already cached.
Timo Sirainen <tss@iki.fi>
parents: 6526
diff changeset
631 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
632 }
7d02e2a7672d Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents: 2300
diff changeset
633 }
1687
f5181233b04e Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
634
6838
e726f298d87e mail_get_headers() returned bad data when headers were already cached.
Timo Sirainen <tss@iki.fi>
parents: 6526
diff changeset
635 (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
636 *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
637 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
638 }
ff47e78ad717 Renamed mail_get_header() to mail_get_first_header() and mail_gets_headers()
Timo Sirainen <tss@iki.fi>
parents: 3247
diff changeset
639
6120
00d1a94a94c6 Added mail_get_first_header_utf8() and mail_get_headers_utf8().
Timo Sirainen <tss@iki.fi>
parents: 6083
diff changeset
640 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
641 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
642 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
643 {
6120
00d1a94a94c6 Added mail_get_first_header_utf8() and mail_get_headers_utf8().
Timo Sirainen <tss@iki.fi>
parents: 6083
diff changeset
644 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
645 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
646 buffer_t *buf;
00d1a94a94c6 Added mail_get_first_header_utf8() and mail_get_headers_utf8().
Timo Sirainen <tss@iki.fi>
parents: 6083
diff changeset
647
6424
687efa138e77 Renamed strarray_length/remote() to str_array_length/remove()
Timo Sirainen <tss@iki.fi>
parents: 6423
diff changeset
648 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
649 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
650 count = max_count;
00d1a94a94c6 Added mail_get_first_header_utf8() and mail_get_headers_utf8().
Timo Sirainen <tss@iki.fi>
parents: 6083
diff changeset
651 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
652
00d1a94a94c6 Added mail_get_first_header_utf8() and mail_get_headers_utf8().
Timo Sirainen <tss@iki.fi>
parents: 6083
diff changeset
653 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
654
00d1a94a94c6 Added mail_get_first_header_utf8() and mail_get_headers_utf8().
Timo Sirainen <tss@iki.fi>
parents: 6083
diff changeset
655 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
656 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
657 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
658 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
659 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
660 else {
00d1a94a94c6 Added mail_get_first_header_utf8() and mail_get_headers_utf8().
Timo Sirainen <tss@iki.fi>
parents: 6083
diff changeset
661 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
662 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
663 }
00d1a94a94c6 Added mail_get_first_header_utf8() and mail_get_headers_utf8().
Timo Sirainen <tss@iki.fi>
parents: 6083
diff changeset
664 }
00d1a94a94c6 Added mail_get_first_header_utf8() and mail_get_headers_utf8().
Timo Sirainen <tss@iki.fi>
parents: 6083
diff changeset
665 return decoded_list;
00d1a94a94c6 Added mail_get_first_header_utf8() and mail_get_headers_utf8().
Timo Sirainen <tss@iki.fi>
parents: 6083
diff changeset
666 }
3248
ff47e78ad717 Renamed mail_get_header() to mail_get_first_header() and mail_gets_headers()
Timo Sirainen <tss@iki.fi>
parents: 3247
diff changeset
667
6280
eb7c9d8ece54 mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents: 6265
diff changeset
668 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
669 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
670 {
eb7c9d8ece54 mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents: 6265
diff changeset
671 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
672
eb7c9d8ece54 mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents: 6265
diff changeset
673 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
674 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
675 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
676 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
677
6940
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6842
diff changeset
678 T_FRAME(
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6842
diff changeset
679 *value_r = index_mail_headers_decode(mail, *value_r, -1U);
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6842
diff changeset
680 );
6280
eb7c9d8ece54 mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents: 6265
diff changeset
681 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
682 }
eb7c9d8ece54 mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents: 6265
diff changeset
683
eb7c9d8ece54 mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents: 6265
diff changeset
684 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
685 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
686 {
00d1a94a94c6 Added mail_get_first_header_utf8() and mail_get_headers_utf8().
Timo Sirainen <tss@iki.fi>
parents: 6083
diff changeset
687 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
688 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
689
6280
eb7c9d8ece54 mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents: 6265
diff changeset
690 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
691 return -1;
6940
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6842
diff changeset
692 if (decode_to_utf8 && list[0] != NULL) {
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6842
diff changeset
693 T_FRAME(
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6842
diff changeset
694 list = index_mail_headers_decode(mail, list, 1);
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6842
diff changeset
695 );
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6842
diff changeset
696 }
6280
eb7c9d8ece54 mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents: 6265
diff changeset
697 *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
698 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
699 }
7d02e2a7672d Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents: 2300
diff changeset
700
7d02e2a7672d Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents: 2300
diff changeset
701 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
702 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
703 {
2451
f6fef42f01b9 Changed istream-header-filter API a bit. Added HIDE_BODY option. Fixed
Timo Sirainen <tss@iki.fi>
parents: 2436
diff changeset
704 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
705 *matched = FALSE;
f6fef42f01b9 Changed istream-header-filter API a bit. Added HIDE_BODY option. Fixed
Timo Sirainen <tss@iki.fi>
parents: 2436
diff changeset
706
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
707 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
708 }
f5181233b04e Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
709
6280
eb7c9d8ece54 mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents: 6265
diff changeset
710 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
711 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
712 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
713 {
2327
7d02e2a7672d Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents: 2300
diff changeset
714 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
715 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
716 (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
717 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
718 string_t *dest;
7d02e2a7672d Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents: 2300
diff changeset
719
2509
146591955618 Fixed crash if mail data was fetched in specific order. Plus some minor
Timo Sirainen <tss@iki.fi>
parents: 2451
diff changeset
720 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
721 /* 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
722 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
723 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
724 }
146591955618 Fixed crash if mail data was fetched in specific order. Plus some minor
Timo Sirainen <tss@iki.fi>
parents: 2451
diff changeset
725
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
726 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
727 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
728 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
729 headers->count) > 0) {
4062
788f5caab763 Last memory leak fix actually started crashing.
Timo Sirainen <tss@iki.fi>
parents: 3909
diff changeset
730 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
731 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
732 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
733 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
734 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
735 *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
736 return 0;
2327
7d02e2a7672d Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents: 2300
diff changeset
737 }
7d02e2a7672d Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents: 2300
diff changeset
738 /* 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
739 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
740
6280
eb7c9d8ece54 mail_*() APIs changed to return int and return the actual data as pointer.
Timo Sirainen <tss@iki.fi>
parents: 6265
diff changeset
741 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
742 return -1;
2327
7d02e2a7672d Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents: 2300
diff changeset
743
7d02e2a7672d Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents: 2300
diff changeset
744 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
745 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
746
2327
7d02e2a7672d Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents: 2300
diff changeset
747 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
748 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
749 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
750 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
751 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
752 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
753 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
754 *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
755 return 0;
2327
7d02e2a7672d Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents: 2300
diff changeset
756 }
1687
f5181233b04e Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
757
6940
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6842
diff changeset
758 static struct mailbox_header_lookup_ctx *
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6842
diff changeset
759 index_header_lookup_init_real(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
760 {
2327
7d02e2a7672d Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents: 2300
diff changeset
761 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
762 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
763 NULL, 0, MAIL_CACHE_FIELD_HEADER, 0,
2339
406692edc12d Cache fixes. Decisions are saved again.
Timo Sirainen <tss@iki.fi>
parents: 2336
diff changeset
764 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
765 };
7d02e2a7672d Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents: 2300
diff changeset
766 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
767 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
768 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
769 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
770 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
771
3301
dd19f2e8575f Don't even try to allow searching zero number of headers.
Timo Sirainen <tss@iki.fi>
parents: 3297
diff changeset
772 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
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 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
775 count++;
2327
7d02e2a7672d Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents: 2300
diff changeset
776
3301
dd19f2e8575f Don't even try to allow searching zero number of headers.
Timo Sirainen <tss@iki.fi>
parents: 3297
diff changeset
777 /* @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
778 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
779 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
780 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
781 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
782
3278
df372eecc5d0 Several size_t -> unsigned int changes. Try to keep "unsigned int" for
Timo Sirainen <tss@iki.fi>
parents: 3248
diff changeset
783 /* @UNSAFE */
df372eecc5d0 Several size_t -> unsigned int changes. Try to keep "unsigned int" for
Timo Sirainen <tss@iki.fi>
parents: 3248
diff changeset
784 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
785 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
786 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
787 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
788 }
3278
df372eecc5d0 Several size_t -> unsigned int changes. Try to keep "unsigned int" for
Timo Sirainen <tss@iki.fi>
parents: 3248
diff changeset
789 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
790
4585
26bbf71e9b5e Grow index_header_lookup_ctx pool initial size.
Timo Sirainen <tss@iki.fi>
parents: 4518
diff changeset
791 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
792 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
793 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
794 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
795 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
796
3301
dd19f2e8575f Don't even try to allow searching zero number of headers.
Timo Sirainen <tss@iki.fi>
parents: 3297
diff changeset
797 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
798 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
799
3301
dd19f2e8575f Don't even try to allow searching zero number of headers.
Timo Sirainen <tss@iki.fi>
parents: 3297
diff changeset
800 /* @UNSAFE */
dd19f2e8575f Don't even try to allow searching zero number of headers.
Timo Sirainen <tss@iki.fi>
parents: 3297
diff changeset
801 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
802 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
803 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
804 }
6940
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6842
diff changeset
805 return &ctx->ctx;
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6842
diff changeset
806 }
1687
f5181233b04e Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
807
6940
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6842
diff changeset
808 struct mailbox_header_lookup_ctx *
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6842
diff changeset
809 index_header_lookup_init(struct mailbox *box, const char *const headers[])
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6842
diff changeset
810 {
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6842
diff changeset
811 struct mailbox_header_lookup_ctx *ctx;
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6842
diff changeset
812
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6842
diff changeset
813 T_FRAME(
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6842
diff changeset
814 ctx = index_header_lookup_init_real(box, headers);
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6842
diff changeset
815 );
414c9d631a81 Replaced t_push/t_pop calls with T_FRAME*() macros.
Timo Sirainen <tss@iki.fi>
parents: 6842
diff changeset
816 return ctx;
1687
f5181233b04e Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
817 }
f5181233b04e Changed how cached headers are stored. Previously when we added new headers,
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
818
2327
7d02e2a7672d Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents: 2300
diff changeset
819 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
820 {
2327
7d02e2a7672d Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents: 2300
diff changeset
821 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
822 (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
823
6428
7cad076906eb pool_unref() now takes ** pointer.
Timo Sirainen <tss@iki.fi>
parents: 6424
diff changeset
824 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
825 }