annotate src/lib-index/mail-cache-compress.c @ 2708:f1e9f3ec8135 HEAD

Buffer API change: we no longer support limited sized buffers where writes past limit wouldn't kill the process. They weren't used hardly anywhere, they could have hidden bugs and the code for handling them was too complex. This also changed base64 and hex-binary APIs.
author Timo Sirainen <tss@iki.fi>
date Fri, 08 Oct 2004 20:51:47 +0300
parents 5b07b6fd9bf8
children 512dd7d76cdc
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2247
2d51bb58a070 Added some smartness for deciding what to cache. Cache compression code compiles, but untested.
Timo Sirainen <tss@iki.fi>
parents: 2200
diff changeset
1 /* Copyright (C) 2003-2004 Timo Sirainen */
2d51bb58a070 Added some smartness for deciding what to cache. Cache compression code compiles, but untested.
Timo Sirainen <tss@iki.fi>
parents: 2200
diff changeset
2
2d51bb58a070 Added some smartness for deciding what to cache. Cache compression code compiles, but untested.
Timo Sirainen <tss@iki.fi>
parents: 2200
diff changeset
3 #include "lib.h"
2d51bb58a070 Added some smartness for deciding what to cache. Cache compression code compiles, but untested.
Timo Sirainen <tss@iki.fi>
parents: 2200
diff changeset
4 #include "buffer.h"
2d51bb58a070 Added some smartness for deciding what to cache. Cache compression code compiles, but untested.
Timo Sirainen <tss@iki.fi>
parents: 2200
diff changeset
5 #include "ostream.h"
2275
c68a3c9f6d73 Cache file compression works now and compressed cache file is reopened.
Timo Sirainen <tss@iki.fi>
parents: 2257
diff changeset
6 #include "file-set-size.h"
2247
2d51bb58a070 Added some smartness for deciding what to cache. Cache compression code compiles, but untested.
Timo Sirainen <tss@iki.fi>
parents: 2200
diff changeset
7 #include "mail-cache-private.h"
2d51bb58a070 Added some smartness for deciding what to cache. Cache compression code compiles, but untested.
Timo Sirainen <tss@iki.fi>
parents: 2200
diff changeset
8
2298
5beb0c20b6e8 Cache file fixes, API changes, etc. It's still in somewhat ugly state, but
Timo Sirainen <tss@iki.fi>
parents: 2282
diff changeset
9 struct mail_cache_copy_context {
5beb0c20b6e8 Cache file fixes, API changes, etc. It's still in somewhat ugly state, but
Timo Sirainen <tss@iki.fi>
parents: 2282
diff changeset
10 int new_msg;
2327
7d02e2a7672d Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents: 2299
diff changeset
11 buffer_t *buffer, *field_seen;
7d02e2a7672d Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents: 2299
diff changeset
12 uint8_t field_seen_value;
2298
5beb0c20b6e8 Cache file fixes, API changes, etc. It's still in somewhat ugly state, but
Timo Sirainen <tss@iki.fi>
parents: 2282
diff changeset
13 };
5beb0c20b6e8 Cache file fixes, API changes, etc. It's still in somewhat ugly state, but
Timo Sirainen <tss@iki.fi>
parents: 2282
diff changeset
14
2555
87af1f39a69e Added support for bitmask type.
Timo Sirainen <tss@iki.fi>
parents: 2407
diff changeset
15 static void mail_cache_merge_bitmask(struct mail_cache *cache, buffer_t *buffer,
2619
ce8647d94bfc ID mapping fixes.
Timo Sirainen <tss@iki.fi>
parents: 2604
diff changeset
16 uint32_t field, const void *data,
2555
87af1f39a69e Added support for bitmask type.
Timo Sirainen <tss@iki.fi>
parents: 2407
diff changeset
17 size_t data_size)
87af1f39a69e Added support for bitmask type.
Timo Sirainen <tss@iki.fi>
parents: 2407
diff changeset
18 {
87af1f39a69e Added support for bitmask type.
Timo Sirainen <tss@iki.fi>
parents: 2407
diff changeset
19 void *buf_data;
2620
Timo Sirainen <tss@iki.fi>
parents: 2619
diff changeset
20 uint32_t buf_field;
2555
87af1f39a69e Added support for bitmask type.
Timo Sirainen <tss@iki.fi>
parents: 2407
diff changeset
21 unsigned int i, buf_data_size;
87af1f39a69e Added support for bitmask type.
Timo Sirainen <tss@iki.fi>
parents: 2407
diff changeset
22 size_t pos, buf_size;
87af1f39a69e Added support for bitmask type.
Timo Sirainen <tss@iki.fi>
parents: 2407
diff changeset
23
87af1f39a69e Added support for bitmask type.
Timo Sirainen <tss@iki.fi>
parents: 2407
diff changeset
24 buf_data = buffer_get_modifyable_data(buffer, &buf_size);
87af1f39a69e Added support for bitmask type.
Timo Sirainen <tss@iki.fi>
parents: 2407
diff changeset
25 for (pos = sizeof(struct mail_cache_record); pos < buf_size; ) {
2620
Timo Sirainen <tss@iki.fi>
parents: 2619
diff changeset
26 buf_field = *((uint32_t *)PTR_OFFSET(buf_data, pos));
2555
87af1f39a69e Added support for bitmask type.
Timo Sirainen <tss@iki.fi>
parents: 2407
diff changeset
27 pos += sizeof(uint32_t);
2700
5b07b6fd9bf8 Added asserts
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
28 i_assert(buf_field < cache->fields_count);
2555
87af1f39a69e Added support for bitmask type.
Timo Sirainen <tss@iki.fi>
parents: 2407
diff changeset
29
2623
0157839e3c78 bitmask merging code was corrupting the cache file
Timo Sirainen <tss@iki.fi>
parents: 2620
diff changeset
30 buf_data_size = cache->fields[buf_field].field.field_size;
2555
87af1f39a69e Added support for bitmask type.
Timo Sirainen <tss@iki.fi>
parents: 2407
diff changeset
31 if (buf_data_size == (unsigned int)-1) {
87af1f39a69e Added support for bitmask type.
Timo Sirainen <tss@iki.fi>
parents: 2407
diff changeset
32 buf_data_size =
87af1f39a69e Added support for bitmask type.
Timo Sirainen <tss@iki.fi>
parents: 2407
diff changeset
33 *((uint32_t *)PTR_OFFSET(buf_data, pos));
87af1f39a69e Added support for bitmask type.
Timo Sirainen <tss@iki.fi>
parents: 2407
diff changeset
34 pos += sizeof(uint32_t);
87af1f39a69e Added support for bitmask type.
Timo Sirainen <tss@iki.fi>
parents: 2407
diff changeset
35 }
87af1f39a69e Added support for bitmask type.
Timo Sirainen <tss@iki.fi>
parents: 2407
diff changeset
36
2620
Timo Sirainen <tss@iki.fi>
parents: 2619
diff changeset
37 if (buf_field == field) {
2700
5b07b6fd9bf8 Added asserts
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
38 /* @UNSAFE: found it, do the merging */
2555
87af1f39a69e Added support for bitmask type.
Timo Sirainen <tss@iki.fi>
parents: 2407
diff changeset
39 unsigned char *dest = PTR_OFFSET(buf_data, pos);
87af1f39a69e Added support for bitmask type.
Timo Sirainen <tss@iki.fi>
parents: 2407
diff changeset
40
87af1f39a69e Added support for bitmask type.
Timo Sirainen <tss@iki.fi>
parents: 2407
diff changeset
41 i_assert(buf_data_size == data_size);
2700
5b07b6fd9bf8 Added asserts
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
42 i_assert(pos + buf_data_size <= buf_size);
2555
87af1f39a69e Added support for bitmask type.
Timo Sirainen <tss@iki.fi>
parents: 2407
diff changeset
43 for (i = 0; i < buf_data_size; i++)
87af1f39a69e Added support for bitmask type.
Timo Sirainen <tss@iki.fi>
parents: 2407
diff changeset
44 dest[i] |= ((const unsigned char*)data)[i];
87af1f39a69e Added support for bitmask type.
Timo Sirainen <tss@iki.fi>
parents: 2407
diff changeset
45 break;
87af1f39a69e Added support for bitmask type.
Timo Sirainen <tss@iki.fi>
parents: 2407
diff changeset
46 }
87af1f39a69e Added support for bitmask type.
Timo Sirainen <tss@iki.fi>
parents: 2407
diff changeset
47 pos += (data_size + 3) & ~3;
2700
5b07b6fd9bf8 Added asserts
Timo Sirainen <tss@iki.fi>
parents: 2671
diff changeset
48 i_assert(pos <= buf_size);
2555
87af1f39a69e Added support for bitmask type.
Timo Sirainen <tss@iki.fi>
parents: 2407
diff changeset
49 }
87af1f39a69e Added support for bitmask type.
Timo Sirainen <tss@iki.fi>
parents: 2407
diff changeset
50 }
87af1f39a69e Added support for bitmask type.
Timo Sirainen <tss@iki.fi>
parents: 2407
diff changeset
51
2298
5beb0c20b6e8 Cache file fixes, API changes, etc. It's still in somewhat ugly state, but
Timo Sirainen <tss@iki.fi>
parents: 2282
diff changeset
52 static int
2619
ce8647d94bfc ID mapping fixes.
Timo Sirainen <tss@iki.fi>
parents: 2604
diff changeset
53 mail_cache_compress_callback(struct mail_cache_view *view, uint32_t field,
2298
5beb0c20b6e8 Cache file fixes, API changes, etc. It's still in somewhat ugly state, but
Timo Sirainen <tss@iki.fi>
parents: 2282
diff changeset
54 const void *data, size_t data_size, void *context)
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
55 {
2327
7d02e2a7672d Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents: 2299
diff changeset
56 struct mail_cache_copy_context *ctx = context;
2555
87af1f39a69e Added support for bitmask type.
Timo Sirainen <tss@iki.fi>
parents: 2407
diff changeset
57 struct mail_cache_field *cache_field;
2327
7d02e2a7672d Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents: 2299
diff changeset
58 enum mail_cache_decision_type dec;
7d02e2a7672d Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents: 2299
diff changeset
59 uint8_t *field_seen;
2298
5beb0c20b6e8 Cache file fixes, API changes, etc. It's still in somewhat ugly state, but
Timo Sirainen <tss@iki.fi>
parents: 2282
diff changeset
60 uint32_t size32;
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
61
2555
87af1f39a69e Added support for bitmask type.
Timo Sirainen <tss@iki.fi>
parents: 2407
diff changeset
62 cache_field = &view->cache->fields[field].field;
87af1f39a69e Added support for bitmask type.
Timo Sirainen <tss@iki.fi>
parents: 2407
diff changeset
63
2619
ce8647d94bfc ID mapping fixes.
Timo Sirainen <tss@iki.fi>
parents: 2604
diff changeset
64 field_seen = buffer_get_space_unsafe(ctx->field_seen, field, 1);
2327
7d02e2a7672d Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents: 2299
diff changeset
65 if (*field_seen == ctx->field_seen_value) {
7d02e2a7672d Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents: 2299
diff changeset
66 /* duplicate */
2555
87af1f39a69e Added support for bitmask type.
Timo Sirainen <tss@iki.fi>
parents: 2407
diff changeset
67 if (cache_field->type == MAIL_CACHE_FIELD_BITMASK) {
87af1f39a69e Added support for bitmask type.
Timo Sirainen <tss@iki.fi>
parents: 2407
diff changeset
68 mail_cache_merge_bitmask(view->cache, ctx->buffer,
87af1f39a69e Added support for bitmask type.
Timo Sirainen <tss@iki.fi>
parents: 2407
diff changeset
69 field, data, data_size);
87af1f39a69e Added support for bitmask type.
Timo Sirainen <tss@iki.fi>
parents: 2407
diff changeset
70 }
2327
7d02e2a7672d Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents: 2299
diff changeset
71 return 1;
7d02e2a7672d Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents: 2299
diff changeset
72 }
7d02e2a7672d Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents: 2299
diff changeset
73 *field_seen = ctx->field_seen_value;
7d02e2a7672d Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents: 2299
diff changeset
74
2555
87af1f39a69e Added support for bitmask type.
Timo Sirainen <tss@iki.fi>
parents: 2407
diff changeset
75 dec = cache_field->decision & ~MAIL_CACHE_DECISION_FORCED;
2298
5beb0c20b6e8 Cache file fixes, API changes, etc. It's still in somewhat ugly state, but
Timo Sirainen <tss@iki.fi>
parents: 2282
diff changeset
76 if (ctx->new_msg) {
2327
7d02e2a7672d Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents: 2299
diff changeset
77 if (dec == MAIL_CACHE_DECISION_NO)
2298
5beb0c20b6e8 Cache file fixes, API changes, etc. It's still in somewhat ugly state, but
Timo Sirainen <tss@iki.fi>
parents: 2282
diff changeset
78 return 1;
5beb0c20b6e8 Cache file fixes, API changes, etc. It's still in somewhat ugly state, but
Timo Sirainen <tss@iki.fi>
parents: 2282
diff changeset
79 } else {
2327
7d02e2a7672d Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents: 2299
diff changeset
80 if (dec != MAIL_CACHE_DECISION_YES)
2298
5beb0c20b6e8 Cache file fixes, API changes, etc. It's still in somewhat ugly state, but
Timo Sirainen <tss@iki.fi>
parents: 2282
diff changeset
81 return 1;
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
82 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
83
2619
ce8647d94bfc ID mapping fixes.
Timo Sirainen <tss@iki.fi>
parents: 2604
diff changeset
84 buffer_append(ctx->buffer, &field, sizeof(field));
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
85
2555
87af1f39a69e Added support for bitmask type.
Timo Sirainen <tss@iki.fi>
parents: 2407
diff changeset
86 if (cache_field->field_size == (unsigned int)-1) {
2298
5beb0c20b6e8 Cache file fixes, API changes, etc. It's still in somewhat ugly state, but
Timo Sirainen <tss@iki.fi>
parents: 2282
diff changeset
87 size32 = (uint32_t)data_size;
5beb0c20b6e8 Cache file fixes, API changes, etc. It's still in somewhat ugly state, but
Timo Sirainen <tss@iki.fi>
parents: 2282
diff changeset
88 buffer_append(ctx->buffer, &size32, sizeof(size32));
5beb0c20b6e8 Cache file fixes, API changes, etc. It's still in somewhat ugly state, but
Timo Sirainen <tss@iki.fi>
parents: 2282
diff changeset
89 }
5beb0c20b6e8 Cache file fixes, API changes, etc. It's still in somewhat ugly state, but
Timo Sirainen <tss@iki.fi>
parents: 2282
diff changeset
90
5beb0c20b6e8 Cache file fixes, API changes, etc. It's still in somewhat ugly state, but
Timo Sirainen <tss@iki.fi>
parents: 2282
diff changeset
91 buffer_append(ctx->buffer, data, data_size);
5beb0c20b6e8 Cache file fixes, API changes, etc. It's still in somewhat ugly state, but
Timo Sirainen <tss@iki.fi>
parents: 2282
diff changeset
92 if ((data_size & 3) != 0)
5beb0c20b6e8 Cache file fixes, API changes, etc. It's still in somewhat ugly state, but
Timo Sirainen <tss@iki.fi>
parents: 2282
diff changeset
93 buffer_append(ctx->buffer, null4, 4 - (data_size & 3));
5beb0c20b6e8 Cache file fixes, API changes, etc. It's still in somewhat ugly state, but
Timo Sirainen <tss@iki.fi>
parents: 2282
diff changeset
94 return 1;
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
95 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
96
2247
2d51bb58a070 Added some smartness for deciding what to cache. Cache compression code compiles, but untested.
Timo Sirainen <tss@iki.fi>
parents: 2200
diff changeset
97 static int
2d51bb58a070 Added some smartness for deciding what to cache. Cache compression code compiles, but untested.
Timo Sirainen <tss@iki.fi>
parents: 2200
diff changeset
98 mail_cache_copy(struct mail_cache *cache, struct mail_index_view *view, int fd)
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
99 {
2298
5beb0c20b6e8 Cache file fixes, API changes, etc. It's still in somewhat ugly state, but
Timo Sirainen <tss@iki.fi>
parents: 2282
diff changeset
100 struct mail_cache_copy_context ctx;
2247
2d51bb58a070 Added some smartness for deciding what to cache. Cache compression code compiles, but untested.
Timo Sirainen <tss@iki.fi>
parents: 2200
diff changeset
101 struct mail_cache_view *cache_view;
2d51bb58a070 Added some smartness for deciding what to cache. Cache compression code compiles, but untested.
Timo Sirainen <tss@iki.fi>
parents: 2200
diff changeset
102 struct mail_index_transaction *t;
2d51bb58a070 Added some smartness for deciding what to cache. Cache compression code compiles, but untested.
Timo Sirainen <tss@iki.fi>
parents: 2200
diff changeset
103 const struct mail_index_header *idx_hdr;
2d51bb58a070 Added some smartness for deciding what to cache. Cache compression code compiles, but untested.
Timo Sirainen <tss@iki.fi>
parents: 2200
diff changeset
104 struct mail_cache_header hdr;
2298
5beb0c20b6e8 Cache file fixes, API changes, etc. It's still in somewhat ugly state, but
Timo Sirainen <tss@iki.fi>
parents: 2282
diff changeset
105 struct mail_cache_record cache_rec;
2247
2d51bb58a070 Added some smartness for deciding what to cache. Cache compression code compiles, but untested.
Timo Sirainen <tss@iki.fi>
parents: 2200
diff changeset
106 struct ostream *output;
2327
7d02e2a7672d Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents: 2299
diff changeset
107 buffer_t *buffer;
2619
ce8647d94bfc ID mapping fixes.
Timo Sirainen <tss@iki.fi>
parents: 2604
diff changeset
108 uint32_t i, message_count, seq, first_new_seq, old_offset;
2247
2d51bb58a070 Added some smartness for deciding what to cache. Cache compression code compiles, but untested.
Timo Sirainen <tss@iki.fi>
parents: 2200
diff changeset
109 uoff_t offset;
2d51bb58a070 Added some smartness for deciding what to cache. Cache compression code compiles, but untested.
Timo Sirainen <tss@iki.fi>
parents: 2200
diff changeset
110
2d51bb58a070 Added some smartness for deciding what to cache. Cache compression code compiles, but untested.
Timo Sirainen <tss@iki.fi>
parents: 2200
diff changeset
111 /* get sequence of first message which doesn't need it's temp fields
2d51bb58a070 Added some smartness for deciding what to cache. Cache compression code compiles, but untested.
Timo Sirainen <tss@iki.fi>
parents: 2200
diff changeset
112 removed. */
2d51bb58a070 Added some smartness for deciding what to cache. Cache compression code compiles, but untested.
Timo Sirainen <tss@iki.fi>
parents: 2200
diff changeset
113 if (mail_index_get_header(view, &idx_hdr) < 0)
2d51bb58a070 Added some smartness for deciding what to cache. Cache compression code compiles, but untested.
Timo Sirainen <tss@iki.fi>
parents: 2200
diff changeset
114 return -1;
2275
c68a3c9f6d73 Cache file compression works now and compressed cache file is reopened.
Timo Sirainen <tss@iki.fi>
parents: 2257
diff changeset
115 if (idx_hdr->day_first_uid[7] == 0) {
c68a3c9f6d73 Cache file compression works now and compressed cache file is reopened.
Timo Sirainen <tss@iki.fi>
parents: 2257
diff changeset
116 first_new_seq = 1;
c68a3c9f6d73 Cache file compression works now and compressed cache file is reopened.
Timo Sirainen <tss@iki.fi>
parents: 2257
diff changeset
117 message_count = mail_index_view_get_message_count(view);
c68a3c9f6d73 Cache file compression works now and compressed cache file is reopened.
Timo Sirainen <tss@iki.fi>
parents: 2257
diff changeset
118 } else {
c68a3c9f6d73 Cache file compression works now and compressed cache file is reopened.
Timo Sirainen <tss@iki.fi>
parents: 2257
diff changeset
119 if (mail_index_lookup_uid_range(view, idx_hdr->day_first_uid[7],
c68a3c9f6d73 Cache file compression works now and compressed cache file is reopened.
Timo Sirainen <tss@iki.fi>
parents: 2257
diff changeset
120 (uint32_t)-1, &first_new_seq,
c68a3c9f6d73 Cache file compression works now and compressed cache file is reopened.
Timo Sirainen <tss@iki.fi>
parents: 2257
diff changeset
121 &message_count) < 0)
c68a3c9f6d73 Cache file compression works now and compressed cache file is reopened.
Timo Sirainen <tss@iki.fi>
parents: 2257
diff changeset
122 return -1;
c68a3c9f6d73 Cache file compression works now and compressed cache file is reopened.
Timo Sirainen <tss@iki.fi>
parents: 2257
diff changeset
123 if (first_new_seq == 0)
c68a3c9f6d73 Cache file compression works now and compressed cache file is reopened.
Timo Sirainen <tss@iki.fi>
parents: 2257
diff changeset
124 first_new_seq = message_count+1;
c68a3c9f6d73 Cache file compression works now and compressed cache file is reopened.
Timo Sirainen <tss@iki.fi>
parents: 2257
diff changeset
125 }
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
126
2247
2d51bb58a070 Added some smartness for deciding what to cache. Cache compression code compiles, but untested.
Timo Sirainen <tss@iki.fi>
parents: 2200
diff changeset
127 cache_view = mail_cache_view_open(cache, view);
2d51bb58a070 Added some smartness for deciding what to cache. Cache compression code compiles, but untested.
Timo Sirainen <tss@iki.fi>
parents: 2200
diff changeset
128 t = mail_index_transaction_begin(view, FALSE);
2d51bb58a070 Added some smartness for deciding what to cache. Cache compression code compiles, but untested.
Timo Sirainen <tss@iki.fi>
parents: 2200
diff changeset
129 output = o_stream_create_file(fd, default_pool, 0, FALSE);
2d51bb58a070 Added some smartness for deciding what to cache. Cache compression code compiles, but untested.
Timo Sirainen <tss@iki.fi>
parents: 2200
diff changeset
130
2d51bb58a070 Added some smartness for deciding what to cache. Cache compression code compiles, but untested.
Timo Sirainen <tss@iki.fi>
parents: 2200
diff changeset
131 memset(&hdr, 0, sizeof(hdr));
2276
5f374049abdb Caching fixes and optimizations. Removed all network byte ordering code -
Timo Sirainen <tss@iki.fi>
parents: 2275
diff changeset
132 hdr.version = MAIL_CACHE_VERSION;
2275
c68a3c9f6d73 Cache file compression works now and compressed cache file is reopened.
Timo Sirainen <tss@iki.fi>
parents: 2257
diff changeset
133 hdr.indexid = idx_hdr->indexid;
c68a3c9f6d73 Cache file compression works now and compressed cache file is reopened.
Timo Sirainen <tss@iki.fi>
parents: 2257
diff changeset
134 hdr.file_seq = idx_hdr->cache_file_seq + 1;
2339
406692edc12d Cache fixes. Decisions are saved again.
Timo Sirainen <tss@iki.fi>
parents: 2327
diff changeset
135 o_stream_send(output, &hdr, sizeof(hdr));
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
136
2298
5beb0c20b6e8 Cache file fixes, API changes, etc. It's still in somewhat ugly state, but
Timo Sirainen <tss@iki.fi>
parents: 2282
diff changeset
137 memset(&ctx, 0, sizeof(ctx));
2708
f1e9f3ec8135 Buffer API change: we no longer support limited sized buffers where
Timo Sirainen <tss@iki.fi>
parents: 2700
diff changeset
138 ctx.buffer = buffer_create_dynamic(default_pool, 4096);
f1e9f3ec8135 Buffer API change: we no longer support limited sized buffers where
Timo Sirainen <tss@iki.fi>
parents: 2700
diff changeset
139 ctx.field_seen = buffer_create_dynamic(default_pool, 64);
2327
7d02e2a7672d Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents: 2299
diff changeset
140 ctx.field_seen_value = 0;
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
141
2247
2d51bb58a070 Added some smartness for deciding what to cache. Cache compression code compiles, but untested.
Timo Sirainen <tss@iki.fi>
parents: 2200
diff changeset
142 mail_index_reset_cache(t, hdr.file_seq);
2d51bb58a070 Added some smartness for deciding what to cache. Cache compression code compiles, but untested.
Timo Sirainen <tss@iki.fi>
parents: 2200
diff changeset
143
2d51bb58a070 Added some smartness for deciding what to cache. Cache compression code compiles, but untested.
Timo Sirainen <tss@iki.fi>
parents: 2200
diff changeset
144 for (seq = 1; seq <= message_count; seq++) {
2298
5beb0c20b6e8 Cache file fixes, API changes, etc. It's still in somewhat ugly state, but
Timo Sirainen <tss@iki.fi>
parents: 2282
diff changeset
145 ctx.new_msg = seq >= first_new_seq;
5beb0c20b6e8 Cache file fixes, API changes, etc. It's still in somewhat ugly state, but
Timo Sirainen <tss@iki.fi>
parents: 2282
diff changeset
146 buffer_set_used_size(ctx.buffer, 0);
2327
7d02e2a7672d Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents: 2299
diff changeset
147
7d02e2a7672d Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents: 2299
diff changeset
148 if (++ctx.field_seen_value == 0) {
7d02e2a7672d Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents: 2299
diff changeset
149 memset(buffer_get_modifyable_data(ctx.field_seen, NULL),
7d02e2a7672d Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents: 2299
diff changeset
150 0, buffer_get_size(ctx.field_seen));
7d02e2a7672d Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents: 2299
diff changeset
151 ctx.field_seen_value++;
7d02e2a7672d Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents: 2299
diff changeset
152 }
2298
5beb0c20b6e8 Cache file fixes, API changes, etc. It's still in somewhat ugly state, but
Timo Sirainen <tss@iki.fi>
parents: 2282
diff changeset
153
5beb0c20b6e8 Cache file fixes, API changes, etc. It's still in somewhat ugly state, but
Timo Sirainen <tss@iki.fi>
parents: 2282
diff changeset
154 memset(&cache_rec, 0, sizeof(cache_rec));
5beb0c20b6e8 Cache file fixes, API changes, etc. It's still in somewhat ugly state, but
Timo Sirainen <tss@iki.fi>
parents: 2282
diff changeset
155 buffer_append(ctx.buffer, &cache_rec, sizeof(cache_rec));
5beb0c20b6e8 Cache file fixes, API changes, etc. It's still in somewhat ugly state, but
Timo Sirainen <tss@iki.fi>
parents: 2282
diff changeset
156
2327
7d02e2a7672d Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents: 2299
diff changeset
157 (void)mail_cache_foreach(cache_view, seq,
7d02e2a7672d Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents: 2299
diff changeset
158 mail_cache_compress_callback, &ctx);
2247
2d51bb58a070 Added some smartness for deciding what to cache. Cache compression code compiles, but untested.
Timo Sirainen <tss@iki.fi>
parents: 2200
diff changeset
159
2299
ef0cd18d674c Fixed compression.
Timo Sirainen <tss@iki.fi>
parents: 2298
diff changeset
160 cache_rec.size = buffer_get_used_size(ctx.buffer);
ef0cd18d674c Fixed compression.
Timo Sirainen <tss@iki.fi>
parents: 2298
diff changeset
161 if (cache_rec.size == sizeof(cache_rec))
2298
5beb0c20b6e8 Cache file fixes, API changes, etc. It's still in somewhat ugly state, but
Timo Sirainen <tss@iki.fi>
parents: 2282
diff changeset
162 continue;
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
163
2298
5beb0c20b6e8 Cache file fixes, API changes, etc. It's still in somewhat ugly state, but
Timo Sirainen <tss@iki.fi>
parents: 2282
diff changeset
164 mail_index_update_cache(t, seq, hdr.file_seq,
5beb0c20b6e8 Cache file fixes, API changes, etc. It's still in somewhat ugly state, but
Timo Sirainen <tss@iki.fi>
parents: 2282
diff changeset
165 output->offset, &old_offset);
2299
ef0cd18d674c Fixed compression.
Timo Sirainen <tss@iki.fi>
parents: 2298
diff changeset
166
ef0cd18d674c Fixed compression.
Timo Sirainen <tss@iki.fi>
parents: 2298
diff changeset
167 buffer_write(ctx.buffer, 0, &cache_rec, sizeof(cache_rec));
2298
5beb0c20b6e8 Cache file fixes, API changes, etc. It's still in somewhat ugly state, but
Timo Sirainen <tss@iki.fi>
parents: 2282
diff changeset
168 o_stream_send(output, buffer_get_data(ctx.buffer, NULL),
2299
ef0cd18d674c Fixed compression.
Timo Sirainen <tss@iki.fi>
parents: 2298
diff changeset
169 cache_rec.size);
2247
2d51bb58a070 Added some smartness for deciding what to cache. Cache compression code compiles, but untested.
Timo Sirainen <tss@iki.fi>
parents: 2200
diff changeset
170 }
2619
ce8647d94bfc ID mapping fixes.
Timo Sirainen <tss@iki.fi>
parents: 2604
diff changeset
171
ce8647d94bfc ID mapping fixes.
Timo Sirainen <tss@iki.fi>
parents: 2604
diff changeset
172 if (cache->fields_count != 0) {
ce8647d94bfc ID mapping fixes.
Timo Sirainen <tss@iki.fi>
parents: 2604
diff changeset
173 hdr.field_header_offset =
ce8647d94bfc ID mapping fixes.
Timo Sirainen <tss@iki.fi>
parents: 2604
diff changeset
174 mail_index_uint32_to_offset(output->offset);
ce8647d94bfc ID mapping fixes.
Timo Sirainen <tss@iki.fi>
parents: 2604
diff changeset
175
2671
3b70ddb51771 Renamed "extra record info" and variations of it to "extension" or "ext" in
Timo Sirainen <tss@iki.fi>
parents: 2641
diff changeset
176 /* we wrote everything using our internal field ids. so we want
2619
ce8647d94bfc ID mapping fixes.
Timo Sirainen <tss@iki.fi>
parents: 2604
diff changeset
177 mail_cache_header_fields_get() to use them and ignore any
ce8647d94bfc ID mapping fixes.
Timo Sirainen <tss@iki.fi>
parents: 2604
diff changeset
178 existing id mappings in the old cache file. */
ce8647d94bfc ID mapping fixes.
Timo Sirainen <tss@iki.fi>
parents: 2604
diff changeset
179 cache->file_fields_count = 0;
ce8647d94bfc ID mapping fixes.
Timo Sirainen <tss@iki.fi>
parents: 2604
diff changeset
180 for (i = 0; i < cache->fields_count; i++)
ce8647d94bfc ID mapping fixes.
Timo Sirainen <tss@iki.fi>
parents: 2604
diff changeset
181 cache->field_file_map[i] = (uint32_t)-1;
ce8647d94bfc ID mapping fixes.
Timo Sirainen <tss@iki.fi>
parents: 2604
diff changeset
182
ce8647d94bfc ID mapping fixes.
Timo Sirainen <tss@iki.fi>
parents: 2604
diff changeset
183 t_push();
2708
f1e9f3ec8135 Buffer API change: we no longer support limited sized buffers where
Timo Sirainen <tss@iki.fi>
parents: 2700
diff changeset
184 buffer = buffer_create_dynamic(pool_datastack_create(), 256);
2619
ce8647d94bfc ID mapping fixes.
Timo Sirainen <tss@iki.fi>
parents: 2604
diff changeset
185 mail_cache_header_fields_get(cache, buffer);
ce8647d94bfc ID mapping fixes.
Timo Sirainen <tss@iki.fi>
parents: 2604
diff changeset
186 o_stream_send(output, buffer_get_data(buffer, NULL),
ce8647d94bfc ID mapping fixes.
Timo Sirainen <tss@iki.fi>
parents: 2604
diff changeset
187 buffer_get_used_size(buffer));
ce8647d94bfc ID mapping fixes.
Timo Sirainen <tss@iki.fi>
parents: 2604
diff changeset
188 t_pop();
ce8647d94bfc ID mapping fixes.
Timo Sirainen <tss@iki.fi>
parents: 2604
diff changeset
189 }
ce8647d94bfc ID mapping fixes.
Timo Sirainen <tss@iki.fi>
parents: 2604
diff changeset
190
2276
5f374049abdb Caching fixes and optimizations. Removed all network byte ordering code -
Timo Sirainen <tss@iki.fi>
parents: 2275
diff changeset
191 hdr.used_file_size = output->offset;
2298
5beb0c20b6e8 Cache file fixes, API changes, etc. It's still in somewhat ugly state, but
Timo Sirainen <tss@iki.fi>
parents: 2282
diff changeset
192 buffer_free(ctx.buffer);
2641
e357ebb3137b Memory leak fixes
Timo Sirainen <tss@iki.fi>
parents: 2623
diff changeset
193 buffer_free(ctx.field_seen);
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
194
2275
c68a3c9f6d73 Cache file compression works now and compressed cache file is reopened.
Timo Sirainen <tss@iki.fi>
parents: 2257
diff changeset
195 o_stream_seek(output, 0);
c68a3c9f6d73 Cache file compression works now and compressed cache file is reopened.
Timo Sirainen <tss@iki.fi>
parents: 2257
diff changeset
196 o_stream_send(output, &hdr, sizeof(hdr));
c68a3c9f6d73 Cache file compression works now and compressed cache file is reopened.
Timo Sirainen <tss@iki.fi>
parents: 2257
diff changeset
197
c68a3c9f6d73 Cache file compression works now and compressed cache file is reopened.
Timo Sirainen <tss@iki.fi>
parents: 2257
diff changeset
198 mail_cache_view_close(cache_view);
c68a3c9f6d73 Cache file compression works now and compressed cache file is reopened.
Timo Sirainen <tss@iki.fi>
parents: 2257
diff changeset
199
c68a3c9f6d73 Cache file compression works now and compressed cache file is reopened.
Timo Sirainen <tss@iki.fi>
parents: 2257
diff changeset
200 if (o_stream_flush(output) < 0) {
c68a3c9f6d73 Cache file compression works now and compressed cache file is reopened.
Timo Sirainen <tss@iki.fi>
parents: 2257
diff changeset
201 errno = output->stream_errno;
c68a3c9f6d73 Cache file compression works now and compressed cache file is reopened.
Timo Sirainen <tss@iki.fi>
parents: 2257
diff changeset
202 mail_cache_set_syscall_error(cache, "o_stream_flush()");
c68a3c9f6d73 Cache file compression works now and compressed cache file is reopened.
Timo Sirainen <tss@iki.fi>
parents: 2257
diff changeset
203 (void)mail_index_transaction_rollback(t);
c68a3c9f6d73 Cache file compression works now and compressed cache file is reopened.
Timo Sirainen <tss@iki.fi>
parents: 2257
diff changeset
204 o_stream_unref(output);
c68a3c9f6d73 Cache file compression works now and compressed cache file is reopened.
Timo Sirainen <tss@iki.fi>
parents: 2257
diff changeset
205 return -1;
c68a3c9f6d73 Cache file compression works now and compressed cache file is reopened.
Timo Sirainen <tss@iki.fi>
parents: 2257
diff changeset
206 }
c68a3c9f6d73 Cache file compression works now and compressed cache file is reopened.
Timo Sirainen <tss@iki.fi>
parents: 2257
diff changeset
207
2299
ef0cd18d674c Fixed compression.
Timo Sirainen <tss@iki.fi>
parents: 2298
diff changeset
208 if (hdr.used_file_size < MAIL_CACHE_INITIAL_SIZE) {
2275
c68a3c9f6d73 Cache file compression works now and compressed cache file is reopened.
Timo Sirainen <tss@iki.fi>
parents: 2257
diff changeset
209 /* grow the file some more. doesn't matter if it fails */
c68a3c9f6d73 Cache file compression works now and compressed cache file is reopened.
Timo Sirainen <tss@iki.fi>
parents: 2257
diff changeset
210 (void)file_set_size(fd, MAIL_CACHE_INITIAL_SIZE);
c68a3c9f6d73 Cache file compression works now and compressed cache file is reopened.
Timo Sirainen <tss@iki.fi>
parents: 2257
diff changeset
211 }
c68a3c9f6d73 Cache file compression works now and compressed cache file is reopened.
Timo Sirainen <tss@iki.fi>
parents: 2257
diff changeset
212
2247
2d51bb58a070 Added some smartness for deciding what to cache. Cache compression code compiles, but untested.
Timo Sirainen <tss@iki.fi>
parents: 2200
diff changeset
213 o_stream_unref(output);
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
214
2247
2d51bb58a070 Added some smartness for deciding what to cache. Cache compression code compiles, but untested.
Timo Sirainen <tss@iki.fi>
parents: 2200
diff changeset
215 if (fdatasync(fd) < 0) {
2d51bb58a070 Added some smartness for deciding what to cache. Cache compression code compiles, but untested.
Timo Sirainen <tss@iki.fi>
parents: 2200
diff changeset
216 mail_cache_set_syscall_error(cache, "fdatasync()");
2d51bb58a070 Added some smartness for deciding what to cache. Cache compression code compiles, but untested.
Timo Sirainen <tss@iki.fi>
parents: 2200
diff changeset
217 (void)mail_index_transaction_rollback(t);
2d51bb58a070 Added some smartness for deciding what to cache. Cache compression code compiles, but untested.
Timo Sirainen <tss@iki.fi>
parents: 2200
diff changeset
218 return -1;
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
219 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
220
2247
2d51bb58a070 Added some smartness for deciding what to cache. Cache compression code compiles, but untested.
Timo Sirainen <tss@iki.fi>
parents: 2200
diff changeset
221 return mail_index_transaction_commit(t, &seq, &offset);
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
222 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
223
2247
2d51bb58a070 Added some smartness for deciding what to cache. Cache compression code compiles, but untested.
Timo Sirainen <tss@iki.fi>
parents: 2200
diff changeset
224 int mail_cache_compress(struct mail_cache *cache, struct mail_index_view *view)
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
225 {
2275
c68a3c9f6d73 Cache file compression works now and compressed cache file is reopened.
Timo Sirainen <tss@iki.fi>
parents: 2257
diff changeset
226 int fd, ret, locked;
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
227
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
228 if ((ret = mail_cache_lock(cache)) < 0)
2275
c68a3c9f6d73 Cache file compression works now and compressed cache file is reopened.
Timo Sirainen <tss@iki.fi>
parents: 2257
diff changeset
229 return -1;
c68a3c9f6d73 Cache file compression works now and compressed cache file is reopened.
Timo Sirainen <tss@iki.fi>
parents: 2257
diff changeset
230 locked = ret > 0;
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
231
2327
7d02e2a7672d Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents: 2299
diff changeset
232 /* get the latest info on fields */
7d02e2a7672d Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents: 2299
diff changeset
233 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: 2299
diff changeset
234 if (locked) mail_cache_unlock(cache);
7d02e2a7672d Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents: 2299
diff changeset
235 return -1;
7d02e2a7672d Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents: 2299
diff changeset
236 }
7d02e2a7672d Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents: 2299
diff changeset
237
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
238 #ifdef DEBUG
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
239 i_warning("Compressing cache file %s", cache->filepath);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
240 #endif
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
241
2247
2d51bb58a070 Added some smartness for deciding what to cache. Cache compression code compiles, but untested.
Timo Sirainen <tss@iki.fi>
parents: 2200
diff changeset
242 fd = file_dotlock_open(cache->filepath, NULL, NULL,
2d51bb58a070 Added some smartness for deciding what to cache. Cache compression code compiles, but untested.
Timo Sirainen <tss@iki.fi>
parents: 2200
diff changeset
243 MAIL_CACHE_LOCK_TIMEOUT,
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
244 MAIL_CACHE_LOCK_CHANGE_TIMEOUT,
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
245 MAIL_CACHE_LOCK_IMMEDIATE_TIMEOUT, NULL, NULL);
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
246 if (fd == -1) {
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
247 mail_cache_set_syscall_error(cache, "file_dotlock_open()");
2327
7d02e2a7672d Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents: 2299
diff changeset
248 if (locked) mail_cache_unlock(cache);
2247
2d51bb58a070 Added some smartness for deciding what to cache. Cache compression code compiles, but untested.
Timo Sirainen <tss@iki.fi>
parents: 2200
diff changeset
249 return -1;
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
250 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
251
2298
5beb0c20b6e8 Cache file fixes, API changes, etc. It's still in somewhat ugly state, but
Timo Sirainen <tss@iki.fi>
parents: 2282
diff changeset
252 // FIXME: check that cache file wasn't just recreated
2276
5f374049abdb Caching fixes and optimizations. Removed all network byte ordering code -
Timo Sirainen <tss@iki.fi>
parents: 2275
diff changeset
253
2275
c68a3c9f6d73 Cache file compression works now and compressed cache file is reopened.
Timo Sirainen <tss@iki.fi>
parents: 2257
diff changeset
254 ret = 0;
2247
2d51bb58a070 Added some smartness for deciding what to cache. Cache compression code compiles, but untested.
Timo Sirainen <tss@iki.fi>
parents: 2200
diff changeset
255 if (mail_cache_copy(cache, view, fd) < 0) {
2d51bb58a070 Added some smartness for deciding what to cache. Cache compression code compiles, but untested.
Timo Sirainen <tss@iki.fi>
parents: 2200
diff changeset
256 (void)file_dotlock_delete(cache->filepath, NULL, fd);
2d51bb58a070 Added some smartness for deciding what to cache. Cache compression code compiles, but untested.
Timo Sirainen <tss@iki.fi>
parents: 2200
diff changeset
257 ret = -1;
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
258 } else {
2247
2d51bb58a070 Added some smartness for deciding what to cache. Cache compression code compiles, but untested.
Timo Sirainen <tss@iki.fi>
parents: 2200
diff changeset
259 if (file_dotlock_replace(cache->filepath, NULL,
2d51bb58a070 Added some smartness for deciding what to cache. Cache compression code compiles, but untested.
Timo Sirainen <tss@iki.fi>
parents: 2200
diff changeset
260 -1, FALSE) < 0) {
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
261 mail_cache_set_syscall_error(cache,
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
262 "file_dotlock_replace()");
2247
2d51bb58a070 Added some smartness for deciding what to cache. Cache compression code compiles, but untested.
Timo Sirainen <tss@iki.fi>
parents: 2200
diff changeset
263 (void)close(fd);
2d51bb58a070 Added some smartness for deciding what to cache. Cache compression code compiles, but untested.
Timo Sirainen <tss@iki.fi>
parents: 2200
diff changeset
264 ret = -1;
2d51bb58a070 Added some smartness for deciding what to cache. Cache compression code compiles, but untested.
Timo Sirainen <tss@iki.fi>
parents: 2200
diff changeset
265 } else {
2d51bb58a070 Added some smartness for deciding what to cache. Cache compression code compiles, but untested.
Timo Sirainen <tss@iki.fi>
parents: 2200
diff changeset
266 mail_cache_file_close(cache);
2d51bb58a070 Added some smartness for deciding what to cache. Cache compression code compiles, but untested.
Timo Sirainen <tss@iki.fi>
parents: 2200
diff changeset
267 cache->fd = fd;
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
268
2275
c68a3c9f6d73 Cache file compression works now and compressed cache file is reopened.
Timo Sirainen <tss@iki.fi>
parents: 2257
diff changeset
269 if (mail_cache_map(cache, 0, 0) < 0)
2247
2d51bb58a070 Added some smartness for deciding what to cache. Cache compression code compiles, but untested.
Timo Sirainen <tss@iki.fi>
parents: 2200
diff changeset
270 ret = -1;
2327
7d02e2a7672d Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents: 2299
diff changeset
271 else 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: 2299
diff changeset
272 ret = -1;
2247
2d51bb58a070 Added some smartness for deciding what to cache. Cache compression code compiles, but untested.
Timo Sirainen <tss@iki.fi>
parents: 2200
diff changeset
273 }
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
274 }
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
275
2276
5f374049abdb Caching fixes and optimizations. Removed all network byte ordering code -
Timo Sirainen <tss@iki.fi>
parents: 2275
diff changeset
276 if (locked)
5f374049abdb Caching fixes and optimizations. Removed all network byte ordering code -
Timo Sirainen <tss@iki.fi>
parents: 2275
diff changeset
277 mail_cache_unlock(cache);
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
278
2247
2d51bb58a070 Added some smartness for deciding what to cache. Cache compression code compiles, but untested.
Timo Sirainen <tss@iki.fi>
parents: 2200
diff changeset
279 if (ret == 0)
2d51bb58a070 Added some smartness for deciding what to cache. Cache compression code compiles, but untested.
Timo Sirainen <tss@iki.fi>
parents: 2200
diff changeset
280 cache->need_compress = FALSE;
1915
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
281 return ret;
79790750c349 importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
282 }
2247
2d51bb58a070 Added some smartness for deciding what to cache. Cache compression code compiles, but untested.
Timo Sirainen <tss@iki.fi>
parents: 2200
diff changeset
283
2d51bb58a070 Added some smartness for deciding what to cache. Cache compression code compiles, but untested.
Timo Sirainen <tss@iki.fi>
parents: 2200
diff changeset
284 int mail_cache_need_compress(struct mail_cache *cache)
2d51bb58a070 Added some smartness for deciding what to cache. Cache compression code compiles, but untested.
Timo Sirainen <tss@iki.fi>
parents: 2200
diff changeset
285 {
2275
c68a3c9f6d73 Cache file compression works now and compressed cache file is reopened.
Timo Sirainen <tss@iki.fi>
parents: 2257
diff changeset
286 return cache->need_compress;
2247
2d51bb58a070 Added some smartness for deciding what to cache. Cache compression code compiles, but untested.
Timo Sirainen <tss@iki.fi>
parents: 2200
diff changeset
287 }