Mercurial > dovecot > original-hg > dovecot-1.2
annotate src/lib-index/mail-cache-compress.c @ 2555:87af1f39a69e HEAD
Added support for bitmask type.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Sat, 04 Sep 2004 13:26:36 +0300 |
parents | fed6d07bd8ee |
children | 9c6238e7a394 |
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 |
2d51bb58a070
Added some smartness for deciding what to cache. Cache compression code compiles, but untested.
Timo Sirainen <tss@iki.fi>
parents:
2200
diff
changeset
|
9 static unsigned char null4[4] = { 0, 0, 0, 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
|
10 |
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
|
11 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
|
12 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
|
13 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
|
14 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
|
15 }; |
5beb0c20b6e8
Cache file fixes, API changes, etc. It's still in somewhat ugly state, but
Timo Sirainen <tss@iki.fi>
parents:
2282
diff
changeset
|
16 |
2555
87af1f39a69e
Added support for bitmask type.
Timo Sirainen <tss@iki.fi>
parents:
2407
diff
changeset
|
17 static void mail_cache_merge_bitmask(struct mail_cache *cache, buffer_t *buffer, |
87af1f39a69e
Added support for bitmask type.
Timo Sirainen <tss@iki.fi>
parents:
2407
diff
changeset
|
18 uint32_t file_field, const void *data, |
87af1f39a69e
Added support for bitmask type.
Timo Sirainen <tss@iki.fi>
parents:
2407
diff
changeset
|
19 size_t data_size) |
87af1f39a69e
Added support for bitmask type.
Timo Sirainen <tss@iki.fi>
parents:
2407
diff
changeset
|
20 { |
87af1f39a69e
Added support for bitmask type.
Timo Sirainen <tss@iki.fi>
parents:
2407
diff
changeset
|
21 void *buf_data; |
87af1f39a69e
Added support for bitmask type.
Timo Sirainen <tss@iki.fi>
parents:
2407
diff
changeset
|
22 uint32_t field, buf_file_field; |
87af1f39a69e
Added support for bitmask type.
Timo Sirainen <tss@iki.fi>
parents:
2407
diff
changeset
|
23 unsigned int i, buf_data_size; |
87af1f39a69e
Added support for bitmask type.
Timo Sirainen <tss@iki.fi>
parents:
2407
diff
changeset
|
24 size_t pos, buf_size; |
87af1f39a69e
Added support for bitmask type.
Timo Sirainen <tss@iki.fi>
parents:
2407
diff
changeset
|
25 |
87af1f39a69e
Added support for bitmask type.
Timo Sirainen <tss@iki.fi>
parents:
2407
diff
changeset
|
26 buf_data = buffer_get_modifyable_data(buffer, &buf_size); |
87af1f39a69e
Added support for bitmask type.
Timo Sirainen <tss@iki.fi>
parents:
2407
diff
changeset
|
27 for (pos = sizeof(struct mail_cache_record); pos < buf_size; ) { |
87af1f39a69e
Added support for bitmask type.
Timo Sirainen <tss@iki.fi>
parents:
2407
diff
changeset
|
28 buf_file_field = *((uint32_t *)PTR_OFFSET(buf_data, pos)); |
87af1f39a69e
Added support for bitmask type.
Timo Sirainen <tss@iki.fi>
parents:
2407
diff
changeset
|
29 pos += sizeof(uint32_t); |
87af1f39a69e
Added support for bitmask type.
Timo Sirainen <tss@iki.fi>
parents:
2407
diff
changeset
|
30 |
87af1f39a69e
Added support for bitmask type.
Timo Sirainen <tss@iki.fi>
parents:
2407
diff
changeset
|
31 field = cache->file_field_map[file_field]; |
87af1f39a69e
Added support for bitmask type.
Timo Sirainen <tss@iki.fi>
parents:
2407
diff
changeset
|
32 buf_data_size = cache->fields[field].field.field_size; |
87af1f39a69e
Added support for bitmask type.
Timo Sirainen <tss@iki.fi>
parents:
2407
diff
changeset
|
33 if (buf_data_size == (unsigned int)-1) { |
87af1f39a69e
Added support for bitmask type.
Timo Sirainen <tss@iki.fi>
parents:
2407
diff
changeset
|
34 buf_data_size = |
87af1f39a69e
Added support for bitmask type.
Timo Sirainen <tss@iki.fi>
parents:
2407
diff
changeset
|
35 *((uint32_t *)PTR_OFFSET(buf_data, pos)); |
87af1f39a69e
Added support for bitmask type.
Timo Sirainen <tss@iki.fi>
parents:
2407
diff
changeset
|
36 pos += sizeof(uint32_t); |
87af1f39a69e
Added support for bitmask type.
Timo Sirainen <tss@iki.fi>
parents:
2407
diff
changeset
|
37 } |
87af1f39a69e
Added support for bitmask type.
Timo Sirainen <tss@iki.fi>
parents:
2407
diff
changeset
|
38 |
87af1f39a69e
Added support for bitmask type.
Timo Sirainen <tss@iki.fi>
parents:
2407
diff
changeset
|
39 if (buf_file_field == file_field) { |
87af1f39a69e
Added support for bitmask type.
Timo Sirainen <tss@iki.fi>
parents:
2407
diff
changeset
|
40 /* found it, do the merging */ |
87af1f39a69e
Added support for bitmask type.
Timo Sirainen <tss@iki.fi>
parents:
2407
diff
changeset
|
41 unsigned char *dest = PTR_OFFSET(buf_data, pos); |
87af1f39a69e
Added support for bitmask type.
Timo Sirainen <tss@iki.fi>
parents:
2407
diff
changeset
|
42 |
87af1f39a69e
Added support for bitmask type.
Timo Sirainen <tss@iki.fi>
parents:
2407
diff
changeset
|
43 i_assert(buf_data_size == data_size); |
87af1f39a69e
Added support for bitmask type.
Timo Sirainen <tss@iki.fi>
parents:
2407
diff
changeset
|
44 for (i = 0; i < buf_data_size; i++) |
87af1f39a69e
Added support for bitmask type.
Timo Sirainen <tss@iki.fi>
parents:
2407
diff
changeset
|
45 dest[i] |= ((const unsigned char*)data)[i]; |
87af1f39a69e
Added support for bitmask type.
Timo Sirainen <tss@iki.fi>
parents:
2407
diff
changeset
|
46 break; |
87af1f39a69e
Added support for bitmask type.
Timo Sirainen <tss@iki.fi>
parents:
2407
diff
changeset
|
47 } |
87af1f39a69e
Added support for bitmask type.
Timo Sirainen <tss@iki.fi>
parents:
2407
diff
changeset
|
48 pos += (data_size + 3) & ~3; |
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 |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2299
diff
changeset
|
53 mail_cache_compress_callback(struct mail_cache_view *view, uint32_t file_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 unsigned int field; |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2299
diff
changeset
|
60 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
|
61 uint32_t size32; |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
62 |
2555
87af1f39a69e
Added support for bitmask type.
Timo Sirainen <tss@iki.fi>
parents:
2407
diff
changeset
|
63 field = view->cache->file_field_map[file_field]; |
87af1f39a69e
Added support for bitmask type.
Timo Sirainen <tss@iki.fi>
parents:
2407
diff
changeset
|
64 cache_field = &view->cache->fields[field].field; |
87af1f39a69e
Added support for bitmask type.
Timo Sirainen <tss@iki.fi>
parents:
2407
diff
changeset
|
65 |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2299
diff
changeset
|
66 field_seen = buffer_get_space_unsafe(ctx->field_seen, file_field, 1); |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2299
diff
changeset
|
67 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
|
68 /* duplicate */ |
2555
87af1f39a69e
Added support for bitmask type.
Timo Sirainen <tss@iki.fi>
parents:
2407
diff
changeset
|
69 if (cache_field->type == MAIL_CACHE_FIELD_BITMASK) { |
87af1f39a69e
Added support for bitmask type.
Timo Sirainen <tss@iki.fi>
parents:
2407
diff
changeset
|
70 mail_cache_merge_bitmask(view->cache, ctx->buffer, |
87af1f39a69e
Added support for bitmask type.
Timo Sirainen <tss@iki.fi>
parents:
2407
diff
changeset
|
71 field, data, data_size); |
87af1f39a69e
Added support for bitmask type.
Timo Sirainen <tss@iki.fi>
parents:
2407
diff
changeset
|
72 } |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2299
diff
changeset
|
73 return 1; |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2299
diff
changeset
|
74 } |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2299
diff
changeset
|
75 *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
|
76 |
2555
87af1f39a69e
Added support for bitmask type.
Timo Sirainen <tss@iki.fi>
parents:
2407
diff
changeset
|
77 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
|
78 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
|
79 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
|
80 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
|
81 } else { |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2299
diff
changeset
|
82 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
|
83 return 1; |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
84 } |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
85 |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2299
diff
changeset
|
86 buffer_append(ctx->buffer, &file_field, sizeof(file_field)); |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
87 |
2555
87af1f39a69e
Added support for bitmask type.
Timo Sirainen <tss@iki.fi>
parents:
2407
diff
changeset
|
88 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
|
89 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
|
90 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
|
91 } |
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 |
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, 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
|
94 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
|
95 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
|
96 return 1; |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
97 } |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
98 |
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
|
99 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
|
100 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
|
101 { |
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
|
102 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
|
103 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
|
104 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
|
105 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
|
106 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
|
107 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
|
108 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
|
109 buffer_t *buffer; |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2299
diff
changeset
|
110 uint32_t 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
|
111 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
|
112 |
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 /* 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
|
114 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
|
115 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
|
116 return -1; |
2275
c68a3c9f6d73
Cache file compression works now and compressed cache file is reopened.
Timo Sirainen <tss@iki.fi>
parents:
2257
diff
changeset
|
117 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
|
118 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
|
119 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
|
120 } else { |
c68a3c9f6d73
Cache file compression works now and compressed cache file is reopened.
Timo Sirainen <tss@iki.fi>
parents:
2257
diff
changeset
|
121 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
|
122 (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
|
123 &message_count) < 0) |
c68a3c9f6d73
Cache file compression works now and compressed cache file is reopened.
Timo Sirainen <tss@iki.fi>
parents:
2257
diff
changeset
|
124 return -1; |
c68a3c9f6d73
Cache file compression works now and compressed cache file is reopened.
Timo Sirainen <tss@iki.fi>
parents:
2257
diff
changeset
|
125 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
|
126 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
|
127 } |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
128 |
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
|
129 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
|
130 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
|
131 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
|
132 |
2d51bb58a070
Added some smartness for deciding what to cache. Cache compression code compiles, but untested.
Timo Sirainen <tss@iki.fi>
parents:
2200
diff
changeset
|
133 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
|
134 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
|
135 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
|
136 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
|
137 o_stream_send(output, &hdr, sizeof(hdr)); |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
138 |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2299
diff
changeset
|
139 if (cache->fields_count != 0) { |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2299
diff
changeset
|
140 hdr.field_header_offset = |
2407
fed6d07bd8ee
Transaction log file is now read-lockless.
Timo Sirainen <tss@iki.fi>
parents:
2339
diff
changeset
|
141 mail_index_uint32_to_offset(output->offset); |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2299
diff
changeset
|
142 |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2299
diff
changeset
|
143 t_push(); |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2299
diff
changeset
|
144 buffer = buffer_create_dynamic(pool_datastack_create(), |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2299
diff
changeset
|
145 256, (size_t)-1); |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2299
diff
changeset
|
146 mail_cache_header_fields_get(cache, buffer); |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2299
diff
changeset
|
147 o_stream_send(output, buffer_get_data(buffer, NULL), |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2299
diff
changeset
|
148 buffer_get_used_size(buffer)); |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2299
diff
changeset
|
149 t_pop(); |
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
|
150 } |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
151 |
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
|
152 memset(&ctx, 0, sizeof(ctx)); |
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 ctx.buffer = buffer_create_dynamic(default_pool, 4096, (size_t)-1); |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2299
diff
changeset
|
154 ctx.field_seen = buffer_create_dynamic(default_pool, 64, (size_t)-1); |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2299
diff
changeset
|
155 ctx.field_seen_value = 0; |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
156 |
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
|
157 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
|
158 |
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 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
|
160 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
|
161 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
|
162 |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2299
diff
changeset
|
163 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
|
164 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
|
165 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
|
166 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
|
167 } |
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 |
5beb0c20b6e8
Cache file fixes, API changes, etc. It's still in somewhat ugly state, but
Timo Sirainen <tss@iki.fi>
parents:
2282
diff
changeset
|
169 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
|
170 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
|
171 |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2299
diff
changeset
|
172 (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
|
173 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
|
174 |
2299 | 175 cache_rec.size = buffer_get_used_size(ctx.buffer); |
176 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
|
177 continue; |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
178 |
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
|
179 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
|
180 output->offset, &old_offset); |
2299 | 181 |
182 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
|
183 o_stream_send(output, buffer_get_data(ctx.buffer, NULL), |
2299 | 184 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
|
185 } |
2276
5f374049abdb
Caching fixes and optimizations. Removed all network byte ordering code -
Timo Sirainen <tss@iki.fi>
parents:
2275
diff
changeset
|
186 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
|
187 buffer_free(ctx.buffer); |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
188 |
2275
c68a3c9f6d73
Cache file compression works now and compressed cache file is reopened.
Timo Sirainen <tss@iki.fi>
parents:
2257
diff
changeset
|
189 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
|
190 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
|
191 |
c68a3c9f6d73
Cache file compression works now and compressed cache file is reopened.
Timo Sirainen <tss@iki.fi>
parents:
2257
diff
changeset
|
192 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
|
193 |
c68a3c9f6d73
Cache file compression works now and compressed cache file is reopened.
Timo Sirainen <tss@iki.fi>
parents:
2257
diff
changeset
|
194 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
|
195 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
|
196 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
|
197 (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
|
198 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
|
199 return -1; |
c68a3c9f6d73
Cache file compression works now and compressed cache file is reopened.
Timo Sirainen <tss@iki.fi>
parents:
2257
diff
changeset
|
200 } |
c68a3c9f6d73
Cache file compression works now and compressed cache file is reopened.
Timo Sirainen <tss@iki.fi>
parents:
2257
diff
changeset
|
201 |
2299 | 202 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
|
203 /* 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
|
204 (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
|
205 } |
c68a3c9f6d73
Cache file compression works now and compressed cache file is reopened.
Timo Sirainen <tss@iki.fi>
parents:
2257
diff
changeset
|
206 |
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
|
207 o_stream_unref(output); |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
208 |
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
|
209 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
|
210 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
|
211 (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
|
212 return -1; |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
213 } |
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 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
|
216 } |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
217 |
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
|
218 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
|
219 { |
2275
c68a3c9f6d73
Cache file compression works now and compressed cache file is reopened.
Timo Sirainen <tss@iki.fi>
parents:
2257
diff
changeset
|
220 int fd, ret, locked; |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
221 |
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
|
222 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
|
223 return -1; |
c68a3c9f6d73
Cache file compression works now and compressed cache file is reopened.
Timo Sirainen <tss@iki.fi>
parents:
2257
diff
changeset
|
224 locked = ret > 0; |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
225 |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2299
diff
changeset
|
226 /* 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
|
227 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
|
228 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
|
229 return -1; |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2299
diff
changeset
|
230 } |
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2299
diff
changeset
|
231 |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
232 #ifdef DEBUG |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
233 i_warning("Compressing cache file %s", cache->filepath); |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
234 #endif |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
235 |
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
|
236 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
|
237 MAIL_CACHE_LOCK_TIMEOUT, |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
238 MAIL_CACHE_LOCK_CHANGE_TIMEOUT, |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
239 MAIL_CACHE_LOCK_IMMEDIATE_TIMEOUT, NULL, NULL); |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
240 if (fd == -1) { |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
241 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
|
242 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
|
243 return -1; |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
244 } |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
245 |
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
|
246 // 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
|
247 |
2275
c68a3c9f6d73
Cache file compression works now and compressed cache file is reopened.
Timo Sirainen <tss@iki.fi>
parents:
2257
diff
changeset
|
248 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
|
249 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
|
250 (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
|
251 ret = -1; |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
252 } 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
|
253 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
|
254 -1, FALSE) < 0) { |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
255 mail_cache_set_syscall_error(cache, |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
256 "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
|
257 (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
|
258 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
|
259 } 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
|
260 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
|
261 cache->fd = fd; |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
262 |
2275
c68a3c9f6d73
Cache file compression works now and compressed cache file is reopened.
Timo Sirainen <tss@iki.fi>
parents:
2257
diff
changeset
|
263 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
|
264 ret = -1; |
2327
7d02e2a7672d
Header caching redesigned. New design allows caching decisions per field, so
Timo Sirainen <tss@iki.fi>
parents:
2299
diff
changeset
|
265 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
|
266 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
|
267 } |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
268 } |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
269 |
2276
5f374049abdb
Caching fixes and optimizations. Removed all network byte ordering code -
Timo Sirainen <tss@iki.fi>
parents:
2275
diff
changeset
|
270 if (locked) |
5f374049abdb
Caching fixes and optimizations. Removed all network byte ordering code -
Timo Sirainen <tss@iki.fi>
parents:
2275
diff
changeset
|
271 mail_cache_unlock(cache); |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
272 |
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 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
|
274 cache->need_compress = FALSE; |
1915
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
275 return ret; |
79790750c349
importing new index code. mbox still broken.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
276 } |
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
|
277 |
2d51bb58a070
Added some smartness for deciding what to cache. Cache compression code compiles, but untested.
Timo Sirainen <tss@iki.fi>
parents:
2200
diff
changeset
|
278 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
|
279 { |
2275
c68a3c9f6d73
Cache file compression works now and compressed cache file is reopened.
Timo Sirainen <tss@iki.fi>
parents:
2257
diff
changeset
|
280 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
|
281 } |