Mercurial > dovecot > original-hg > dovecot-1.2
annotate src/lib-index/mail-cache-lookup.c @ 5735:5763c2548153 HEAD
s/field/field_idx/
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Thu, 14 Jun 2007 04:05:13 +0300 |
parents | 5f0832288007 |
children | b3ed52bbeca7 |
rev | line source |
---|---|
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1 /* Copyright (C) 2003-2004 Timo Sirainen */ |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2 |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
3 #include "lib.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:
3379
diff
changeset
|
4 #include "array.h" |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
5 #include "buffer.h" |
2279
ed0bb4c12f03
Cache API updates. Don't return direct pointers to mmaped cache file anymore.
Timo Sirainen <tss@iki.fi>
parents:
2277
diff
changeset
|
6 #include "str.h" |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
7 #include "mail-cache-private.h" |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
8 |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2315
diff
changeset
|
9 #include <stdlib.h> |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
10 |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2315
diff
changeset
|
11 #define CACHE_PREFETCH 1024 |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
12 |
2917
e657c7874962
Crashfixes for reading corrupted cache files.
Timo Sirainen <tss@iki.fi>
parents:
2866
diff
changeset
|
13 int mail_cache_get_record(struct mail_cache *cache, uint32_t offset, |
e657c7874962
Crashfixes for reading corrupted cache files.
Timo Sirainen <tss@iki.fi>
parents:
2866
diff
changeset
|
14 const struct mail_cache_record **rec_r) |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
15 { |
5734 | 16 const struct mail_cache_record *rec; |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
17 |
5734 | 18 i_assert(offset != 0); |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
19 |
5734 | 20 /* we don't know yet how large the record is, so just guess */ |
21 if (mail_cache_map(cache, offset, sizeof(*rec) + CACHE_PREFETCH) < 0) | |
2917
e657c7874962
Crashfixes for reading corrupted cache files.
Timo Sirainen <tss@iki.fi>
parents:
2866
diff
changeset
|
22 return -1; |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
23 |
5734 | 24 if (offset + sizeof(*rec) > cache->mmap_length) { |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
25 mail_cache_set_corrupted(cache, "record points outside file"); |
2917
e657c7874962
Crashfixes for reading corrupted cache files.
Timo Sirainen <tss@iki.fi>
parents:
2866
diff
changeset
|
26 return -1; |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
27 } |
5734 | 28 rec = CACHE_RECORD(cache, offset); |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
29 |
5734 | 30 if (rec->size < sizeof(*rec)) { |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
31 mail_cache_set_corrupted(cache, "invalid record size"); |
2917
e657c7874962
Crashfixes for reading corrupted cache files.
Timo Sirainen <tss@iki.fi>
parents:
2866
diff
changeset
|
32 return -1; |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
33 } |
5734 | 34 if (rec->size > CACHE_PREFETCH) { |
35 /* larger than we guessed. map the rest of the record. */ | |
36 if (mail_cache_map(cache, offset, rec->size) < 0) | |
2917
e657c7874962
Crashfixes for reading corrupted cache files.
Timo Sirainen <tss@iki.fi>
parents:
2866
diff
changeset
|
37 return -1; |
5734 | 38 rec = CACHE_RECORD(cache, offset); |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
39 } |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
40 |
5734 | 41 if (rec->size > cache->mmap_length || |
42 offset + rec->size > cache->mmap_length) { | |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
43 mail_cache_set_corrupted(cache, "record points outside file"); |
2917
e657c7874962
Crashfixes for reading corrupted cache files.
Timo Sirainen <tss@iki.fi>
parents:
2866
diff
changeset
|
44 return -1; |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
45 } |
2917
e657c7874962
Crashfixes for reading corrupted cache files.
Timo Sirainen <tss@iki.fi>
parents:
2866
diff
changeset
|
46 |
5734 | 47 *rec_r = rec; |
2917
e657c7874962
Crashfixes for reading corrupted cache files.
Timo Sirainen <tss@iki.fi>
parents:
2866
diff
changeset
|
48 return 0; |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
49 } |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
50 |
2853
512dd7d76cdc
Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents:
2708
diff
changeset
|
51 static int |
512dd7d76cdc
Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents:
2708
diff
changeset
|
52 mail_cache_lookup_offset(struct mail_cache *cache, struct mail_index_view *view, |
512dd7d76cdc
Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents:
2708
diff
changeset
|
53 uint32_t seq, uint32_t *offset_r) |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
54 { |
2275
c68a3c9f6d73
Cache file compression works now and compressed cache file is reopened.
Timo Sirainen <tss@iki.fi>
parents:
2247
diff
changeset
|
55 struct mail_index_map *map; |
2853
512dd7d76cdc
Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents:
2708
diff
changeset
|
56 const struct mail_index_ext *ext; |
512dd7d76cdc
Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents:
2708
diff
changeset
|
57 const void *data; |
512dd7d76cdc
Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents:
2708
diff
changeset
|
58 uint32_t idx; |
2275
c68a3c9f6d73
Cache file compression works now and compressed cache file is reopened.
Timo Sirainen <tss@iki.fi>
parents:
2247
diff
changeset
|
59 int i, ret; |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
60 |
2853
512dd7d76cdc
Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents:
2708
diff
changeset
|
61 if (mail_index_lookup_ext_full(view, seq, cache->ext_id, |
512dd7d76cdc
Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents:
2708
diff
changeset
|
62 &map, &data) < 0) |
512dd7d76cdc
Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents:
2708
diff
changeset
|
63 return -1; |
5734 | 64 if (data == NULL || *((const uint32_t *)data) == 0) { |
65 /* nothing in cache (for this record) */ | |
2853
512dd7d76cdc
Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents:
2708
diff
changeset
|
66 return 0; |
512dd7d76cdc
Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents:
2708
diff
changeset
|
67 } |
512dd7d76cdc
Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents:
2708
diff
changeset
|
68 |
5734 | 69 if (!mail_index_map_get_ext_idx(map, cache->ext_id, &idx)) |
70 i_unreached(); | |
3191
0df3f5d71958
Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents:
2917
diff
changeset
|
71 ext = array_idx(&map->extensions, idx); |
2853
512dd7d76cdc
Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents:
2708
diff
changeset
|
72 |
5734 | 73 /* reset_id must match file_seq or the offset is for a different cache |
74 file. if this happens, try if reopening the cache helps. if not, | |
75 it was probably for an old cache file that's already lost by now. */ | |
76 i = 0; | |
77 while (cache->hdr->file_seq != ext->reset_id) { | |
78 if (++i == 2) | |
79 return 0; | |
2275
c68a3c9f6d73
Cache file compression works now and compressed cache file is reopened.
Timo Sirainen <tss@iki.fi>
parents:
2247
diff
changeset
|
80 |
5734 | 81 if ((ret = mail_cache_reopen(cache)) <= 0) { |
82 /* error / we already have the latest file open */ | |
2275
c68a3c9f6d73
Cache file compression works now and compressed cache file is reopened.
Timo Sirainen <tss@iki.fi>
parents:
2247
diff
changeset
|
83 return ret; |
5734 | 84 } |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
85 } |
2275
c68a3c9f6d73
Cache file compression works now and compressed cache file is reopened.
Timo Sirainen <tss@iki.fi>
parents:
2247
diff
changeset
|
86 |
5734 | 87 *offset_r = *((const uint32_t *)data); |
88 return 1; | |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
89 } |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
90 |
2315
22210d6cf238
Cache fixes. Lookups now look into transactions too.
Timo Sirainen <tss@iki.fi>
parents:
2298
diff
changeset
|
91 static int |
2611 | 92 mail_cache_foreach_rec(struct mail_cache_view *view, uint32_t *offset, |
2315
22210d6cf238
Cache fixes. Lookups now look into transactions too.
Timo Sirainen <tss@iki.fi>
parents:
2298
diff
changeset
|
93 mail_cache_foreach_callback_t *callback, void *context) |
22210d6cf238
Cache fixes. Lookups now look into transactions too.
Timo Sirainen <tss@iki.fi>
parents:
2298
diff
changeset
|
94 { |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2315
diff
changeset
|
95 struct mail_cache *cache = view->cache; |
5734 | 96 const struct mail_cache_record *rec; |
2555
87af1f39a69e
Added support for bitmask type.
Timo Sirainen <tss@iki.fi>
parents:
2419
diff
changeset
|
97 unsigned int data_size; |
5734 | 98 uint32_t pos, rec_size, file_field; |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2315
diff
changeset
|
99 unsigned int field; |
2315
22210d6cf238
Cache fixes. Lookups now look into transactions too.
Timo Sirainen <tss@iki.fi>
parents:
2298
diff
changeset
|
100 int ret; |
22210d6cf238
Cache fixes. Lookups now look into transactions too.
Timo Sirainen <tss@iki.fi>
parents:
2298
diff
changeset
|
101 |
5734 | 102 if (mail_cache_get_record(view->cache, *offset, &rec) < 0) |
2917
e657c7874962
Crashfixes for reading corrupted cache files.
Timo Sirainen <tss@iki.fi>
parents:
2866
diff
changeset
|
103 return -1; |
2611 | 104 |
5734 | 105 rec_size = rec->size; |
106 for (pos = sizeof(*rec); pos + sizeof(uint32_t) <= rec_size; ) { | |
107 file_field = *((const uint32_t *)CONST_PTR_OFFSET(rec, pos)); | |
2315
22210d6cf238
Cache fixes. Lookups now look into transactions too.
Timo Sirainen <tss@iki.fi>
parents:
2298
diff
changeset
|
108 pos += sizeof(uint32_t); |
22210d6cf238
Cache fixes. Lookups now look into transactions too.
Timo Sirainen <tss@iki.fi>
parents:
2298
diff
changeset
|
109 |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2315
diff
changeset
|
110 if (file_field >= cache->file_fields_count) { |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2315
diff
changeset
|
111 /* new field, have to re-read fields header to figure |
3551
65dc45982df9
Removed fcntl() text from some locking error messages, because if
Timo Sirainen <tss@iki.fi>
parents:
3470
diff
changeset
|
112 out its size */ |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2315
diff
changeset
|
113 if (mail_cache_header_fields_read(cache) < 0) |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2315
diff
changeset
|
114 return -1; |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2315
diff
changeset
|
115 if (file_field >= cache->file_fields_count) { |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2315
diff
changeset
|
116 mail_cache_set_corrupted(cache, |
2577 | 117 "field index too large (%u >= %u)", |
118 file_field, cache->file_fields_count); | |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2315
diff
changeset
|
119 return -1; |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2315
diff
changeset
|
120 } |
2611 | 121 |
122 /* field reading might have re-mmaped the file and | |
5734 | 123 caused rec pointer to break. need to get it again. */ |
2917
e657c7874962
Crashfixes for reading corrupted cache files.
Timo Sirainen <tss@iki.fi>
parents:
2866
diff
changeset
|
124 if (mail_cache_get_record(view->cache, *offset, |
5734 | 125 &rec) < 0) |
2917
e657c7874962
Crashfixes for reading corrupted cache files.
Timo Sirainen <tss@iki.fi>
parents:
2866
diff
changeset
|
126 return -1; |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2315
diff
changeset
|
127 } |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2315
diff
changeset
|
128 |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2315
diff
changeset
|
129 field = cache->file_field_map[file_field]; |
2339
406692edc12d
Cache fixes. Decisions are saved again.
Timo Sirainen <tss@iki.fi>
parents:
2327
diff
changeset
|
130 data_size = cache->fields[field].field.field_size; |
2315
22210d6cf238
Cache fixes. Lookups now look into transactions too.
Timo Sirainen <tss@iki.fi>
parents:
2298
diff
changeset
|
131 if (data_size == (unsigned int)-1) { |
5734 | 132 /* variable size field. get its size from the file. */ |
133 if (pos + sizeof(uint32_t) > rec_size) { | |
134 /* broken. we'll catch this error below. */ | |
135 } else { | |
136 data_size = *((const uint32_t *) | |
137 CONST_PTR_OFFSET(rec, pos)); | |
138 pos += sizeof(uint32_t); | |
139 } | |
2315
22210d6cf238
Cache fixes. Lookups now look into transactions too.
Timo Sirainen <tss@iki.fi>
parents:
2298
diff
changeset
|
140 } |
22210d6cf238
Cache fixes. Lookups now look into transactions too.
Timo Sirainen <tss@iki.fi>
parents:
2298
diff
changeset
|
141 |
5734 | 142 if (rec_size - pos < data_size) { |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2315
diff
changeset
|
143 mail_cache_set_corrupted(cache, |
3551
65dc45982df9
Removed fcntl() text from some locking error messages, because if
Timo Sirainen <tss@iki.fi>
parents:
3470
diff
changeset
|
144 "record continues outside its allocated size"); |
2315
22210d6cf238
Cache fixes. Lookups now look into transactions too.
Timo Sirainen <tss@iki.fi>
parents:
2298
diff
changeset
|
145 return -1; |
22210d6cf238
Cache fixes. Lookups now look into transactions too.
Timo Sirainen <tss@iki.fi>
parents:
2298
diff
changeset
|
146 } |
22210d6cf238
Cache fixes. Lookups now look into transactions too.
Timo Sirainen <tss@iki.fi>
parents:
2298
diff
changeset
|
147 |
5734 | 148 ret = callback(view, field, CONST_PTR_OFFSET(rec, pos), |
2315
22210d6cf238
Cache fixes. Lookups now look into transactions too.
Timo Sirainen <tss@iki.fi>
parents:
2298
diff
changeset
|
149 data_size, context); |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2315
diff
changeset
|
150 if (ret != 1) |
2315
22210d6cf238
Cache fixes. Lookups now look into transactions too.
Timo Sirainen <tss@iki.fi>
parents:
2298
diff
changeset
|
151 return ret; |
22210d6cf238
Cache fixes. Lookups now look into transactions too.
Timo Sirainen <tss@iki.fi>
parents:
2298
diff
changeset
|
152 |
5734 | 153 /* each record begins from 32bit aligned position */ |
154 pos += (data_size + sizeof(uint32_t)-1) & ~(sizeof(uint32_t)-1); | |
2315
22210d6cf238
Cache fixes. Lookups now look into transactions too.
Timo Sirainen <tss@iki.fi>
parents:
2298
diff
changeset
|
155 } |
2611 | 156 |
5734 | 157 if (pos != rec_size) { |
158 mail_cache_set_corrupted(cache, "record has invalid size"); | |
159 return -1; | |
160 } | |
161 | |
162 *offset = rec->prev_offset; | |
2315
22210d6cf238
Cache fixes. Lookups now look into transactions too.
Timo Sirainen <tss@iki.fi>
parents:
2298
diff
changeset
|
163 return 1; |
22210d6cf238
Cache fixes. Lookups now look into transactions too.
Timo Sirainen <tss@iki.fi>
parents:
2298
diff
changeset
|
164 } |
22210d6cf238
Cache fixes. Lookups now look into transactions too.
Timo Sirainen <tss@iki.fi>
parents:
2298
diff
changeset
|
165 |
5734 | 166 bool mail_cache_track_loops(ARRAY_TYPE(uint32_t) *array, uint32_t offset) |
2631
519b768e5f2f
Make sure we don't get into infinite loops while reading cache.
Timo Sirainen <tss@iki.fi>
parents:
2619
diff
changeset
|
167 { |
519b768e5f2f
Make sure we don't get into infinite loops while reading cache.
Timo Sirainen <tss@iki.fi>
parents:
2619
diff
changeset
|
168 const uint32_t *offsets; |
3191
0df3f5d71958
Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents:
2917
diff
changeset
|
169 unsigned int i, count; |
2631
519b768e5f2f
Make sure we don't get into infinite loops while reading cache.
Timo Sirainen <tss@iki.fi>
parents:
2619
diff
changeset
|
170 |
5734 | 171 offsets = array_get(array, &count); |
3191
0df3f5d71958
Changed many buffers to arrays. Cleans up the code a lot.
Timo Sirainen <tss@iki.fi>
parents:
2917
diff
changeset
|
172 for (i = 0; i < count; i++) { |
2631
519b768e5f2f
Make sure we don't get into infinite loops while reading cache.
Timo Sirainen <tss@iki.fi>
parents:
2619
diff
changeset
|
173 if (offsets[i] == offset) |
519b768e5f2f
Make sure we don't get into infinite loops while reading cache.
Timo Sirainen <tss@iki.fi>
parents:
2619
diff
changeset
|
174 return TRUE; |
519b768e5f2f
Make sure we don't get into infinite loops while reading cache.
Timo Sirainen <tss@iki.fi>
parents:
2619
diff
changeset
|
175 } |
5734 | 176 array_append(array, &offset, 1); |
2631
519b768e5f2f
Make sure we don't get into infinite loops while reading cache.
Timo Sirainen <tss@iki.fi>
parents:
2619
diff
changeset
|
177 return FALSE; |
519b768e5f2f
Make sure we don't get into infinite loops while reading cache.
Timo Sirainen <tss@iki.fi>
parents:
2619
diff
changeset
|
178 } |
519b768e5f2f
Make sure we don't get into infinite loops while reading cache.
Timo Sirainen <tss@iki.fi>
parents:
2619
diff
changeset
|
179 |
2298
5beb0c20b6e8
Cache file fixes, API changes, etc. It's still in somewhat ugly state, but
Timo Sirainen <tss@iki.fi>
parents:
2279
diff
changeset
|
180 int mail_cache_foreach(struct mail_cache_view *view, uint32_t seq, |
2315
22210d6cf238
Cache fixes. Lookups now look into transactions too.
Timo Sirainen <tss@iki.fi>
parents:
2298
diff
changeset
|
181 mail_cache_foreach_callback_t *callback, void *context) |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
182 { |
2315
22210d6cf238
Cache fixes. Lookups now look into transactions too.
Timo Sirainen <tss@iki.fi>
parents:
2298
diff
changeset
|
183 uint32_t offset; |
2298
5beb0c20b6e8
Cache file fixes, API changes, etc. It's still in somewhat ugly state, but
Timo Sirainen <tss@iki.fi>
parents:
2279
diff
changeset
|
184 int ret; |
2277
41e56f28d085
Cache updating is done now by first reserving space where to write, and then
Timo Sirainen <tss@iki.fi>
parents:
2276
diff
changeset
|
185 |
4655
df8de2e47fb5
Delay opening the cache file until it's actually needed.
Timo Sirainen <tss@iki.fi>
parents:
4451
diff
changeset
|
186 if (!view->cache->opened) |
df8de2e47fb5
Delay opening the cache file until it's actually needed.
Timo Sirainen <tss@iki.fi>
parents:
4451
diff
changeset
|
187 (void)mail_cache_open_and_verify(view->cache); |
df8de2e47fb5
Delay opening the cache file until it's actually needed.
Timo Sirainen <tss@iki.fi>
parents:
4451
diff
changeset
|
188 |
2277
41e56f28d085
Cache updating is done now by first reserving space where to write, and then
Timo Sirainen <tss@iki.fi>
parents:
2276
diff
changeset
|
189 if (MAIL_CACHE_IS_UNUSABLE(view->cache)) |
2298
5beb0c20b6e8
Cache file fixes, API changes, etc. It's still in somewhat ugly state, but
Timo Sirainen <tss@iki.fi>
parents:
2279
diff
changeset
|
190 return 0; |
5beb0c20b6e8
Cache file fixes, API changes, etc. It's still in somewhat ugly state, but
Timo Sirainen <tss@iki.fi>
parents:
2279
diff
changeset
|
191 |
5002
82747a8b0b8b
Removed file offset caching from mail_cache_foreach(). It didn't work
Timo Sirainen <tss@iki.fi>
parents:
4906
diff
changeset
|
192 if ((ret = mail_cache_lookup_offset(view->cache, view->view, |
82747a8b0b8b
Removed file offset caching from mail_cache_foreach(). It didn't work
Timo Sirainen <tss@iki.fi>
parents:
4906
diff
changeset
|
193 seq, &offset)) <= 0) |
82747a8b0b8b
Removed file offset caching from mail_cache_foreach(). It didn't work
Timo Sirainen <tss@iki.fi>
parents:
4906
diff
changeset
|
194 return ret; |
2201
7bdef5ea4591
Several fixes and cleanups to cache file code, still badly broken
Timo Sirainen <tss@iki.fi>
parents:
2200
diff
changeset
|
195 |
2631
519b768e5f2f
Make sure we don't get into infinite loops while reading cache.
Timo Sirainen <tss@iki.fi>
parents:
2619
diff
changeset
|
196 ret = 1; |
5734 | 197 array_clear(&view->looping_offsets); |
2631
519b768e5f2f
Make sure we don't get into infinite loops while reading cache.
Timo Sirainen <tss@iki.fi>
parents:
2619
diff
changeset
|
198 while (offset != 0 && ret > 0) { |
5734 | 199 if (mail_cache_track_loops(&view->looping_offsets, offset)) { |
2631
519b768e5f2f
Make sure we don't get into infinite loops while reading cache.
Timo Sirainen <tss@iki.fi>
parents:
2619
diff
changeset
|
200 mail_cache_set_corrupted(view->cache, |
519b768e5f2f
Make sure we don't get into infinite loops while reading cache.
Timo Sirainen <tss@iki.fi>
parents:
2619
diff
changeset
|
201 "record list is circular"); |
2632
ec5601f71ba0
Fix for circular record list detection, we can't use data stack for buffer.
Timo Sirainen <tss@iki.fi>
parents:
2631
diff
changeset
|
202 return -1; |
2631
519b768e5f2f
Make sure we don't get into infinite loops while reading cache.
Timo Sirainen <tss@iki.fi>
parents:
2619
diff
changeset
|
203 } |
2611 | 204 ret = mail_cache_foreach_rec(view, &offset, |
2315
22210d6cf238
Cache fixes. Lookups now look into transactions too.
Timo Sirainen <tss@iki.fi>
parents:
2298
diff
changeset
|
205 callback, context); |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
206 } |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
207 |
2631
519b768e5f2f
Make sure we don't get into infinite loops while reading cache.
Timo Sirainen <tss@iki.fi>
parents:
2619
diff
changeset
|
208 if (ret > 0 && view->trans_seq1 <= seq && view->trans_seq2 >= seq && |
2853
512dd7d76cdc
Removed cache_offset from mail_index_record and changed it to use extension
Timo Sirainen <tss@iki.fi>
parents:
2708
diff
changeset
|
209 mail_cache_lookup_offset(view->cache, view->trans_view, |
3379 | 210 seq, &offset) > 0) { |
5734 | 211 array_clear(&view->looping_offsets); |
2631
519b768e5f2f
Make sure we don't get into infinite loops while reading cache.
Timo Sirainen <tss@iki.fi>
parents:
2619
diff
changeset
|
212 while (offset != 0 && ret > 0) { |
5734 | 213 if (mail_cache_track_loops(&view->looping_offsets, |
214 offset)) { | |
2631
519b768e5f2f
Make sure we don't get into infinite loops while reading cache.
Timo Sirainen <tss@iki.fi>
parents:
2619
diff
changeset
|
215 mail_cache_set_corrupted(view->cache, |
519b768e5f2f
Make sure we don't get into infinite loops while reading cache.
Timo Sirainen <tss@iki.fi>
parents:
2619
diff
changeset
|
216 "record list is circular"); |
2632
ec5601f71ba0
Fix for circular record list detection, we can't use data stack for buffer.
Timo Sirainen <tss@iki.fi>
parents:
2631
diff
changeset
|
217 return -1; |
2631
519b768e5f2f
Make sure we don't get into infinite loops while reading cache.
Timo Sirainen <tss@iki.fi>
parents:
2619
diff
changeset
|
218 } |
2611 | 219 ret = mail_cache_foreach_rec(view, &offset, |
220 callback, context); | |
2315
22210d6cf238
Cache fixes. Lookups now look into transactions too.
Timo Sirainen <tss@iki.fi>
parents:
2298
diff
changeset
|
221 } |
2298
5beb0c20b6e8
Cache file fixes, API changes, etc. It's still in somewhat ugly state, but
Timo Sirainen <tss@iki.fi>
parents:
2279
diff
changeset
|
222 } |
2631
519b768e5f2f
Make sure we don't get into infinite loops while reading cache.
Timo Sirainen <tss@iki.fi>
parents:
2619
diff
changeset
|
223 |
519b768e5f2f
Make sure we don't get into infinite loops while reading cache.
Timo Sirainen <tss@iki.fi>
parents:
2619
diff
changeset
|
224 return ret; |
2298
5beb0c20b6e8
Cache file fixes, API changes, etc. It's still in somewhat ugly state, but
Timo Sirainen <tss@iki.fi>
parents:
2279
diff
changeset
|
225 } |
5beb0c20b6e8
Cache file fixes, API changes, etc. It's still in somewhat ugly state, but
Timo Sirainen <tss@iki.fi>
parents:
2279
diff
changeset
|
226 |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2315
diff
changeset
|
227 static int |
2619 | 228 mail_cache_seq_callback(struct mail_cache_view *view, uint32_t field, |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2315
diff
changeset
|
229 const void *data __attr_unused__, |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2315
diff
changeset
|
230 size_t data_size __attr_unused__, |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2315
diff
changeset
|
231 void *context __attr_unused__) |
2298
5beb0c20b6e8
Cache file fixes, API changes, etc. It's still in somewhat ugly state, but
Timo Sirainen <tss@iki.fi>
parents:
2279
diff
changeset
|
232 { |
2619 | 233 buffer_write(view->cached_exists_buf, field, |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2315
diff
changeset
|
234 &view->cached_exists_value, 1); |
2298
5beb0c20b6e8
Cache file fixes, API changes, etc. It's still in somewhat ugly state, but
Timo Sirainen <tss@iki.fi>
parents:
2279
diff
changeset
|
235 return 1; |
5beb0c20b6e8
Cache file fixes, API changes, etc. It's still in somewhat ugly state, but
Timo Sirainen <tss@iki.fi>
parents:
2279
diff
changeset
|
236 } |
5beb0c20b6e8
Cache file fixes, API changes, etc. It's still in somewhat ugly state, but
Timo Sirainen <tss@iki.fi>
parents:
2279
diff
changeset
|
237 |
5beb0c20b6e8
Cache file fixes, API changes, etc. It's still in somewhat ugly state, but
Timo Sirainen <tss@iki.fi>
parents:
2279
diff
changeset
|
238 static int mail_cache_seq(struct mail_cache_view *view, uint32_t seq) |
5beb0c20b6e8
Cache file fixes, API changes, etc. It's still in somewhat ugly state, but
Timo Sirainen <tss@iki.fi>
parents:
2279
diff
changeset
|
239 { |
5beb0c20b6e8
Cache file fixes, API changes, etc. It's still in somewhat ugly state, but
Timo Sirainen <tss@iki.fi>
parents:
2279
diff
changeset
|
240 int ret; |
5beb0c20b6e8
Cache file fixes, API changes, etc. It's still in somewhat ugly state, but
Timo Sirainen <tss@iki.fi>
parents:
2279
diff
changeset
|
241 |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2315
diff
changeset
|
242 if (++view->cached_exists_value == 0) { |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2315
diff
changeset
|
243 /* wrapped, we'll have to clear the buffer */ |
5734 | 244 buffer_reset(view->cached_exists_buf); |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2315
diff
changeset
|
245 view->cached_exists_value++; |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2315
diff
changeset
|
246 } |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2315
diff
changeset
|
247 |
2298
5beb0c20b6e8
Cache file fixes, API changes, etc. It's still in somewhat ugly state, but
Timo Sirainen <tss@iki.fi>
parents:
2279
diff
changeset
|
248 view->cached_exists_seq = seq; |
5beb0c20b6e8
Cache file fixes, API changes, etc. It's still in somewhat ugly state, but
Timo Sirainen <tss@iki.fi>
parents:
2279
diff
changeset
|
249 ret = mail_cache_foreach(view, seq, mail_cache_seq_callback, NULL); |
5beb0c20b6e8
Cache file fixes, API changes, etc. It's still in somewhat ugly state, but
Timo Sirainen <tss@iki.fi>
parents:
2279
diff
changeset
|
250 return ret < 0 ? -1 : 0; |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
251 } |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
252 |
5734 | 253 static bool |
254 mail_cache_file_has_field(struct mail_cache *cache, unsigned int field) | |
255 { | |
256 i_assert(field < cache->fields_count); | |
257 return cache->field_file_map[field] != (uint32_t)-1; | |
258 } | |
259 | |
2298
5beb0c20b6e8
Cache file fixes, API changes, etc. It's still in somewhat ugly state, but
Timo Sirainen <tss@iki.fi>
parents:
2279
diff
changeset
|
260 int mail_cache_field_exists(struct mail_cache_view *view, uint32_t seq, |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2315
diff
changeset
|
261 unsigned int field) |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
262 { |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2315
diff
changeset
|
263 const uint8_t *data; |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
264 |
2555
87af1f39a69e
Added support for bitmask type.
Timo Sirainen <tss@iki.fi>
parents:
2419
diff
changeset
|
265 i_assert(seq > 0); |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2315
diff
changeset
|
266 |
4655
df8de2e47fb5
Delay opening the cache file until it's actually needed.
Timo Sirainen <tss@iki.fi>
parents:
4451
diff
changeset
|
267 if (!view->cache->opened) |
df8de2e47fb5
Delay opening the cache file until it's actually needed.
Timo Sirainen <tss@iki.fi>
parents:
4451
diff
changeset
|
268 (void)mail_cache_open_and_verify(view->cache); |
df8de2e47fb5
Delay opening the cache file until it's actually needed.
Timo Sirainen <tss@iki.fi>
parents:
4451
diff
changeset
|
269 |
5734 | 270 if (!mail_cache_file_has_field(view->cache, field)) |
2298
5beb0c20b6e8
Cache file fixes, API changes, etc. It's still in somewhat ugly state, but
Timo Sirainen <tss@iki.fi>
parents:
2279
diff
changeset
|
271 return 0; |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
272 |
5734 | 273 /* FIXME: we should discard the cache if view has been synced */ |
2298
5beb0c20b6e8
Cache file fixes, API changes, etc. It's still in somewhat ugly state, but
Timo Sirainen <tss@iki.fi>
parents:
2279
diff
changeset
|
274 if (view->cached_exists_seq != seq) { |
5beb0c20b6e8
Cache file fixes, API changes, etc. It's still in somewhat ugly state, but
Timo Sirainen <tss@iki.fi>
parents:
2279
diff
changeset
|
275 if (mail_cache_seq(view, seq) < 0) |
5beb0c20b6e8
Cache file fixes, API changes, etc. It's still in somewhat ugly state, but
Timo Sirainen <tss@iki.fi>
parents:
2279
diff
changeset
|
276 return -1; |
5beb0c20b6e8
Cache file fixes, API changes, etc. It's still in somewhat ugly state, but
Timo Sirainen <tss@iki.fi>
parents:
2279
diff
changeset
|
277 } |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2315
diff
changeset
|
278 |
5734 | 279 data = view->cached_exists_buf->data; |
280 return (field <= view->cached_exists_buf->used && | |
281 data[field] == view->cached_exists_value) ? 1 : 0; | |
2298
5beb0c20b6e8
Cache file fixes, API changes, etc. It's still in somewhat ugly state, but
Timo Sirainen <tss@iki.fi>
parents:
2279
diff
changeset
|
282 } |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
283 |
2298
5beb0c20b6e8
Cache file fixes, API changes, etc. It's still in somewhat ugly state, but
Timo Sirainen <tss@iki.fi>
parents:
2279
diff
changeset
|
284 enum mail_cache_decision_type |
5735 | 285 mail_cache_field_get_decision(struct mail_cache *cache, unsigned int field_idx) |
2298
5beb0c20b6e8
Cache file fixes, API changes, etc. It's still in somewhat ugly state, but
Timo Sirainen <tss@iki.fi>
parents:
2279
diff
changeset
|
286 { |
5735 | 287 i_assert(field_idx < cache->fields_count); |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
288 |
5735 | 289 return cache->fields[field_idx].field.decision; |
2298
5beb0c20b6e8
Cache file fixes, API changes, etc. It's still in somewhat ugly state, but
Timo Sirainen <tss@iki.fi>
parents:
2279
diff
changeset
|
290 } |
5beb0c20b6e8
Cache file fixes, API changes, etc. It's still in somewhat ugly state, but
Timo Sirainen <tss@iki.fi>
parents:
2279
diff
changeset
|
291 |
5beb0c20b6e8
Cache file fixes, API changes, etc. It's still in somewhat ugly state, but
Timo Sirainen <tss@iki.fi>
parents:
2279
diff
changeset
|
292 struct mail_cache_lookup_context { |
5beb0c20b6e8
Cache file fixes, API changes, etc. It's still in somewhat ugly state, but
Timo Sirainen <tss@iki.fi>
parents:
2279
diff
changeset
|
293 buffer_t *dest_buf; |
2619 | 294 uint32_t field; |
3863
55df57c028d4
Added "bool" type and changed all ints that were used as booleans to bool.
Timo Sirainen <tss@iki.fi>
parents:
3551
diff
changeset
|
295 bool found; |
2298
5beb0c20b6e8
Cache file fixes, API changes, etc. It's still in somewhat ugly state, but
Timo Sirainen <tss@iki.fi>
parents:
2279
diff
changeset
|
296 }; |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
297 |
2298
5beb0c20b6e8
Cache file fixes, API changes, etc. It's still in somewhat ugly state, but
Timo Sirainen <tss@iki.fi>
parents:
2279
diff
changeset
|
298 static int |
5beb0c20b6e8
Cache file fixes, API changes, etc. It's still in somewhat ugly state, but
Timo Sirainen <tss@iki.fi>
parents:
2279
diff
changeset
|
299 mail_cache_lookup_callback(struct mail_cache_view *view __attr_unused__, |
2619 | 300 uint32_t field, const void *data, |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2315
diff
changeset
|
301 size_t data_size, void *context) |
2298
5beb0c20b6e8
Cache file fixes, API changes, etc. It's still in somewhat ugly state, but
Timo Sirainen <tss@iki.fi>
parents:
2279
diff
changeset
|
302 { |
5beb0c20b6e8
Cache file fixes, API changes, etc. It's still in somewhat ugly state, but
Timo Sirainen <tss@iki.fi>
parents:
2279
diff
changeset
|
303 struct mail_cache_lookup_context *ctx = context; |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
304 |
5734 | 305 i_assert(!ctx->found); |
306 | |
2619 | 307 if (ctx->field != field) |
2298
5beb0c20b6e8
Cache file fixes, API changes, etc. It's still in somewhat ugly state, but
Timo Sirainen <tss@iki.fi>
parents:
2279
diff
changeset
|
308 return 1; |
5beb0c20b6e8
Cache file fixes, API changes, etc. It's still in somewhat ugly state, but
Timo Sirainen <tss@iki.fi>
parents:
2279
diff
changeset
|
309 |
5beb0c20b6e8
Cache file fixes, API changes, etc. It's still in somewhat ugly state, but
Timo Sirainen <tss@iki.fi>
parents:
2279
diff
changeset
|
310 buffer_append(ctx->dest_buf, data, data_size); |
2555
87af1f39a69e
Added support for bitmask type.
Timo Sirainen <tss@iki.fi>
parents:
2419
diff
changeset
|
311 ctx->found = TRUE; |
2298
5beb0c20b6e8
Cache file fixes, API changes, etc. It's still in somewhat ugly state, but
Timo Sirainen <tss@iki.fi>
parents:
2279
diff
changeset
|
312 return 0; |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
313 } |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
314 |
2555
87af1f39a69e
Added support for bitmask type.
Timo Sirainen <tss@iki.fi>
parents:
2419
diff
changeset
|
315 static int |
87af1f39a69e
Added support for bitmask type.
Timo Sirainen <tss@iki.fi>
parents:
2419
diff
changeset
|
316 mail_cache_lookup_bitmask_callback(struct mail_cache_view *view __attr_unused__, |
2619 | 317 uint32_t field, const void *data, |
2555
87af1f39a69e
Added support for bitmask type.
Timo Sirainen <tss@iki.fi>
parents:
2419
diff
changeset
|
318 size_t data_size, void *context) |
87af1f39a69e
Added support for bitmask type.
Timo Sirainen <tss@iki.fi>
parents:
2419
diff
changeset
|
319 { |
87af1f39a69e
Added support for bitmask type.
Timo Sirainen <tss@iki.fi>
parents:
2419
diff
changeset
|
320 struct mail_cache_lookup_context *ctx = context; |
5734 | 321 const unsigned char *src = data; |
2555
87af1f39a69e
Added support for bitmask type.
Timo Sirainen <tss@iki.fi>
parents:
2419
diff
changeset
|
322 unsigned char *dest; |
87af1f39a69e
Added support for bitmask type.
Timo Sirainen <tss@iki.fi>
parents:
2419
diff
changeset
|
323 size_t i; |
87af1f39a69e
Added support for bitmask type.
Timo Sirainen <tss@iki.fi>
parents:
2419
diff
changeset
|
324 |
2619 | 325 if (ctx->field != field) |
2555
87af1f39a69e
Added support for bitmask type.
Timo Sirainen <tss@iki.fi>
parents:
2419
diff
changeset
|
326 return 1; |
87af1f39a69e
Added support for bitmask type.
Timo Sirainen <tss@iki.fi>
parents:
2419
diff
changeset
|
327 |
87af1f39a69e
Added support for bitmask type.
Timo Sirainen <tss@iki.fi>
parents:
2419
diff
changeset
|
328 /* merge all bits */ |
87af1f39a69e
Added support for bitmask type.
Timo Sirainen <tss@iki.fi>
parents:
2419
diff
changeset
|
329 dest = buffer_get_space_unsafe(ctx->dest_buf, 0, data_size); |
87af1f39a69e
Added support for bitmask type.
Timo Sirainen <tss@iki.fi>
parents:
2419
diff
changeset
|
330 for (i = 0; i < data_size; i++) |
5734 | 331 dest[i] |= src[i]; |
2555
87af1f39a69e
Added support for bitmask type.
Timo Sirainen <tss@iki.fi>
parents:
2419
diff
changeset
|
332 ctx->found = TRUE; |
87af1f39a69e
Added support for bitmask type.
Timo Sirainen <tss@iki.fi>
parents:
2419
diff
changeset
|
333 return 1; |
87af1f39a69e
Added support for bitmask type.
Timo Sirainen <tss@iki.fi>
parents:
2419
diff
changeset
|
334 } |
87af1f39a69e
Added support for bitmask type.
Timo Sirainen <tss@iki.fi>
parents:
2419
diff
changeset
|
335 |
2279
ed0bb4c12f03
Cache API updates. Don't return direct pointers to mmaped cache file anymore.
Timo Sirainen <tss@iki.fi>
parents:
2277
diff
changeset
|
336 int mail_cache_lookup_field(struct mail_cache_view *view, buffer_t *dest_buf, |
5735 | 337 uint32_t seq, unsigned int field_idx) |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
338 { |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2315
diff
changeset
|
339 struct mail_cache_lookup_context ctx; |
5734 | 340 const struct mail_cache_field *field_def; |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2315
diff
changeset
|
341 int ret; |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
342 |
5735 | 343 if ((ret = mail_cache_field_exists(view, seq, field_idx)) <= 0) |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2315
diff
changeset
|
344 return ret; |
5735 | 345 field_def = &view->cache->fields[field_idx].field; |
2298
5beb0c20b6e8
Cache file fixes, API changes, etc. It's still in somewhat ugly state, but
Timo Sirainen <tss@iki.fi>
parents:
2279
diff
changeset
|
346 |
5735 | 347 mail_cache_decision_state_update(view, seq, field_idx); |
2298
5beb0c20b6e8
Cache file fixes, API changes, etc. It's still in somewhat ugly state, but
Timo Sirainen <tss@iki.fi>
parents:
2279
diff
changeset
|
348 |
5734 | 349 /* the field should exist */ |
350 memset(&ctx, 0, sizeof(ctx)); | |
5735 | 351 ctx.field = field_idx; |
2298
5beb0c20b6e8
Cache file fixes, API changes, etc. It's still in somewhat ugly state, but
Timo Sirainen <tss@iki.fi>
parents:
2279
diff
changeset
|
352 ctx.dest_buf = dest_buf; |
5734 | 353 |
354 if (field_def->type != MAIL_CACHE_FIELD_BITMASK) { | |
2555
87af1f39a69e
Added support for bitmask type.
Timo Sirainen <tss@iki.fi>
parents:
2419
diff
changeset
|
355 ret = mail_cache_foreach(view, seq, mail_cache_lookup_callback, |
87af1f39a69e
Added support for bitmask type.
Timo Sirainen <tss@iki.fi>
parents:
2419
diff
changeset
|
356 &ctx); |
87af1f39a69e
Added support for bitmask type.
Timo Sirainen <tss@iki.fi>
parents:
2419
diff
changeset
|
357 } else { |
5734 | 358 /* make sure all bits are cleared first */ |
359 buffer_write_zero(dest_buf, 0, field_def->field_size); | |
2555
87af1f39a69e
Added support for bitmask type.
Timo Sirainen <tss@iki.fi>
parents:
2419
diff
changeset
|
360 ret = mail_cache_foreach(view, seq, |
87af1f39a69e
Added support for bitmask type.
Timo Sirainen <tss@iki.fi>
parents:
2419
diff
changeset
|
361 mail_cache_lookup_bitmask_callback, |
87af1f39a69e
Added support for bitmask type.
Timo Sirainen <tss@iki.fi>
parents:
2419
diff
changeset
|
362 &ctx); |
87af1f39a69e
Added support for bitmask type.
Timo Sirainen <tss@iki.fi>
parents:
2419
diff
changeset
|
363 } |
5734 | 364 return ret < 0 ? -1 : (ctx.found ? 1 : 0); |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
365 } |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
366 |
5734 | 367 struct header_lookup_data { |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2315
diff
changeset
|
368 uint32_t offset; |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2315
diff
changeset
|
369 uint32_t data_size; |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2315
diff
changeset
|
370 }; |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
371 |
5734 | 372 struct header_lookup_line { |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2315
diff
changeset
|
373 uint32_t line_num; |
5734 | 374 struct header_lookup_data *data; |
375 }; | |
376 | |
377 enum { | |
378 HDR_FIELD_STATE_DONTWANT = 0, | |
379 HDR_FIELD_STATE_WANT, | |
380 HDR_FIELD_STATE_SEEN | |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2315
diff
changeset
|
381 }; |
2298
5beb0c20b6e8
Cache file fixes, API changes, etc. It's still in somewhat ugly state, but
Timo Sirainen <tss@iki.fi>
parents:
2279
diff
changeset
|
382 |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2315
diff
changeset
|
383 struct header_lookup_context { |
5734 | 384 ARRAY_DEFINE(lines, struct header_lookup_line); |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2315
diff
changeset
|
385 |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2315
diff
changeset
|
386 unsigned int max_field; |
5734 | 387 uint8_t *field_state; |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2315
diff
changeset
|
388 }; |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
389 |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2315
diff
changeset
|
390 static int |
2619 | 391 headers_find_callback(struct mail_cache_view *view, uint32_t field, |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2315
diff
changeset
|
392 const void *data, size_t data_size, void *context) |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2315
diff
changeset
|
393 { |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2315
diff
changeset
|
394 struct header_lookup_context *ctx = context; |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2315
diff
changeset
|
395 const uint32_t *lines = data; |
5734 | 396 struct header_lookup_line hdr_line; |
397 struct header_lookup_data *hdr_data; | |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2315
diff
changeset
|
398 unsigned int i, lines_count; |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2315
diff
changeset
|
399 |
5734 | 400 if (field > ctx->max_field || |
401 ctx->field_state[field] != HDR_FIELD_STATE_WANT) { | |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2315
diff
changeset
|
402 /* a) don't want it, b) duplicate */ |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2315
diff
changeset
|
403 return 1; |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2315
diff
changeset
|
404 } |
5734 | 405 ctx->field_state[field] = HDR_FIELD_STATE_SEEN; |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
406 |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2315
diff
changeset
|
407 /* data = { line_nums[], 0, "headers" } */ |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2315
diff
changeset
|
408 for (i = 0; data_size >= sizeof(uint32_t); i++) { |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2315
diff
changeset
|
409 data_size -= sizeof(uint32_t); |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2315
diff
changeset
|
410 if (lines[i] == 0) |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2315
diff
changeset
|
411 break; |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
412 } |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2315
diff
changeset
|
413 lines_count = i; |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2315
diff
changeset
|
414 |
5734 | 415 hdr_data = t_new(struct header_lookup_data, 1); |
416 hdr_data->offset = (const char *)&lines[lines_count+1] - | |
2866
bf1e718e7370
Cache file works now with mmap_disable=yes. Still needs a few optimizations.
Timo Sirainen <tss@iki.fi>
parents:
2853
diff
changeset
|
417 (const char *)view->cache->data; |
5734 | 418 hdr_data->data_size = (uint32_t)data_size; |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2315
diff
changeset
|
419 |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2315
diff
changeset
|
420 for (i = 0; i < lines_count; i++) { |
5734 | 421 hdr_line.line_num = lines[i]; |
422 hdr_line.data = hdr_data; | |
423 array_append(&ctx->lines, &hdr_line, 1); | |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2315
diff
changeset
|
424 } |
2298
5beb0c20b6e8
Cache file fixes, API changes, etc. It's still in somewhat ugly state, but
Timo Sirainen <tss@iki.fi>
parents:
2279
diff
changeset
|
425 return 1; |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
426 } |
2200
97bb7b127617
Beginnings of getting cache file working again. Easy to break currently, but
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
427 |
5734 | 428 static int header_lookup_line_cmp(const void *p1, const void *p2) |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2315
diff
changeset
|
429 { |
5734 | 430 const struct header_lookup_line *l1 = p1, *l2 = p2; |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2315
diff
changeset
|
431 |
5734 | 432 return (int)l1->line_num - (int)l2->line_num; |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2315
diff
changeset
|
433 } |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2315
diff
changeset
|
434 |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2315
diff
changeset
|
435 int mail_cache_lookup_headers(struct mail_cache_view *view, string_t *dest, |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2315
diff
changeset
|
436 uint32_t seq, unsigned int fields[], |
3278
df372eecc5d0
Several size_t -> unsigned int changes. Try to keep "unsigned int" for
Timo Sirainen <tss@iki.fi>
parents:
3191
diff
changeset
|
437 unsigned int fields_count) |
2200
97bb7b127617
Beginnings of getting cache file working again. Easy to break currently, but
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
438 { |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2315
diff
changeset
|
439 struct mail_cache *cache = view->cache; |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2315
diff
changeset
|
440 struct header_lookup_context ctx; |
5734 | 441 struct header_lookup_line *lines; |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2315
diff
changeset
|
442 const unsigned char *p, *start, *end; |
5734 | 443 unsigned int i, count; |
444 size_t hdr_size; | |
445 uint8_t want = HDR_FIELD_STATE_WANT; | |
2419 | 446 buffer_t *buf; |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2315
diff
changeset
|
447 int ret; |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2315
diff
changeset
|
448 |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2315
diff
changeset
|
449 if (fields_count == 0) |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2315
diff
changeset
|
450 return 1; |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2315
diff
changeset
|
451 |
5732
c341ded6a38a
Make sure cache file is opened when looking up headers.
Timo Sirainen <tss@iki.fi>
parents:
5731
diff
changeset
|
452 if (!view->cache->opened) |
c341ded6a38a
Make sure cache file is opened when looking up headers.
Timo Sirainen <tss@iki.fi>
parents:
5731
diff
changeset
|
453 (void)mail_cache_open_and_verify(view->cache); |
c341ded6a38a
Make sure cache file is opened when looking up headers.
Timo Sirainen <tss@iki.fi>
parents:
5731
diff
changeset
|
454 |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2315
diff
changeset
|
455 t_push(); |
5734 | 456 memset(&ctx, 0, sizeof(ctx)); |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2315
diff
changeset
|
457 |
5734 | 458 /* mark all the fields we want to find. */ |
2708
f1e9f3ec8135
Buffer API change: we no longer support limited sized buffers where
Timo Sirainen <tss@iki.fi>
parents:
2632
diff
changeset
|
459 buf = buffer_create_dynamic(pool_datastack_create(), 32); |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2315
diff
changeset
|
460 for (i = 0; i < fields_count; i++) { |
5734 | 461 if (!mail_cache_file_has_field(cache, fields[i])) { |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2315
diff
changeset
|
462 t_pop(); |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2315
diff
changeset
|
463 return 0; |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2315
diff
changeset
|
464 } |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2315
diff
changeset
|
465 |
2619 | 466 if (fields[i] > ctx.max_field) |
467 ctx.max_field = fields[i]; | |
2419 | 468 |
5734 | 469 buffer_write(buf, fields[i], &want, 1); |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2315
diff
changeset
|
470 } |
5734 | 471 ctx.field_state = buffer_get_modifiable_data(buf, NULL); |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2315
diff
changeset
|
472 |
5734 | 473 /* lookup the fields */ |
474 t_array_init(&ctx.lines, 32); | |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2315
diff
changeset
|
475 ret = mail_cache_foreach(view, seq, headers_find_callback, &ctx); |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2315
diff
changeset
|
476 if (ret <= 0) { |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2315
diff
changeset
|
477 t_pop(); |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2315
diff
changeset
|
478 return ret; |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2315
diff
changeset
|
479 } |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2315
diff
changeset
|
480 |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2315
diff
changeset
|
481 /* check that all fields were found */ |
2340
29cc953f1822
mail_cache_lookup_headers() fix
Timo Sirainen <tss@iki.fi>
parents:
2339
diff
changeset
|
482 for (i = 0; i <= ctx.max_field; i++) { |
5734 | 483 if (ctx.field_state[i] == HDR_FIELD_STATE_WANT) { |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2315
diff
changeset
|
484 t_pop(); |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2315
diff
changeset
|
485 return 0; |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2315
diff
changeset
|
486 } |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2315
diff
changeset
|
487 } |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2315
diff
changeset
|
488 |
5731
e53cd8613542
Cache decisions weren't updated when doing header lookups.
Timo Sirainen <tss@iki.fi>
parents:
5730
diff
changeset
|
489 for (i = 0; i < fields_count; i++) |
5734 | 490 mail_cache_decision_state_update(view, seq, fields[i]); |
5731
e53cd8613542
Cache decisions weren't updated when doing header lookups.
Timo Sirainen <tss@iki.fi>
parents:
5730
diff
changeset
|
491 |
5734 | 492 /* we need to return headers in the order they existed originally. |
493 we can do this by sorting the messages by their line numbers. */ | |
494 lines = array_get_modifiable(&ctx.lines, &count); | |
495 qsort(lines, count, sizeof(*lines), header_lookup_line_cmp); | |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2315
diff
changeset
|
496 |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2315
diff
changeset
|
497 /* then start filling dest buffer from the headers */ |
5734 | 498 for (i = 0; i < count; i++) { |
499 start = CONST_PTR_OFFSET(cache->data, lines[i].data->offset); | |
500 end = start + lines[i].data->data_size; | |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2315
diff
changeset
|
501 |
5734 | 502 /* find the end of the (multiline) header */ |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2315
diff
changeset
|
503 for (p = start; p != end; p++) { |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2315
diff
changeset
|
504 if (*p == '\n' && |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2315
diff
changeset
|
505 (p+1 == end || (p[1] != ' ' && p[1] != '\t'))) { |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2315
diff
changeset
|
506 p++; |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2315
diff
changeset
|
507 break; |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2315
diff
changeset
|
508 } |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2315
diff
changeset
|
509 } |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2315
diff
changeset
|
510 hdr_size = (size_t)(p - start); |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2315
diff
changeset
|
511 buffer_append(dest, start, hdr_size); |
5734 | 512 |
513 /* if there are more lines for this header, the following lines | |
514 continue after this one. so skip this line. */ | |
515 lines[i].data->offset += hdr_size; | |
516 lines[i].data->data_size -= hdr_size; | |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2315
diff
changeset
|
517 } |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2315
diff
changeset
|
518 |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2315
diff
changeset
|
519 t_pop(); |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2315
diff
changeset
|
520 return 1; |
2200
97bb7b127617
Beginnings of getting cache file working again. Easy to break currently, but
Timo Sirainen <tss@iki.fi>
parents:
1915
diff
changeset
|
521 } |