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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
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
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
18 i_assert(offset != 0);
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
19
5734
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
20 /* we don't know yet how large the record is, so just guess */
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
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
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
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
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
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
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
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
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
34 if (rec->size > CACHE_PREFETCH) {
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
35 /* larger than we guessed. map the rest of the record. */
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
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
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
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
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
41 if (rec->size > cache->mmap_length ||
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
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
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
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
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
64 if (data == NULL || *((const uint32_t *)data) == 0) {
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
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
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
69 if (!mail_index_map_get_ext_idx(map, cache->ext_id, &idx))
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
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
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
73 /* reset_id must match file_seq or the offset is for a different cache
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
74 file. if this happens, try if reopening the cache helps. if not,
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
75 it was probably for an old cache file that's already lost by now. */
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
76 i = 0;
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
77 while (cache->hdr->file_seq != ext->reset_id) {
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
78 if (++i == 2)
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
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
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
81 if ((ret = mail_cache_reopen(cache)) <= 0) {
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
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
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
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
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
87 *offset_r = *((const uint32_t *)data);
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
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
8ab92fe191c9 a few more cache fixes
Timo Sirainen <tss@iki.fi>
parents: 2577
diff changeset
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
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
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
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
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
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
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
8ab92fe191c9 a few more cache fixes
Timo Sirainen <tss@iki.fi>
parents: 2577
diff changeset
104
5734
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
105 rec_size = rec->size;
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
106 for (pos = sizeof(*rec); pos + sizeof(uint32_t) <= rec_size; ) {
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
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
fe4b0f597c38 Added debugging
Timo Sirainen <tss@iki.fi>
parents: 2555
diff changeset
117 "field index too large (%u >= %u)",
fe4b0f597c38 Added debugging
Timo Sirainen <tss@iki.fi>
parents: 2555
diff changeset
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
8ab92fe191c9 a few more cache fixes
Timo Sirainen <tss@iki.fi>
parents: 2577
diff changeset
121
8ab92fe191c9 a few more cache fixes
Timo Sirainen <tss@iki.fi>
parents: 2577
diff changeset
122 /* field reading might have re-mmaped the file and
5734
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
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
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
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
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
132 /* variable size field. get its size from the file. */
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
133 if (pos + sizeof(uint32_t) > rec_size) {
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
134 /* broken. we'll catch this error below. */
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
135 } else {
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
136 data_size = *((const uint32_t *)
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
137 CONST_PTR_OFFSET(rec, pos));
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
138 pos += sizeof(uint32_t);
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
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
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
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
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
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
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
153 /* each record begins from 32bit aligned position */
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
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
8ab92fe191c9 a few more cache fixes
Timo Sirainen <tss@iki.fi>
parents: 2577
diff changeset
156
5734
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
157 if (pos != rec_size) {
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
158 mail_cache_set_corrupted(cache, "record has invalid size");
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
159 return -1;
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
160 }
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
161
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
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
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
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
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
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
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
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
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
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
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
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
8ab92fe191c9 a few more cache fixes
Timo Sirainen <tss@iki.fi>
parents: 2577
diff changeset
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
f8bf5e2a7fb0 Error handling fixes
Timo Sirainen <tss@iki.fi>
parents: 3278
diff changeset
210 seq, &offset) > 0) {
5734
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
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
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
213 if (mail_cache_track_loops(&view->looping_offsets,
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
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
8ab92fe191c9 a few more cache fixes
Timo Sirainen <tss@iki.fi>
parents: 2577
diff changeset
219 ret = mail_cache_foreach_rec(view, &offset,
8ab92fe191c9 a few more cache fixes
Timo Sirainen <tss@iki.fi>
parents: 2577
diff changeset
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
ce8647d94bfc ID mapping fixes.
Timo Sirainen <tss@iki.fi>
parents: 2611
diff changeset
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
ce8647d94bfc ID mapping fixes.
Timo Sirainen <tss@iki.fi>
parents: 2611
diff changeset
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
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
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
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
253 static bool
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
254 mail_cache_file_has_field(struct mail_cache *cache, unsigned int field)
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
255 {
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
256 i_assert(field < cache->fields_count);
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
257 return cache->field_file_map[field] != (uint32_t)-1;
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
258 }
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
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
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
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
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
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
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
279 data = view->cached_exists_buf->data;
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
280 return (field <= view->cached_exists_buf->used &&
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
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
5763c2548153 s/field/field_idx/
Timo Sirainen <tss@iki.fi>
parents: 5734
diff changeset
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
5763c2548153 s/field/field_idx/
Timo Sirainen <tss@iki.fi>
parents: 5734
diff changeset
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
5763c2548153 s/field/field_idx/
Timo Sirainen <tss@iki.fi>
parents: 5734
diff changeset
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
ce8647d94bfc ID mapping fixes.
Timo Sirainen <tss@iki.fi>
parents: 2611
diff changeset
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
ce8647d94bfc ID mapping fixes.
Timo Sirainen <tss@iki.fi>
parents: 2611
diff changeset
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
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
305 i_assert(!ctx->found);
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
306
2619
ce8647d94bfc ID mapping fixes.
Timo Sirainen <tss@iki.fi>
parents: 2611
diff changeset
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
ce8647d94bfc ID mapping fixes.
Timo Sirainen <tss@iki.fi>
parents: 2611
diff changeset
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
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
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
ce8647d94bfc ID mapping fixes.
Timo Sirainen <tss@iki.fi>
parents: 2611
diff changeset
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
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
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
5763c2548153 s/field/field_idx/
Timo Sirainen <tss@iki.fi>
parents: 5734
diff changeset
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
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
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
5763c2548153 s/field/field_idx/
Timo Sirainen <tss@iki.fi>
parents: 5734
diff changeset
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
5763c2548153 s/field/field_idx/
Timo Sirainen <tss@iki.fi>
parents: 5734
diff changeset
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
5763c2548153 s/field/field_idx/
Timo Sirainen <tss@iki.fi>
parents: 5734
diff changeset
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
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
349 /* the field should exist */
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
350 memset(&ctx, 0, sizeof(ctx));
5735
5763c2548153 s/field/field_idx/
Timo Sirainen <tss@iki.fi>
parents: 5734
diff changeset
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
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
353
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
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
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
358 /* make sure all bits are cleared first */
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
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
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
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
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
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
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
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
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
374 struct header_lookup_data *data;
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
375 };
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
376
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
377 enum {
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
378 HDR_FIELD_STATE_DONTWANT = 0,
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
379 HDR_FIELD_STATE_WANT,
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
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
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
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
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
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
ce8647d94bfc ID mapping fixes.
Timo Sirainen <tss@iki.fi>
parents: 2611
diff changeset
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
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
396 struct header_lookup_line hdr_line;
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
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
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
400 if (field > ctx->max_field ||
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
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
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
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
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
415 hdr_data = t_new(struct header_lookup_data, 1);
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
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
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
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
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
421 hdr_line.line_num = lines[i];
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
422 hdr_line.data = hdr_data;
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
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
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
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
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
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
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
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
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
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
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
443 unsigned int i, count;
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
444 size_t hdr_size;
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
445 uint8_t want = HDR_FIELD_STATE_WANT;
2419
Timo Sirainen <tss@iki.fi>
parents: 2340
diff changeset
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
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
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
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
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
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
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
ce8647d94bfc ID mapping fixes.
Timo Sirainen <tss@iki.fi>
parents: 2611
diff changeset
466 if (fields[i] > ctx.max_field)
ce8647d94bfc ID mapping fixes.
Timo Sirainen <tss@iki.fi>
parents: 2611
diff changeset
467 ctx.max_field = fields[i];
2419
Timo Sirainen <tss@iki.fi>
parents: 2340
diff changeset
468
5734
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
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
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
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
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
473 /* lookup the fields */
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
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
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
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
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
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
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
492 /* we need to return headers in the order they existed originally.
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
493 we can do this by sorting the messages by their line numbers. */
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
494 lines = array_get_modifiable(&ctx.lines, &count);
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
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
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
498 for (i = 0; i < count; i++) {
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
499 start = CONST_PTR_OFFSET(cache->data, lines[i].data->offset);
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
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
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
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
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
512
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
513 /* if there are more lines for this header, the following lines
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
514 continue after this one. so skip this line. */
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
515 lines[i].data->offset += hdr_size;
5f0832288007 Cache code cleanups
Timo Sirainen <tss@iki.fi>
parents: 5732
diff changeset
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 }