Mercurial > dovecot > core-2.2
annotate src/lib-index/mail-index-sync-keywords.c @ 6373:06818dd6a952 HEAD
Make sure extensions updates don't modify keywords.
author | Timo Sirainen <tss@iki.fi> |
---|---|
date | Sat, 15 Sep 2007 08:55:57 +0300 |
parents | 75c814287334 |
children | 65c69a53a7be |
rev | line source |
---|---|
3016
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
1 /* Copyright (C) 2004 Timo Sirainen */ |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2 |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
3 #include "lib.h" |
3470
346a494c2feb
Moved array declaration to array-decl.h and include it in lib.h. So array.h
Timo Sirainen <tss@iki.fi>
parents:
3254
diff
changeset
|
4 #include "array.h" |
3016
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
5 #include "buffer.h" |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
6 #include "mail-index-view-private.h" |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
7 #include "mail-index-sync-private.h" |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
8 #include "mail-transaction-log.h" |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
9 |
6349
75c814287334
Cleaned up keyword handling code.
Timo Sirainen <tss@iki.fi>
parents:
6348
diff
changeset
|
10 static bool |
3138
fbe844061fe2
Internal changes in how keywords are handled. struct mail_keywords isn't
Timo Sirainen <tss@iki.fi>
parents:
3086
diff
changeset
|
11 keyword_lookup(struct mail_index_sync_map_ctx *ctx, |
fbe844061fe2
Internal changes in how keywords are handled. struct mail_keywords isn't
Timo Sirainen <tss@iki.fi>
parents:
3086
diff
changeset
|
12 const char *keyword_name, unsigned int *idx_r) |
3016
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
13 { |
3138
fbe844061fe2
Internal changes in how keywords are handled. struct mail_keywords isn't
Timo Sirainen <tss@iki.fi>
parents:
3086
diff
changeset
|
14 struct mail_index_map *map = ctx->view->map; |
3254
a2943c050571
Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents:
3191
diff
changeset
|
15 const unsigned int *idx_map; |
a2943c050571
Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents:
3191
diff
changeset
|
16 unsigned int i, count, keyword_idx; |
3016
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
17 |
4501
a7178fbf4697
In some conditions a keyword could have been added to the index twice. Also
Timo Sirainen <tss@iki.fi>
parents:
4279
diff
changeset
|
18 if (array_is_created(&map->keyword_idx_map) && |
a7178fbf4697
In some conditions a keyword could have been added to the index twice. Also
Timo Sirainen <tss@iki.fi>
parents:
4279
diff
changeset
|
19 mail_index_keyword_lookup(ctx->view->index, keyword_name, |
6335
a1c587d3d633
Removed autocreate parameter from mail_index_keyword_lookup(). Added a new
Timo Sirainen <tss@iki.fi>
parents:
6325
diff
changeset
|
20 &keyword_idx)) { |
3254
a2943c050571
Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents:
3191
diff
changeset
|
21 /* FIXME: slow. maybe create index -> file mapping as well */ |
a2943c050571
Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents:
3191
diff
changeset
|
22 idx_map = array_get(&map->keyword_idx_map, &count); |
a2943c050571
Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents:
3191
diff
changeset
|
23 for (i = 0; i < count; i++) { |
a2943c050571
Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents:
3191
diff
changeset
|
24 if (idx_map[i] == keyword_idx) { |
a2943c050571
Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents:
3191
diff
changeset
|
25 *idx_r = i; |
6349
75c814287334
Cleaned up keyword handling code.
Timo Sirainen <tss@iki.fi>
parents:
6348
diff
changeset
|
26 return TRUE; |
3254
a2943c050571
Keywords are now stored in X-Keywords headers in mbox. Did several related
Timo Sirainen <tss@iki.fi>
parents:
3191
diff
changeset
|
27 } |
3016
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
28 } |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
29 } |
6349
75c814287334
Cleaned up keyword handling code.
Timo Sirainen <tss@iki.fi>
parents:
6348
diff
changeset
|
30 return FALSE; |
3016
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
31 } |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
32 |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
33 static buffer_t * |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
34 keywords_get_header_buf(struct mail_index_map *map, |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
35 const struct mail_index_ext *ext, |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
36 unsigned int new_count, unsigned int *keywords_count_r, |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
37 size_t *rec_offset_r, size_t *name_offset_root_r, |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
38 size_t *name_offset_r) |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
39 { |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
40 buffer_t *buf; |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
41 const struct mail_index_keyword_header *kw_hdr; |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
42 const struct mail_index_keyword_header_rec *kw_rec; |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
43 const char *name; |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
44 struct mail_index_keyword_header new_kw_hdr; |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
45 uint32_t offset; |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
46 |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
47 kw_hdr = CONST_PTR_OFFSET(map->hdr_base, ext->hdr_offset); |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
48 kw_rec = (const void *)(kw_hdr + 1); |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
49 name = (const char *)(kw_rec + kw_hdr->keywords_count); |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
50 |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
51 if (kw_hdr->keywords_count == 0) |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
52 return NULL; |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
53 |
6325 | 54 i_assert((size_t)(name - (const char *)kw_hdr) < ext->hdr_size); |
55 | |
3016
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
56 new_kw_hdr = *kw_hdr; |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
57 new_kw_hdr.keywords_count += new_count; |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
58 *keywords_count_r = new_kw_hdr.keywords_count; |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
59 |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
60 offset = kw_rec[kw_hdr->keywords_count-1].name_offset; |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
61 offset += strlen(name + offset) + 1; |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
62 |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
63 buf = buffer_create_dynamic(pool_datastack_create(), 512); |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
64 buffer_append(buf, &new_kw_hdr, sizeof(new_kw_hdr)); |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
65 buffer_append(buf, kw_rec, sizeof(*kw_rec) * kw_hdr->keywords_count); |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
66 *rec_offset_r = buf->used; |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
67 buffer_write(buf, buf->used + sizeof(*kw_rec) * new_count, |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
68 name, offset); |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
69 *name_offset_root_r = buf->used; |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
70 *name_offset_r = offset; |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
71 return buf; |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
72 } |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
73 |
6349
75c814287334
Cleaned up keyword handling code.
Timo Sirainen <tss@iki.fi>
parents:
6348
diff
changeset
|
74 static void keywords_ext_register(struct mail_index_sync_map_ctx *ctx, |
75c814287334
Cleaned up keyword handling code.
Timo Sirainen <tss@iki.fi>
parents:
6348
diff
changeset
|
75 uint32_t ext_map_idx, uint32_t reset_id, |
75c814287334
Cleaned up keyword handling code.
Timo Sirainen <tss@iki.fi>
parents:
6348
diff
changeset
|
76 uint32_t hdr_size, uint32_t keywords_count) |
3016
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
77 { |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
78 buffer_t *ext_intro_buf; |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
79 struct mail_transaction_ext_intro *u; |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
80 |
6349
75c814287334
Cleaned up keyword handling code.
Timo Sirainen <tss@iki.fi>
parents:
6348
diff
changeset
|
81 i_assert(keywords_count > 0); |
75c814287334
Cleaned up keyword handling code.
Timo Sirainen <tss@iki.fi>
parents:
6348
diff
changeset
|
82 |
3016
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
83 ext_intro_buf = |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
84 buffer_create_static_hard(pool_datastack_create(), |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
85 sizeof(*u) + sizeof("keywords")-1); |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
86 |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
87 u = buffer_append_space_unsafe(ext_intro_buf, sizeof(*u)); |
6348
ef1c7b2acc10
Only index extension indexes are now called "ext_id". For map extension
Timo Sirainen <tss@iki.fi>
parents:
6335
diff
changeset
|
88 u->ext_id = ext_map_idx; |
3016
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
89 u->reset_id = reset_id; |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
90 u->hdr_size = hdr_size; |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
91 u->record_size = (keywords_count + CHAR_BIT - 1) / CHAR_BIT; |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
92 if ((u->record_size % 4) != 0) { |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
93 /* since we aren't properly aligned anyway, |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
94 reserve one extra byte for future */ |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
95 u->record_size++; |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
96 } |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
97 u->record_align = 1; |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
98 |
6348
ef1c7b2acc10
Only index extension indexes are now called "ext_id". For map extension
Timo Sirainen <tss@iki.fi>
parents:
6335
diff
changeset
|
99 if (ext_map_idx == (uint32_t)-1) { |
3016
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
100 u->name_size = strlen("keywords"); |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
101 buffer_append(ext_intro_buf, "keywords", u->name_size); |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
102 } |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
103 |
6373
06818dd6a952
Make sure extensions updates don't modify keywords.
Timo Sirainen <tss@iki.fi>
parents:
6349
diff
changeset
|
104 ctx->internal_update = TRUE; |
6349
75c814287334
Cleaned up keyword handling code.
Timo Sirainen <tss@iki.fi>
parents:
6348
diff
changeset
|
105 if (mail_index_sync_ext_intro(ctx, u) < 0) |
75c814287334
Cleaned up keyword handling code.
Timo Sirainen <tss@iki.fi>
parents:
6348
diff
changeset
|
106 i_panic("Keyword extension growing failed"); |
6373
06818dd6a952
Make sure extensions updates don't modify keywords.
Timo Sirainen <tss@iki.fi>
parents:
6349
diff
changeset
|
107 ctx->internal_update = FALSE; |
3016
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
108 } |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
109 |
6349
75c814287334
Cleaned up keyword handling code.
Timo Sirainen <tss@iki.fi>
parents:
6348
diff
changeset
|
110 static void |
3138
fbe844061fe2
Internal changes in how keywords are handled. struct mail_keywords isn't
Timo Sirainen <tss@iki.fi>
parents:
3086
diff
changeset
|
111 keywords_header_add(struct mail_index_sync_map_ctx *ctx, |
fbe844061fe2
Internal changes in how keywords are handled. struct mail_keywords isn't
Timo Sirainen <tss@iki.fi>
parents:
3086
diff
changeset
|
112 const char *keyword_name, unsigned int *keyword_idx_r) |
3016
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
113 { |
6373
06818dd6a952
Make sure extensions updates don't modify keywords.
Timo Sirainen <tss@iki.fi>
parents:
6349
diff
changeset
|
114 struct mail_index_map *map; |
3016
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
115 const struct mail_index_ext *ext = NULL; |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
116 struct mail_index_keyword_header *kw_hdr; |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
117 struct mail_index_keyword_header_rec kw_rec; |
6348
ef1c7b2acc10
Only index extension indexes are now called "ext_id". For map extension
Timo Sirainen <tss@iki.fi>
parents:
6335
diff
changeset
|
118 uint32_t ext_map_idx; |
3016
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
119 buffer_t *buf = NULL; |
3138
fbe844061fe2
Internal changes in how keywords are handled. struct mail_keywords isn't
Timo Sirainen <tss@iki.fi>
parents:
3086
diff
changeset
|
120 size_t keyword_len, rec_offset, name_offset, name_offset_root; |
3016
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
121 unsigned int keywords_count; |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
122 |
5689
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5399
diff
changeset
|
123 /* if we crash in the middle of writing the header, the |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5399
diff
changeset
|
124 keywords are more or less corrupted. avoid that by |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5399
diff
changeset
|
125 making sure the header is updated atomically. */ |
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5399
diff
changeset
|
126 map = mail_index_sync_get_atomic_map(ctx); |
5399
9be95726e29f
When adding new keywords, update the index file atomically so the keywords
Timo Sirainen <tss@iki.fi>
parents:
5051
diff
changeset
|
127 |
6348
ef1c7b2acc10
Only index extension indexes are now called "ext_id". For map extension
Timo Sirainen <tss@iki.fi>
parents:
6335
diff
changeset
|
128 if (!mail_index_map_lookup_ext(map, "keywords", &ext_map_idx)) |
ef1c7b2acc10
Only index extension indexes are now called "ext_id". For map extension
Timo Sirainen <tss@iki.fi>
parents:
6335
diff
changeset
|
129 ext_map_idx = (uint32_t)-1; |
ef1c7b2acc10
Only index extension indexes are now called "ext_id". For map extension
Timo Sirainen <tss@iki.fi>
parents:
6335
diff
changeset
|
130 else { |
3138
fbe844061fe2
Internal changes in how keywords are handled. struct mail_keywords isn't
Timo Sirainen <tss@iki.fi>
parents:
3086
diff
changeset
|
131 /* update existing header */ |
6348
ef1c7b2acc10
Only index extension indexes are now called "ext_id". For map extension
Timo Sirainen <tss@iki.fi>
parents:
6335
diff
changeset
|
132 ext = array_idx(&map->extensions, ext_map_idx); |
3138
fbe844061fe2
Internal changes in how keywords are handled. struct mail_keywords isn't
Timo Sirainen <tss@iki.fi>
parents:
3086
diff
changeset
|
133 buf = keywords_get_header_buf(map, ext, 1, &keywords_count, |
fbe844061fe2
Internal changes in how keywords are handled. struct mail_keywords isn't
Timo Sirainen <tss@iki.fi>
parents:
3086
diff
changeset
|
134 &rec_offset, &name_offset_root, |
fbe844061fe2
Internal changes in how keywords are handled. struct mail_keywords isn't
Timo Sirainen <tss@iki.fi>
parents:
3086
diff
changeset
|
135 &name_offset); |
3016
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
136 } |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
137 |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
138 if (buf == NULL) { |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
139 /* create new / replace broken header */ |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
140 buf = buffer_create_dynamic(pool_datastack_create(), 512); |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
141 kw_hdr = buffer_append_space_unsafe(buf, sizeof(*kw_hdr)); |
3138
fbe844061fe2
Internal changes in how keywords are handled. struct mail_keywords isn't
Timo Sirainen <tss@iki.fi>
parents:
3086
diff
changeset
|
142 kw_hdr->keywords_count = 1; |
3016
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
143 |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
144 keywords_count = kw_hdr->keywords_count; |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
145 rec_offset = buf->used; |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
146 name_offset_root = rec_offset + |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
147 kw_hdr->keywords_count * sizeof(kw_rec); |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
148 name_offset = 0; |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
149 } |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
150 |
3138
fbe844061fe2
Internal changes in how keywords are handled. struct mail_keywords isn't
Timo Sirainen <tss@iki.fi>
parents:
3086
diff
changeset
|
151 /* add the keyword */ |
3016
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
152 memset(&kw_rec, 0, sizeof(kw_rec)); |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
153 kw_rec.name_offset = name_offset; |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
154 |
3549
3c5eb0649d5a
We didn't add the ending NUL character in keyword name, which caused more or
Timo Sirainen <tss@iki.fi>
parents:
3470
diff
changeset
|
155 keyword_len = strlen(keyword_name) + 1; |
3138
fbe844061fe2
Internal changes in how keywords are handled. struct mail_keywords isn't
Timo Sirainen <tss@iki.fi>
parents:
3086
diff
changeset
|
156 buffer_write(buf, rec_offset, &kw_rec, sizeof(kw_rec)); |
fbe844061fe2
Internal changes in how keywords are handled. struct mail_keywords isn't
Timo Sirainen <tss@iki.fi>
parents:
3086
diff
changeset
|
157 buffer_write(buf, name_offset_root, keyword_name, keyword_len); |
3016
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
158 |
3138
fbe844061fe2
Internal changes in how keywords are handled. struct mail_keywords isn't
Timo Sirainen <tss@iki.fi>
parents:
3086
diff
changeset
|
159 rec_offset += sizeof(kw_rec); |
fbe844061fe2
Internal changes in how keywords are handled. struct mail_keywords isn't
Timo Sirainen <tss@iki.fi>
parents:
3086
diff
changeset
|
160 kw_rec.name_offset += keyword_len; |
fbe844061fe2
Internal changes in how keywords are handled. struct mail_keywords isn't
Timo Sirainen <tss@iki.fi>
parents:
3086
diff
changeset
|
161 name_offset_root += keyword_len; |
3016
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
162 |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
163 if ((buf->used % 4) != 0) |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
164 buffer_append_zero(buf, 4 - (buf->used % 4)); |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
165 |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
166 if (ext == NULL || buf->used > ext->hdr_size || |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
167 (uint32_t)ext->record_size * CHAR_BIT < keywords_count) { |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
168 /* if we need to grow the buffer, add some padding */ |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
169 buffer_append_zero(buf, 128); |
6349
75c814287334
Cleaned up keyword handling code.
Timo Sirainen <tss@iki.fi>
parents:
6348
diff
changeset
|
170 keywords_ext_register(ctx, ext_map_idx, |
75c814287334
Cleaned up keyword handling code.
Timo Sirainen <tss@iki.fi>
parents:
6348
diff
changeset
|
171 ext == NULL ? 0 : ext->reset_id, |
75c814287334
Cleaned up keyword handling code.
Timo Sirainen <tss@iki.fi>
parents:
6348
diff
changeset
|
172 buf->used, keywords_count); |
3016
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
173 |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
174 /* map may have changed */ |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
175 map = ctx->view->map; |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
176 |
6348
ef1c7b2acc10
Only index extension indexes are now called "ext_id". For map extension
Timo Sirainen <tss@iki.fi>
parents:
6335
diff
changeset
|
177 if (!mail_index_map_lookup_ext(map, "keywords", &ext_map_idx)) |
ef1c7b2acc10
Only index extension indexes are now called "ext_id". For map extension
Timo Sirainen <tss@iki.fi>
parents:
6335
diff
changeset
|
178 i_unreached(); |
ef1c7b2acc10
Only index extension indexes are now called "ext_id". For map extension
Timo Sirainen <tss@iki.fi>
parents:
6335
diff
changeset
|
179 ext = array_idx(&map->extensions, ext_map_idx); |
3016
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
180 |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
181 i_assert(ext->hdr_size == buf->used); |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
182 } |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
183 |
6349
75c814287334
Cleaned up keyword handling code.
Timo Sirainen <tss@iki.fi>
parents:
6348
diff
changeset
|
184 buffer_copy(map->hdr_copy_buf, ext->hdr_offset, buf, 0, buf->used); |
3016
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
185 map->hdr_base = map->hdr_copy_buf->data; |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
186 |
6349
75c814287334
Cleaned up keyword handling code.
Timo Sirainen <tss@iki.fi>
parents:
6348
diff
changeset
|
187 if (mail_index_map_parse_keywords(map) < 0) |
75c814287334
Cleaned up keyword handling code.
Timo Sirainen <tss@iki.fi>
parents:
6348
diff
changeset
|
188 i_panic("Keyword update corrupted keywords header"); |
75c814287334
Cleaned up keyword handling code.
Timo Sirainen <tss@iki.fi>
parents:
6348
diff
changeset
|
189 |
3138
fbe844061fe2
Internal changes in how keywords are handled. struct mail_keywords isn't
Timo Sirainen <tss@iki.fi>
parents:
3086
diff
changeset
|
190 *keyword_idx_r = keywords_count - 1; |
6349
75c814287334
Cleaned up keyword handling code.
Timo Sirainen <tss@iki.fi>
parents:
6348
diff
changeset
|
191 i_assert(*keyword_idx_r / CHAR_BIT < ext->record_size); |
3016
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
192 } |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
193 |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
194 static int |
5689
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5399
diff
changeset
|
195 keywords_update_records(struct mail_index_sync_map_ctx *ctx, |
3016
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
196 const struct mail_index_ext *ext, |
5689
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5399
diff
changeset
|
197 unsigned int keyword_idx, enum modify_type type, |
3016
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
198 uint32_t uid1, uint32_t uid2) |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
199 { |
5689
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5399
diff
changeset
|
200 struct mail_index_view *view = ctx->view; |
3016
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
201 struct mail_index_record *rec; |
3138
fbe844061fe2
Internal changes in how keywords are handled. struct mail_keywords isn't
Timo Sirainen <tss@iki.fi>
parents:
3086
diff
changeset
|
202 unsigned char *data, data_mask; |
fbe844061fe2
Internal changes in how keywords are handled. struct mail_keywords isn't
Timo Sirainen <tss@iki.fi>
parents:
3086
diff
changeset
|
203 unsigned int data_offset; |
3016
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
204 uint32_t seq1, seq2; |
3138
fbe844061fe2
Internal changes in how keywords are handled. struct mail_keywords isn't
Timo Sirainen <tss@iki.fi>
parents:
3086
diff
changeset
|
205 |
fbe844061fe2
Internal changes in how keywords are handled. struct mail_keywords isn't
Timo Sirainen <tss@iki.fi>
parents:
3086
diff
changeset
|
206 i_assert(keyword_idx != (unsigned int)-1); |
3016
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
207 |
6275
913b188f4dd4
Removed explicit locking from views and maps. They were already locked all
Timo Sirainen <tss@iki.fi>
parents:
5867
diff
changeset
|
208 mail_index_lookup_uid_range(view, uid1, uid2, &seq1, &seq2); |
3016
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
209 if (seq1 == 0) |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
210 return 1; |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
211 |
5689
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5399
diff
changeset
|
212 mail_index_sync_write_seq_update(ctx, seq1, seq2); |
3805
5d090d03f2b5
Don't rewrite index file every time with mmap_disable=yes.
Timo Sirainen <tss@iki.fi>
parents:
3549
diff
changeset
|
213 |
3138
fbe844061fe2
Internal changes in how keywords are handled. struct mail_keywords isn't
Timo Sirainen <tss@iki.fi>
parents:
3086
diff
changeset
|
214 data_offset = keyword_idx / CHAR_BIT; |
fbe844061fe2
Internal changes in how keywords are handled. struct mail_keywords isn't
Timo Sirainen <tss@iki.fi>
parents:
3086
diff
changeset
|
215 data_mask = 1 << (keyword_idx % CHAR_BIT); |
fbe844061fe2
Internal changes in how keywords are handled. struct mail_keywords isn't
Timo Sirainen <tss@iki.fi>
parents:
3086
diff
changeset
|
216 |
fbe844061fe2
Internal changes in how keywords are handled. struct mail_keywords isn't
Timo Sirainen <tss@iki.fi>
parents:
3086
diff
changeset
|
217 i_assert(data_offset < ext->record_size); |
fbe844061fe2
Internal changes in how keywords are handled. struct mail_keywords isn't
Timo Sirainen <tss@iki.fi>
parents:
3086
diff
changeset
|
218 data_offset += ext->record_offset; |
3016
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
219 |
4501
a7178fbf4697
In some conditions a keyword could have been added to the index twice. Also
Timo Sirainen <tss@iki.fi>
parents:
4279
diff
changeset
|
220 i_assert(data_offset >= sizeof(struct mail_index_record)); |
a7178fbf4697
In some conditions a keyword could have been added to the index twice. Also
Timo Sirainen <tss@iki.fi>
parents:
4279
diff
changeset
|
221 |
3138
fbe844061fe2
Internal changes in how keywords are handled. struct mail_keywords isn't
Timo Sirainen <tss@iki.fi>
parents:
3086
diff
changeset
|
222 switch (type) { |
fbe844061fe2
Internal changes in how keywords are handled. struct mail_keywords isn't
Timo Sirainen <tss@iki.fi>
parents:
3086
diff
changeset
|
223 case MODIFY_ADD: |
fbe844061fe2
Internal changes in how keywords are handled. struct mail_keywords isn't
Timo Sirainen <tss@iki.fi>
parents:
3086
diff
changeset
|
224 for (seq1--; seq1 < seq2; seq1++) { |
fbe844061fe2
Internal changes in how keywords are handled. struct mail_keywords isn't
Timo Sirainen <tss@iki.fi>
parents:
3086
diff
changeset
|
225 rec = MAIL_INDEX_MAP_IDX(view->map, seq1); |
fbe844061fe2
Internal changes in how keywords are handled. struct mail_keywords isn't
Timo Sirainen <tss@iki.fi>
parents:
3086
diff
changeset
|
226 data = PTR_OFFSET(rec, data_offset); |
fbe844061fe2
Internal changes in how keywords are handled. struct mail_keywords isn't
Timo Sirainen <tss@iki.fi>
parents:
3086
diff
changeset
|
227 *data |= data_mask; |
fbe844061fe2
Internal changes in how keywords are handled. struct mail_keywords isn't
Timo Sirainen <tss@iki.fi>
parents:
3086
diff
changeset
|
228 } |
3016
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
229 break; |
3138
fbe844061fe2
Internal changes in how keywords are handled. struct mail_keywords isn't
Timo Sirainen <tss@iki.fi>
parents:
3086
diff
changeset
|
230 case MODIFY_REMOVE: |
fbe844061fe2
Internal changes in how keywords are handled. struct mail_keywords isn't
Timo Sirainen <tss@iki.fi>
parents:
3086
diff
changeset
|
231 data_mask = ~data_mask; |
fbe844061fe2
Internal changes in how keywords are handled. struct mail_keywords isn't
Timo Sirainen <tss@iki.fi>
parents:
3086
diff
changeset
|
232 for (seq1--; seq1 < seq2; seq1++) { |
fbe844061fe2
Internal changes in how keywords are handled. struct mail_keywords isn't
Timo Sirainen <tss@iki.fi>
parents:
3086
diff
changeset
|
233 rec = MAIL_INDEX_MAP_IDX(view->map, seq1); |
fbe844061fe2
Internal changes in how keywords are handled. struct mail_keywords isn't
Timo Sirainen <tss@iki.fi>
parents:
3086
diff
changeset
|
234 data = PTR_OFFSET(rec, data_offset); |
fbe844061fe2
Internal changes in how keywords are handled. struct mail_keywords isn't
Timo Sirainen <tss@iki.fi>
parents:
3086
diff
changeset
|
235 *data &= data_mask; |
3016
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
236 } |
3138
fbe844061fe2
Internal changes in how keywords are handled. struct mail_keywords isn't
Timo Sirainen <tss@iki.fi>
parents:
3086
diff
changeset
|
237 break; |
fbe844061fe2
Internal changes in how keywords are handled. struct mail_keywords isn't
Timo Sirainen <tss@iki.fi>
parents:
3086
diff
changeset
|
238 default: |
fbe844061fe2
Internal changes in how keywords are handled. struct mail_keywords isn't
Timo Sirainen <tss@iki.fi>
parents:
3086
diff
changeset
|
239 i_unreached(); |
3016
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
240 } |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
241 return 1; |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
242 } |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
243 |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
244 int mail_index_sync_keywords(struct mail_index_sync_map_ctx *ctx, |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
245 const struct mail_transaction_header *hdr, |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
246 const struct mail_transaction_keyword_update *rec) |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
247 { |
6349
75c814287334
Cleaned up keyword handling code.
Timo Sirainen <tss@iki.fi>
parents:
6348
diff
changeset
|
248 struct mail_index_view *view = ctx->view; |
3138
fbe844061fe2
Internal changes in how keywords are handled. struct mail_keywords isn't
Timo Sirainen <tss@iki.fi>
parents:
3086
diff
changeset
|
249 const char *keyword_name; |
3016
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
250 const struct mail_index_ext *ext; |
3138
fbe844061fe2
Internal changes in how keywords are handled. struct mail_keywords isn't
Timo Sirainen <tss@iki.fi>
parents:
3086
diff
changeset
|
251 const uint32_t *uid, *end; |
6348
ef1c7b2acc10
Only index extension indexes are now called "ext_id". For map extension
Timo Sirainen <tss@iki.fi>
parents:
6335
diff
changeset
|
252 uint32_t seqset_offset, ext_map_idx; |
3138
fbe844061fe2
Internal changes in how keywords are handled. struct mail_keywords isn't
Timo Sirainen <tss@iki.fi>
parents:
3086
diff
changeset
|
253 unsigned int keyword_idx; |
3016
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
254 int ret; |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
255 |
3138
fbe844061fe2
Internal changes in how keywords are handled. struct mail_keywords isn't
Timo Sirainen <tss@iki.fi>
parents:
3086
diff
changeset
|
256 seqset_offset = sizeof(*rec) + rec->name_size; |
fbe844061fe2
Internal changes in how keywords are handled. struct mail_keywords isn't
Timo Sirainen <tss@iki.fi>
parents:
3086
diff
changeset
|
257 if ((seqset_offset % 4) != 0) |
fbe844061fe2
Internal changes in how keywords are handled. struct mail_keywords isn't
Timo Sirainen <tss@iki.fi>
parents:
3086
diff
changeset
|
258 seqset_offset += 4 - (seqset_offset % 4); |
5718
8b481177965a
Moved duplicated log record validation code to a single place.
Timo Sirainen <tss@iki.fi>
parents:
5689
diff
changeset
|
259 i_assert(seqset_offset < hdr->size); |
3138
fbe844061fe2
Internal changes in how keywords are handled. struct mail_keywords isn't
Timo Sirainen <tss@iki.fi>
parents:
3086
diff
changeset
|
260 |
fbe844061fe2
Internal changes in how keywords are handled. struct mail_keywords isn't
Timo Sirainen <tss@iki.fi>
parents:
3086
diff
changeset
|
261 uid = CONST_PTR_OFFSET(rec, seqset_offset); |
3016
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
262 end = CONST_PTR_OFFSET(rec, hdr->size); |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
263 |
3138
fbe844061fe2
Internal changes in how keywords are handled. struct mail_keywords isn't
Timo Sirainen <tss@iki.fi>
parents:
3086
diff
changeset
|
264 keyword_name = t_strndup(rec + 1, rec->name_size); |
6323
4a6dd4e894b4
Log an error if empty keyword name is tried to be used.
Timo Sirainen <tss@iki.fi>
parents:
6320
diff
changeset
|
265 if (*keyword_name == '\0') { |
4a6dd4e894b4
Log an error if empty keyword name is tried to be used.
Timo Sirainen <tss@iki.fi>
parents:
6320
diff
changeset
|
266 mail_index_sync_set_corrupted(ctx, |
4a6dd4e894b4
Log an error if empty keyword name is tried to be used.
Timo Sirainen <tss@iki.fi>
parents:
6320
diff
changeset
|
267 "Trying to use empty keyword"); |
4a6dd4e894b4
Log an error if empty keyword name is tried to be used.
Timo Sirainen <tss@iki.fi>
parents:
6320
diff
changeset
|
268 return -1; |
4a6dd4e894b4
Log an error if empty keyword name is tried to be used.
Timo Sirainen <tss@iki.fi>
parents:
6320
diff
changeset
|
269 } |
6349
75c814287334
Cleaned up keyword handling code.
Timo Sirainen <tss@iki.fi>
parents:
6348
diff
changeset
|
270 if (!keyword_lookup(ctx, keyword_name, &keyword_idx)) |
75c814287334
Cleaned up keyword handling code.
Timo Sirainen <tss@iki.fi>
parents:
6348
diff
changeset
|
271 keywords_header_add(ctx, keyword_name, &keyword_idx); |
75c814287334
Cleaned up keyword handling code.
Timo Sirainen <tss@iki.fi>
parents:
6348
diff
changeset
|
272 |
75c814287334
Cleaned up keyword handling code.
Timo Sirainen <tss@iki.fi>
parents:
6348
diff
changeset
|
273 /* if the keyword wasn't found, the "keywords" extension was created. |
75c814287334
Cleaned up keyword handling code.
Timo Sirainen <tss@iki.fi>
parents:
6348
diff
changeset
|
274 if it was found, the record size should already be correct, but |
75c814287334
Cleaned up keyword handling code.
Timo Sirainen <tss@iki.fi>
parents:
6348
diff
changeset
|
275 in case it isn't just fix it ourself. */ |
75c814287334
Cleaned up keyword handling code.
Timo Sirainen <tss@iki.fi>
parents:
6348
diff
changeset
|
276 if (!mail_index_map_lookup_ext(view->map, "keywords", &ext_map_idx)) |
75c814287334
Cleaned up keyword handling code.
Timo Sirainen <tss@iki.fi>
parents:
6348
diff
changeset
|
277 i_unreached(); |
3016
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
278 |
6349
75c814287334
Cleaned up keyword handling code.
Timo Sirainen <tss@iki.fi>
parents:
6348
diff
changeset
|
279 ext = array_idx(&view->map->extensions, ext_map_idx); |
75c814287334
Cleaned up keyword handling code.
Timo Sirainen <tss@iki.fi>
parents:
6348
diff
changeset
|
280 if (keyword_idx / CHAR_BIT >= ext->record_size) { |
75c814287334
Cleaned up keyword handling code.
Timo Sirainen <tss@iki.fi>
parents:
6348
diff
changeset
|
281 if (rec->modify_type == MODIFY_REMOVE) { |
75c814287334
Cleaned up keyword handling code.
Timo Sirainen <tss@iki.fi>
parents:
6348
diff
changeset
|
282 /* nothing to do */ |
75c814287334
Cleaned up keyword handling code.
Timo Sirainen <tss@iki.fi>
parents:
6348
diff
changeset
|
283 return 1; |
6320
58b6fb965e62
If keyword ext record is missing, log an error instead of assert-crashing.
Timo Sirainen <tss@iki.fi>
parents:
6275
diff
changeset
|
284 } |
3086 | 285 |
6349
75c814287334
Cleaned up keyword handling code.
Timo Sirainen <tss@iki.fi>
parents:
6348
diff
changeset
|
286 /* grow the record size */ |
75c814287334
Cleaned up keyword handling code.
Timo Sirainen <tss@iki.fi>
parents:
6348
diff
changeset
|
287 keywords_ext_register(ctx, ext_map_idx, ext->reset_id, |
75c814287334
Cleaned up keyword handling code.
Timo Sirainen <tss@iki.fi>
parents:
6348
diff
changeset
|
288 ext->hdr_size, |
75c814287334
Cleaned up keyword handling code.
Timo Sirainen <tss@iki.fi>
parents:
6348
diff
changeset
|
289 array_count(&view->map->keyword_idx_map)); |
75c814287334
Cleaned up keyword handling code.
Timo Sirainen <tss@iki.fi>
parents:
6348
diff
changeset
|
290 if (!mail_index_map_lookup_ext(view->map, "keywords", |
75c814287334
Cleaned up keyword handling code.
Timo Sirainen <tss@iki.fi>
parents:
6348
diff
changeset
|
291 &ext_map_idx)) |
75c814287334
Cleaned up keyword handling code.
Timo Sirainen <tss@iki.fi>
parents:
6348
diff
changeset
|
292 i_unreached(); |
75c814287334
Cleaned up keyword handling code.
Timo Sirainen <tss@iki.fi>
parents:
6348
diff
changeset
|
293 ext = array_idx(&view->map->extensions, ext_map_idx); |
3086 | 294 } |
295 | |
3016
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
296 while (uid+2 <= end) { |
5689
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5399
diff
changeset
|
297 ret = keywords_update_records(ctx, ext, keyword_idx, |
3016
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
298 rec->modify_type, |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
299 uid[0], uid[1]); |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
300 if (ret <= 0) |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
301 return ret; |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
302 |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
303 uid += 2; |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
304 } |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
305 |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
306 return 1; |
61c8d205d887
Initial support for keywords. Syncing to mbox/maildir doesn't work yet.
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
307 } |
3138
fbe844061fe2
Internal changes in how keywords are handled. struct mail_keywords isn't
Timo Sirainen <tss@iki.fi>
parents:
3086
diff
changeset
|
308 |
fbe844061fe2
Internal changes in how keywords are handled. struct mail_keywords isn't
Timo Sirainen <tss@iki.fi>
parents:
3086
diff
changeset
|
309 int |
fbe844061fe2
Internal changes in how keywords are handled. struct mail_keywords isn't
Timo Sirainen <tss@iki.fi>
parents:
3086
diff
changeset
|
310 mail_index_sync_keywords_reset(struct mail_index_sync_map_ctx *ctx, |
fbe844061fe2
Internal changes in how keywords are handled. struct mail_keywords isn't
Timo Sirainen <tss@iki.fi>
parents:
3086
diff
changeset
|
311 const struct mail_transaction_header *hdr, |
fbe844061fe2
Internal changes in how keywords are handled. struct mail_keywords isn't
Timo Sirainen <tss@iki.fi>
parents:
3086
diff
changeset
|
312 const struct mail_transaction_keyword_reset *r) |
fbe844061fe2
Internal changes in how keywords are handled. struct mail_keywords isn't
Timo Sirainen <tss@iki.fi>
parents:
3086
diff
changeset
|
313 { |
fbe844061fe2
Internal changes in how keywords are handled. struct mail_keywords isn't
Timo Sirainen <tss@iki.fi>
parents:
3086
diff
changeset
|
314 struct mail_index_map *map = ctx->view->map; |
fbe844061fe2
Internal changes in how keywords are handled. struct mail_keywords isn't
Timo Sirainen <tss@iki.fi>
parents:
3086
diff
changeset
|
315 struct mail_index_record *rec; |
fbe844061fe2
Internal changes in how keywords are handled. struct mail_keywords isn't
Timo Sirainen <tss@iki.fi>
parents:
3086
diff
changeset
|
316 const struct mail_index_ext *ext; |
fbe844061fe2
Internal changes in how keywords are handled. struct mail_keywords isn't
Timo Sirainen <tss@iki.fi>
parents:
3086
diff
changeset
|
317 const struct mail_transaction_keyword_reset *end; |
6348
ef1c7b2acc10
Only index extension indexes are now called "ext_id". For map extension
Timo Sirainen <tss@iki.fi>
parents:
6335
diff
changeset
|
318 uint32_t ext_map_idx, seq1, seq2; |
3138
fbe844061fe2
Internal changes in how keywords are handled. struct mail_keywords isn't
Timo Sirainen <tss@iki.fi>
parents:
3086
diff
changeset
|
319 |
6348
ef1c7b2acc10
Only index extension indexes are now called "ext_id". For map extension
Timo Sirainen <tss@iki.fi>
parents:
6335
diff
changeset
|
320 if (!mail_index_map_lookup_ext(map, "keywords", &ext_map_idx)) { |
3138
fbe844061fe2
Internal changes in how keywords are handled. struct mail_keywords isn't
Timo Sirainen <tss@iki.fi>
parents:
3086
diff
changeset
|
321 /* nothing to do */ |
fbe844061fe2
Internal changes in how keywords are handled. struct mail_keywords isn't
Timo Sirainen <tss@iki.fi>
parents:
3086
diff
changeset
|
322 return 1; |
fbe844061fe2
Internal changes in how keywords are handled. struct mail_keywords isn't
Timo Sirainen <tss@iki.fi>
parents:
3086
diff
changeset
|
323 } |
fbe844061fe2
Internal changes in how keywords are handled. struct mail_keywords isn't
Timo Sirainen <tss@iki.fi>
parents:
3086
diff
changeset
|
324 |
6348
ef1c7b2acc10
Only index extension indexes are now called "ext_id". For map extension
Timo Sirainen <tss@iki.fi>
parents:
6335
diff
changeset
|
325 ext = array_idx(&map->extensions, ext_map_idx); |
3138
fbe844061fe2
Internal changes in how keywords are handled. struct mail_keywords isn't
Timo Sirainen <tss@iki.fi>
parents:
3086
diff
changeset
|
326 end = CONST_PTR_OFFSET(r, hdr->size); |
fbe844061fe2
Internal changes in how keywords are handled. struct mail_keywords isn't
Timo Sirainen <tss@iki.fi>
parents:
3086
diff
changeset
|
327 for (; r != end; r++) { |
6275
913b188f4dd4
Removed explicit locking from views and maps. They were already locked all
Timo Sirainen <tss@iki.fi>
parents:
5867
diff
changeset
|
328 mail_index_lookup_uid_range(ctx->view, r->uid1, r->uid2, |
913b188f4dd4
Removed explicit locking from views and maps. They were already locked all
Timo Sirainen <tss@iki.fi>
parents:
5867
diff
changeset
|
329 &seq1, &seq2); |
3138
fbe844061fe2
Internal changes in how keywords are handled. struct mail_keywords isn't
Timo Sirainen <tss@iki.fi>
parents:
3086
diff
changeset
|
330 if (seq1 == 0) |
fbe844061fe2
Internal changes in how keywords are handled. struct mail_keywords isn't
Timo Sirainen <tss@iki.fi>
parents:
3086
diff
changeset
|
331 continue; |
fbe844061fe2
Internal changes in how keywords are handled. struct mail_keywords isn't
Timo Sirainen <tss@iki.fi>
parents:
3086
diff
changeset
|
332 |
5689
c2362f144f15
Initial commit for major index file code cleanup.
Timo Sirainen <tss@iki.fi>
parents:
5399
diff
changeset
|
333 mail_index_sync_write_seq_update(ctx, seq1, seq2); |
3138
fbe844061fe2
Internal changes in how keywords are handled. struct mail_keywords isn't
Timo Sirainen <tss@iki.fi>
parents:
3086
diff
changeset
|
334 for (seq1--; seq1 < seq2; seq1++) { |
fbe844061fe2
Internal changes in how keywords are handled. struct mail_keywords isn't
Timo Sirainen <tss@iki.fi>
parents:
3086
diff
changeset
|
335 rec = MAIL_INDEX_MAP_IDX(map, seq1); |
fbe844061fe2
Internal changes in how keywords are handled. struct mail_keywords isn't
Timo Sirainen <tss@iki.fi>
parents:
3086
diff
changeset
|
336 memset(PTR_OFFSET(rec, ext->record_offset), |
fbe844061fe2
Internal changes in how keywords are handled. struct mail_keywords isn't
Timo Sirainen <tss@iki.fi>
parents:
3086
diff
changeset
|
337 0, ext->record_size); |
fbe844061fe2
Internal changes in how keywords are handled. struct mail_keywords isn't
Timo Sirainen <tss@iki.fi>
parents:
3086
diff
changeset
|
338 } |
fbe844061fe2
Internal changes in how keywords are handled. struct mail_keywords isn't
Timo Sirainen <tss@iki.fi>
parents:
3086
diff
changeset
|
339 } |
fbe844061fe2
Internal changes in how keywords are handled. struct mail_keywords isn't
Timo Sirainen <tss@iki.fi>
parents:
3086
diff
changeset
|
340 return 1; |
fbe844061fe2
Internal changes in how keywords are handled. struct mail_keywords isn't
Timo Sirainen <tss@iki.fi>
parents:
3086
diff
changeset
|
341 } |