annotate src/lib-storage/index/index-mail-headers.c @ 6842:d2c8269a0679 HEAD

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