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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
3d48109409bf Added an assert
Timo Sirainen <tss@iki.fi>
parents: 6323
diff changeset
54 i_assert((size_t)(name - (const char *)kw_hdr) < ext->hdr_size);
3d48109409bf Added an assert
Timo Sirainen <tss@iki.fi>
parents: 6323
diff changeset
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
66c44404f9a1 Keyword fixes.
Timo Sirainen <tss@iki.fi>
parents: 3016
diff changeset
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
66c44404f9a1 Keyword fixes.
Timo Sirainen <tss@iki.fi>
parents: 3016
diff changeset
294 }
66c44404f9a1 Keyword fixes.
Timo Sirainen <tss@iki.fi>
parents: 3016
diff changeset
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 }