annotate src/lib-index/mail-index-transaction-export.c @ 22576:707ae9de3812

lib: istream-multiplex - Minor code cleanup Avoid propagating the error twice, and avoid any confusion about what "got" actually contains.
author Timo Sirainen <timo.sirainen@dovecot.fi>
date Thu, 05 Oct 2017 20:24:11 +0300
parents ccbdafa83dbc
children cb108f786fb4
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
21390
2e2563132d5f Updated copyright notices to include the year 2017.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21389
diff changeset
1 /* Copyright (c) 2003-2017 Dovecot authors, see the included COPYING file */
9252
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
2
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
3 #include "lib.h"
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
4 #include "array.h"
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
5 #include "mail-index-private.h"
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
6 #include "mail-index-modseq.h"
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
7 #include "mail-transaction-log-private.h"
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
8 #include "mail-index-transaction-private.h"
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
9
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
10 struct mail_index_export_context {
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
11 struct mail_index_transaction *trans;
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
12 struct mail_transaction_log_append_ctx *append_ctx;
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
13 };
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
14
9254
0e407ad46307 More cleanups to transaction log writing code.
Timo Sirainen <tss@iki.fi>
parents: 9252
diff changeset
15 static void
0e407ad46307 More cleanups to transaction log writing code.
Timo Sirainen <tss@iki.fi>
parents: 9252
diff changeset
16 log_append_buffer(struct mail_index_export_context *ctx,
0e407ad46307 More cleanups to transaction log writing code.
Timo Sirainen <tss@iki.fi>
parents: 9252
diff changeset
17 const buffer_t *buf, enum mail_transaction_type type)
9252
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
18 {
9258
665ea7a8d26e Tests are now run on "make check". Added initial tests for lib-index.
Timo Sirainen <tss@iki.fi>
parents: 9254
diff changeset
19 mail_transaction_log_append_add(ctx->append_ctx, type,
665ea7a8d26e Tests are now run on "make check". Added initial tests for lib-index.
Timo Sirainen <tss@iki.fi>
parents: 9254
diff changeset
20 buf->data, buf->used);
9252
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
21 }
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
22
14599
dbd42f7198eb shared mailboxes: Per-user flags can now be stored in private index files.
Timo Sirainen <tss@iki.fi>
parents: 14580
diff changeset
23 static void log_append_flag_updates(struct mail_index_export_context *ctx,
dbd42f7198eb shared mailboxes: Per-user flags can now be stored in private index files.
Timo Sirainen <tss@iki.fi>
parents: 14580
diff changeset
24 struct mail_index_transaction *t)
dbd42f7198eb shared mailboxes: Per-user flags can now be stored in private index files.
Timo Sirainen <tss@iki.fi>
parents: 14580
diff changeset
25 {
14920
a097ef0a9d6d Array API changed: ARRAY_DEFINE(name, type) -> ARRAY(type) name
Timo Sirainen <tss@iki.fi>
parents: 14599
diff changeset
26 ARRAY(struct mail_transaction_flag_update) log_updates;
14599
dbd42f7198eb shared mailboxes: Per-user flags can now be stored in private index files.
Timo Sirainen <tss@iki.fi>
parents: 14580
diff changeset
27 const struct mail_index_flag_update *updates;
dbd42f7198eb shared mailboxes: Per-user flags can now be stored in private index files.
Timo Sirainen <tss@iki.fi>
parents: 14580
diff changeset
28 struct mail_transaction_flag_update *log_update;
dbd42f7198eb shared mailboxes: Per-user flags can now be stored in private index files.
Timo Sirainen <tss@iki.fi>
parents: 14580
diff changeset
29 unsigned int i, count;
dbd42f7198eb shared mailboxes: Per-user flags can now be stored in private index files.
Timo Sirainen <tss@iki.fi>
parents: 14580
diff changeset
30
dbd42f7198eb shared mailboxes: Per-user flags can now be stored in private index files.
Timo Sirainen <tss@iki.fi>
parents: 14580
diff changeset
31 updates = array_get(&t->updates, &count);
dbd42f7198eb shared mailboxes: Per-user flags can now be stored in private index files.
Timo Sirainen <tss@iki.fi>
parents: 14580
diff changeset
32 if (count == 0)
dbd42f7198eb shared mailboxes: Per-user flags can now be stored in private index files.
Timo Sirainen <tss@iki.fi>
parents: 14580
diff changeset
33 return;
dbd42f7198eb shared mailboxes: Per-user flags can now be stored in private index files.
Timo Sirainen <tss@iki.fi>
parents: 14580
diff changeset
34
dbd42f7198eb shared mailboxes: Per-user flags can now be stored in private index files.
Timo Sirainen <tss@iki.fi>
parents: 14580
diff changeset
35 i_array_init(&log_updates, count);
dbd42f7198eb shared mailboxes: Per-user flags can now be stored in private index files.
Timo Sirainen <tss@iki.fi>
parents: 14580
diff changeset
36
dbd42f7198eb shared mailboxes: Per-user flags can now be stored in private index files.
Timo Sirainen <tss@iki.fi>
parents: 14580
diff changeset
37 for (i = 0; i < count; i++) {
dbd42f7198eb shared mailboxes: Per-user flags can now be stored in private index files.
Timo Sirainen <tss@iki.fi>
parents: 14580
diff changeset
38 log_update = array_append_space(&log_updates);
dbd42f7198eb shared mailboxes: Per-user flags can now be stored in private index files.
Timo Sirainen <tss@iki.fi>
parents: 14580
diff changeset
39 log_update->uid1 = updates[i].uid1;
dbd42f7198eb shared mailboxes: Per-user flags can now be stored in private index files.
Timo Sirainen <tss@iki.fi>
parents: 14580
diff changeset
40 log_update->uid2 = updates[i].uid2;
dbd42f7198eb shared mailboxes: Per-user flags can now be stored in private index files.
Timo Sirainen <tss@iki.fi>
parents: 14580
diff changeset
41 log_update->add_flags = updates[i].add_flags & 0xff;
dbd42f7198eb shared mailboxes: Per-user flags can now be stored in private index files.
Timo Sirainen <tss@iki.fi>
parents: 14580
diff changeset
42 log_update->remove_flags = updates[i].remove_flags & 0xff;
dbd42f7198eb shared mailboxes: Per-user flags can now be stored in private index files.
Timo Sirainen <tss@iki.fi>
parents: 14580
diff changeset
43 if ((updates[i].add_flags & MAIL_INDEX_MAIL_FLAG_UPDATE_MODSEQ) != 0)
dbd42f7198eb shared mailboxes: Per-user flags can now be stored in private index files.
Timo Sirainen <tss@iki.fi>
parents: 14580
diff changeset
44 log_update->modseq_inc_flag = 1;
dbd42f7198eb shared mailboxes: Per-user flags can now be stored in private index files.
Timo Sirainen <tss@iki.fi>
parents: 14580
diff changeset
45 }
dbd42f7198eb shared mailboxes: Per-user flags can now be stored in private index files.
Timo Sirainen <tss@iki.fi>
parents: 14580
diff changeset
46 log_append_buffer(ctx, log_updates.arr.buffer,
dbd42f7198eb shared mailboxes: Per-user flags can now be stored in private index files.
Timo Sirainen <tss@iki.fi>
parents: 14580
diff changeset
47 MAIL_TRANSACTION_FLAG_UPDATE);
dbd42f7198eb shared mailboxes: Per-user flags can now be stored in private index files.
Timo Sirainen <tss@iki.fi>
parents: 14580
diff changeset
48 array_free(&log_updates);
dbd42f7198eb shared mailboxes: Per-user flags can now be stored in private index files.
Timo Sirainen <tss@iki.fi>
parents: 14580
diff changeset
49 }
dbd42f7198eb shared mailboxes: Per-user flags can now be stored in private index files.
Timo Sirainen <tss@iki.fi>
parents: 14580
diff changeset
50
9252
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
51 static const buffer_t *
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
52 log_get_hdr_update_buffer(struct mail_index_transaction *t, bool prepend)
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
53 {
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
54 buffer_t *buf;
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
55 const unsigned char *data, *mask;
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
56 struct mail_transaction_header_update u;
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
57 uint16_t offset;
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
58 int state = 0;
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
59
21389
59437f8764c6 global: Replaced all instances of memset(p, 0, sizeof(*p)) with the new i_zero() macro.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21146
diff changeset
60 i_zero(&u);
9252
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
61
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
62 data = prepend ? t->pre_hdr_change : t->post_hdr_change;
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
63 mask = prepend ? t->pre_hdr_mask : t->post_hdr_mask;
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
64
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
65 buf = buffer_create_dynamic(pool_datastack_create(), 256);
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
66 for (offset = 0; offset <= sizeof(t->pre_hdr_change); offset++) {
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
67 if (offset < sizeof(t->pre_hdr_change) && mask[offset]) {
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
68 if (state == 0) {
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
69 u.offset = offset;
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
70 state++;
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
71 }
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
72 } else {
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
73 if (state > 0) {
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
74 u.size = offset - u.offset;
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
75 buffer_append(buf, &u, sizeof(u));
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
76 buffer_append(buf, data + u.offset, u.size);
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
77 state = 0;
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
78 }
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
79 }
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
80 }
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
81 return buf;
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
82 }
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
83
17945
931ab6f3357b lib-index: Automatically grow header size on header updates.
Timo Sirainen <tss@iki.fi>
parents: 17609
diff changeset
84 static unsigned int
931ab6f3357b lib-index: Automatically grow header size on header updates.
Timo Sirainen <tss@iki.fi>
parents: 17609
diff changeset
85 ext_hdr_update_get_size(const struct mail_index_transaction_ext_hdr_update *hu)
931ab6f3357b lib-index: Automatically grow header size on header updates.
Timo Sirainen <tss@iki.fi>
parents: 17609
diff changeset
86 {
931ab6f3357b lib-index: Automatically grow header size on header updates.
Timo Sirainen <tss@iki.fi>
parents: 17609
diff changeset
87 unsigned int i;
931ab6f3357b lib-index: Automatically grow header size on header updates.
Timo Sirainen <tss@iki.fi>
parents: 17609
diff changeset
88
931ab6f3357b lib-index: Automatically grow header size on header updates.
Timo Sirainen <tss@iki.fi>
parents: 17609
diff changeset
89 for (i = hu->alloc_size; i > 0; i--) {
931ab6f3357b lib-index: Automatically grow header size on header updates.
Timo Sirainen <tss@iki.fi>
parents: 17609
diff changeset
90 if (hu->mask[i-1] != 0)
931ab6f3357b lib-index: Automatically grow header size on header updates.
Timo Sirainen <tss@iki.fi>
parents: 17609
diff changeset
91 return i;
931ab6f3357b lib-index: Automatically grow header size on header updates.
Timo Sirainen <tss@iki.fi>
parents: 17609
diff changeset
92 }
931ab6f3357b lib-index: Automatically grow header size on header updates.
Timo Sirainen <tss@iki.fi>
parents: 17609
diff changeset
93 return 0;
931ab6f3357b lib-index: Automatically grow header size on header updates.
Timo Sirainen <tss@iki.fi>
parents: 17609
diff changeset
94 }
931ab6f3357b lib-index: Automatically grow header size on header updates.
Timo Sirainen <tss@iki.fi>
parents: 17609
diff changeset
95
9252
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
96 static void log_append_ext_intro(struct mail_index_export_context *ctx,
16552
8cf482b749e2 lib-index: Assert-crash instead of writing a broken transaction with too large ext header update.
Timo Sirainen <tss@iki.fi>
parents: 16551
diff changeset
97 uint32_t ext_id, uint32_t reset_id,
8cf482b749e2 lib-index: Assert-crash instead of writing a broken transaction with too large ext header update.
Timo Sirainen <tss@iki.fi>
parents: 16551
diff changeset
98 unsigned int *hdr_size_r)
9252
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
99 {
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
100 struct mail_index_transaction *t = ctx->trans;
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
101 const struct mail_index_registered_ext *rext;
16400
a8bc96640cf0 lib-index: Create ext-intro records using the latest sizes, not initial sizes.
Timo Sirainen <tss@iki.fi>
parents: 16215
diff changeset
102 const struct mail_index_ext *ext;
9252
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
103 struct mail_transaction_ext_intro *intro, *resizes;
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
104 buffer_t *buf;
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
105 uint32_t idx;
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
106 unsigned int count;
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
107
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
108 i_assert(ext_id != (uint32_t)-1);
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
109
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
110 if (t->reset ||
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
111 !mail_index_map_get_ext_idx(t->view->index->map, ext_id, &idx)) {
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
112 /* new extension */
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
113 idx = (uint32_t)-1;
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
114 }
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
115
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
116 rext = array_idx(&t->view->index->extensions, ext_id);
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
117 if (!array_is_created(&t->ext_resizes)) {
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
118 resizes = NULL;
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
119 count = 0;
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
120 } else {
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
121 resizes = array_get_modifiable(&t->ext_resizes, &count);
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
122 }
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
123
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
124 buf = buffer_create_dynamic(pool_datastack_create(), 128);
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
125 if (ext_id < count && resizes[ext_id].name_size != 0) {
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
126 /* we're resizing the extension. use the resize struct. */
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
127 intro = &resizes[ext_id];
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
128
17417
de9b10f2e168 lib-index: Fixed somewhat random assert-crashes during extension resizes.
Timo Sirainen <tss@iki.fi>
parents: 17130
diff changeset
129 if (idx != (uint32_t)-1) {
de9b10f2e168 lib-index: Fixed somewhat random assert-crashes during extension resizes.
Timo Sirainen <tss@iki.fi>
parents: 17130
diff changeset
130 intro->ext_id = idx;
16551
04c64300f81f lib-index: Don't write a broken transaction if extension resize is done at first use.
Timo Sirainen <tss@iki.fi>
parents: 16426
diff changeset
131 intro->name_size = 0;
17417
de9b10f2e168 lib-index: Fixed somewhat random assert-crashes during extension resizes.
Timo Sirainen <tss@iki.fi>
parents: 17130
diff changeset
132 } else {
16551
04c64300f81f lib-index: Don't write a broken transaction if extension resize is done at first use.
Timo Sirainen <tss@iki.fi>
parents: 16426
diff changeset
133 intro->ext_id = (uint32_t)-1;
04c64300f81f lib-index: Don't write a broken transaction if extension resize is done at first use.
Timo Sirainen <tss@iki.fi>
parents: 16426
diff changeset
134 intro->name_size = strlen(rext->name);
04c64300f81f lib-index: Don't write a broken transaction if extension resize is done at first use.
Timo Sirainen <tss@iki.fi>
parents: 16426
diff changeset
135 }
9252
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
136 buffer_append(buf, intro, sizeof(*intro));
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
137 } else {
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
138 /* generate a new intro structure */
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
139 intro = buffer_append_space_unsafe(buf, sizeof(*intro));
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
140 intro->ext_id = idx;
20323
07f21d0fb517 lib-index: Fixes to handling resized records.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19552
diff changeset
141 intro->record_size = rext->record_size;
07f21d0fb517 lib-index: Fixes to handling resized records.
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 19552
diff changeset
142 intro->record_align = rext->record_align;
16400
a8bc96640cf0 lib-index: Create ext-intro records using the latest sizes, not initial sizes.
Timo Sirainen <tss@iki.fi>
parents: 16215
diff changeset
143 if (idx == (uint32_t)-1) {
a8bc96640cf0 lib-index: Create ext-intro records using the latest sizes, not initial sizes.
Timo Sirainen <tss@iki.fi>
parents: 16215
diff changeset
144 intro->hdr_size = rext->hdr_size;
a8bc96640cf0 lib-index: Create ext-intro records using the latest sizes, not initial sizes.
Timo Sirainen <tss@iki.fi>
parents: 16215
diff changeset
145 intro->name_size = strlen(rext->name);
a8bc96640cf0 lib-index: Create ext-intro records using the latest sizes, not initial sizes.
Timo Sirainen <tss@iki.fi>
parents: 16215
diff changeset
146 } else {
a8bc96640cf0 lib-index: Create ext-intro records using the latest sizes, not initial sizes.
Timo Sirainen <tss@iki.fi>
parents: 16215
diff changeset
147 ext = array_idx(&t->view->index->map->extensions, idx);
a8bc96640cf0 lib-index: Create ext-intro records using the latest sizes, not initial sizes.
Timo Sirainen <tss@iki.fi>
parents: 16215
diff changeset
148 intro->hdr_size = ext->hdr_size;
a8bc96640cf0 lib-index: Create ext-intro records using the latest sizes, not initial sizes.
Timo Sirainen <tss@iki.fi>
parents: 16215
diff changeset
149 intro->name_size = 0;
a8bc96640cf0 lib-index: Create ext-intro records using the latest sizes, not initial sizes.
Timo Sirainen <tss@iki.fi>
parents: 16215
diff changeset
150 }
9252
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
151 intro->flags = MAIL_TRANSACTION_EXT_INTRO_FLAG_NO_SHRINK;
17945
931ab6f3357b lib-index: Automatically grow header size on header updates.
Timo Sirainen <tss@iki.fi>
parents: 17609
diff changeset
152
931ab6f3357b lib-index: Automatically grow header size on header updates.
Timo Sirainen <tss@iki.fi>
parents: 17609
diff changeset
153 /* handle increasing header size automatically */
931ab6f3357b lib-index: Automatically grow header size on header updates.
Timo Sirainen <tss@iki.fi>
parents: 17609
diff changeset
154 if (array_is_created(&t->ext_hdr_updates) &&
931ab6f3357b lib-index: Automatically grow header size on header updates.
Timo Sirainen <tss@iki.fi>
parents: 17609
diff changeset
155 ext_id < array_count(&t->ext_hdr_updates)) {
931ab6f3357b lib-index: Automatically grow header size on header updates.
Timo Sirainen <tss@iki.fi>
parents: 17609
diff changeset
156 const struct mail_index_transaction_ext_hdr_update *hu;
931ab6f3357b lib-index: Automatically grow header size on header updates.
Timo Sirainen <tss@iki.fi>
parents: 17609
diff changeset
157 unsigned int hdr_update_size;
931ab6f3357b lib-index: Automatically grow header size on header updates.
Timo Sirainen <tss@iki.fi>
parents: 17609
diff changeset
158
931ab6f3357b lib-index: Automatically grow header size on header updates.
Timo Sirainen <tss@iki.fi>
parents: 17609
diff changeset
159 hu = array_idx(&t->ext_hdr_updates, ext_id);
931ab6f3357b lib-index: Automatically grow header size on header updates.
Timo Sirainen <tss@iki.fi>
parents: 17609
diff changeset
160 hdr_update_size = ext_hdr_update_get_size(hu);
931ab6f3357b lib-index: Automatically grow header size on header updates.
Timo Sirainen <tss@iki.fi>
parents: 17609
diff changeset
161 if (intro->hdr_size < hdr_update_size)
931ab6f3357b lib-index: Automatically grow header size on header updates.
Timo Sirainen <tss@iki.fi>
parents: 17609
diff changeset
162 intro->hdr_size = hdr_update_size;
931ab6f3357b lib-index: Automatically grow header size on header updates.
Timo Sirainen <tss@iki.fi>
parents: 17609
diff changeset
163 }
9252
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
164 }
18738
fd8edab94849 lib-index: Added asserts to make sure invalid extension records aren't written to log.
Timo Sirainen <tss@iki.fi>
parents: 18137
diff changeset
165 i_assert(intro->record_size != 0 || intro->hdr_size != 0);
9252
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
166 if (reset_id != 0) {
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
167 /* we're going to reset this extension in this transaction */
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
168 intro->reset_id = reset_id;
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
169 } else if (idx != (uint32_t)-1) {
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
170 /* use the existing reset_id */
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
171 const struct mail_index_ext *map_ext =
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
172 array_idx(&t->view->index->map->extensions, idx);
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
173 intro->reset_id = map_ext->reset_id;
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
174 } else {
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
175 /* new extension, reset_id defaults to 0 */
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
176 }
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
177 buffer_append(buf, rext->name, intro->name_size);
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
178 if ((buf->used % 4) != 0)
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
179 buffer_append_zero(buf, 4 - (buf->used % 4));
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
180
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
181 if (ctx->append_ctx->new_highest_modseq == 0 &&
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
182 strcmp(rext->name, MAIL_INDEX_MODSEQ_EXT_NAME) == 0) {
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
183 /* modseq tracking started */
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
184 ctx->append_ctx->new_highest_modseq = 1;
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
185 }
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
186
9254
0e407ad46307 More cleanups to transaction log writing code.
Timo Sirainen <tss@iki.fi>
parents: 9252
diff changeset
187 log_append_buffer(ctx, buf, MAIL_TRANSACTION_EXT_INTRO);
16552
8cf482b749e2 lib-index: Assert-crash instead of writing a broken transaction with too large ext header update.
Timo Sirainen <tss@iki.fi>
parents: 16551
diff changeset
188 *hdr_size_r = intro->hdr_size;
9252
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
189 }
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
190
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
191 static void
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
192 log_append_ext_hdr_update(struct mail_index_export_context *ctx,
16552
8cf482b749e2 lib-index: Assert-crash instead of writing a broken transaction with too large ext header update.
Timo Sirainen <tss@iki.fi>
parents: 16551
diff changeset
193 const struct mail_index_transaction_ext_hdr_update *hdr,
8cf482b749e2 lib-index: Assert-crash instead of writing a broken transaction with too large ext header update.
Timo Sirainen <tss@iki.fi>
parents: 16551
diff changeset
194 unsigned int ext_hdr_size)
9252
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
195 {
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
196 buffer_t *buf;
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
197 const unsigned char *data, *mask;
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
198 struct mail_transaction_ext_hdr_update u;
10380
8b3c802556a9 mail_index_update_header_ext(): Couldn't handle >=64k headers.
Timo Sirainen <tss@iki.fi>
parents: 9724
diff changeset
199 struct mail_transaction_ext_hdr_update32 u32;
8b3c802556a9 mail_index_update_header_ext(): Couldn't handle >=64k headers.
Timo Sirainen <tss@iki.fi>
parents: 9724
diff changeset
200 size_t offset;
8b3c802556a9 mail_index_update_header_ext(): Couldn't handle >=64k headers.
Timo Sirainen <tss@iki.fi>
parents: 9724
diff changeset
201 bool started = FALSE, use_32 = hdr->alloc_size >= 65536;
9252
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
202
21389
59437f8764c6 global: Replaced all instances of memset(p, 0, sizeof(*p)) with the new i_zero() macro.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21146
diff changeset
203 i_zero(&u);
59437f8764c6 global: Replaced all instances of memset(p, 0, sizeof(*p)) with the new i_zero() macro.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21146
diff changeset
204 i_zero(&u32);
9252
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
205
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
206 data = hdr->data;
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
207 mask = hdr->mask;
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
208
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
209 buf = buffer_create_dynamic(pool_datastack_create(), 256);
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
210 for (offset = 0; offset <= hdr->alloc_size; offset++) {
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
211 if (offset < hdr->alloc_size && mask[offset] != 0) {
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
212 if (!started) {
10380
8b3c802556a9 mail_index_update_header_ext(): Couldn't handle >=64k headers.
Timo Sirainen <tss@iki.fi>
parents: 9724
diff changeset
213 u32.offset = offset;
9252
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
214 started = TRUE;
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
215 }
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
216 } else {
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
217 if (started) {
10380
8b3c802556a9 mail_index_update_header_ext(): Couldn't handle >=64k headers.
Timo Sirainen <tss@iki.fi>
parents: 9724
diff changeset
218 u32.size = offset - u32.offset;
8b3c802556a9 mail_index_update_header_ext(): Couldn't handle >=64k headers.
Timo Sirainen <tss@iki.fi>
parents: 9724
diff changeset
219 if (use_32)
8b3c802556a9 mail_index_update_header_ext(): Couldn't handle >=64k headers.
Timo Sirainen <tss@iki.fi>
parents: 9724
diff changeset
220 buffer_append(buf, &u32, sizeof(u32));
8b3c802556a9 mail_index_update_header_ext(): Couldn't handle >=64k headers.
Timo Sirainen <tss@iki.fi>
parents: 9724
diff changeset
221 else {
8b3c802556a9 mail_index_update_header_ext(): Couldn't handle >=64k headers.
Timo Sirainen <tss@iki.fi>
parents: 9724
diff changeset
222 u.offset = u32.offset;
8b3c802556a9 mail_index_update_header_ext(): Couldn't handle >=64k headers.
Timo Sirainen <tss@iki.fi>
parents: 9724
diff changeset
223 u.size = u32.size;
8b3c802556a9 mail_index_update_header_ext(): Couldn't handle >=64k headers.
Timo Sirainen <tss@iki.fi>
parents: 9724
diff changeset
224 buffer_append(buf, &u, sizeof(u));
8b3c802556a9 mail_index_update_header_ext(): Couldn't handle >=64k headers.
Timo Sirainen <tss@iki.fi>
parents: 9724
diff changeset
225 }
16552
8cf482b749e2 lib-index: Assert-crash instead of writing a broken transaction with too large ext header update.
Timo Sirainen <tss@iki.fi>
parents: 16551
diff changeset
226 i_assert(u32.offset + u32.size <= ext_hdr_size);
10380
8b3c802556a9 mail_index_update_header_ext(): Couldn't handle >=64k headers.
Timo Sirainen <tss@iki.fi>
parents: 9724
diff changeset
227 buffer_append(buf, data + u32.offset, u32.size);
9252
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
228 started = FALSE;
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
229 }
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
230 }
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
231 }
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
232 if (buf->used % 4 != 0)
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
233 buffer_append_zero(buf, 4 - buf->used % 4);
10380
8b3c802556a9 mail_index_update_header_ext(): Couldn't handle >=64k headers.
Timo Sirainen <tss@iki.fi>
parents: 9724
diff changeset
234 log_append_buffer(ctx, buf, use_32 ? MAIL_TRANSACTION_EXT_HDR_UPDATE32 :
8b3c802556a9 mail_index_update_header_ext(): Couldn't handle >=64k headers.
Timo Sirainen <tss@iki.fi>
parents: 9724
diff changeset
235 MAIL_TRANSACTION_EXT_HDR_UPDATE);
9252
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
236 }
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
237
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
238 static void
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
239 mail_transaction_log_append_ext_intros(struct mail_index_export_context *ctx)
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
240 {
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
241 struct mail_index_transaction *t = ctx->trans;
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
242 const struct mail_transaction_ext_intro *resize;
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
243 const struct mail_index_transaction_ext_hdr_update *hdrs;
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
244 struct mail_transaction_ext_reset ext_reset;
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
245 unsigned int resize_count, ext_count = 0;
16552
8cf482b749e2 lib-index: Assert-crash instead of writing a broken transaction with too large ext header update.
Timo Sirainen <tss@iki.fi>
parents: 16551
diff changeset
246 unsigned int hdrs_count, reset_id_count, reset_count, hdr_size;
9252
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
247 uint32_t ext_id, reset_id;
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
248 const struct mail_transaction_ext_reset *reset;
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
249 const uint32_t *reset_ids;
9623
3da42dafa798 buffer_create_[const_]data() API change: Take buffer_t as parameter instead of allocating it.
Timo Sirainen <tss@iki.fi>
parents: 9258
diff changeset
250 buffer_t reset_buf;
9252
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
251
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
252 if (!array_is_created(&t->ext_resizes)) {
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
253 resize = NULL;
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
254 resize_count = 0;
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
255 } else {
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
256 resize = array_get(&t->ext_resizes, &resize_count);
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
257 if (ext_count < resize_count)
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
258 ext_count = resize_count;
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
259 }
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
260
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
261 if (!array_is_created(&t->ext_reset_ids)) {
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
262 reset_ids = NULL;
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
263 reset_id_count = 0;
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
264 } else {
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
265 reset_ids = array_get(&t->ext_reset_ids, &reset_id_count);
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
266 }
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
267
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
268 if (!array_is_created(&t->ext_resets)) {
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
269 reset = NULL;
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
270 reset_count = 0;
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
271 } else {
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
272 reset = array_get(&t->ext_resets, &reset_count);
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
273 if (ext_count < reset_count)
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
274 ext_count = reset_count;
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
275 }
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
276
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
277 if (!array_is_created(&t->ext_hdr_updates)) {
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
278 hdrs = NULL;
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
279 hdrs_count = 0;
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
280 } else {
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
281 hdrs = array_get(&t->ext_hdr_updates, &hdrs_count);
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
282 if (ext_count < hdrs_count)
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
283 ext_count = hdrs_count;
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
284 }
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
285
21389
59437f8764c6 global: Replaced all instances of memset(p, 0, sizeof(*p)) with the new i_zero() macro.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21146
diff changeset
286 i_zero(&ext_reset);
15034
7efef678bca8 Renamed buffer_create_*data() to buffer_create_from_*data() for consistency.
Timo Sirainen <tss@iki.fi>
parents: 14920
diff changeset
287 buffer_create_from_data(&reset_buf, &ext_reset, sizeof(ext_reset));
9623
3da42dafa798 buffer_create_[const_]data() API change: Take buffer_t as parameter instead of allocating it.
Timo Sirainen <tss@iki.fi>
parents: 9258
diff changeset
288 buffer_set_used_size(&reset_buf, sizeof(ext_reset));
9252
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
289
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
290 for (ext_id = 0; ext_id < ext_count; ext_id++) {
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
291 if (ext_id < reset_count)
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
292 ext_reset = reset[ext_id];
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
293 else
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
294 ext_reset.new_reset_id = 0;
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
295 if ((ext_id < resize_count && resize[ext_id].name_size) ||
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
296 ext_reset.new_reset_id != 0 ||
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
297 (ext_id < hdrs_count && hdrs[ext_id].alloc_size > 0)) {
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
298 if (ext_reset.new_reset_id != 0) {
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
299 /* we're going to reset this extension
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
300 immediately after the intro */
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
301 reset_id = 0;
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
302 } else {
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
303 reset_id = ext_id < reset_id_count ?
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
304 reset_ids[ext_id] : 0;
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
305 }
16552
8cf482b749e2 lib-index: Assert-crash instead of writing a broken transaction with too large ext header update.
Timo Sirainen <tss@iki.fi>
parents: 16551
diff changeset
306 log_append_ext_intro(ctx, ext_id, reset_id, &hdr_size);
8cf482b749e2 lib-index: Assert-crash instead of writing a broken transaction with too large ext header update.
Timo Sirainen <tss@iki.fi>
parents: 16551
diff changeset
307 } else {
8cf482b749e2 lib-index: Assert-crash instead of writing a broken transaction with too large ext header update.
Timo Sirainen <tss@iki.fi>
parents: 16551
diff changeset
308 hdr_size = 0;
9252
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
309 }
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
310 if (ext_reset.new_reset_id != 0) {
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
311 i_assert(ext_id < reset_id_count &&
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
312 ext_reset.new_reset_id == reset_ids[ext_id]);
9623
3da42dafa798 buffer_create_[const_]data() API change: Take buffer_t as parameter instead of allocating it.
Timo Sirainen <tss@iki.fi>
parents: 9258
diff changeset
313 log_append_buffer(ctx, &reset_buf,
9252
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
314 MAIL_TRANSACTION_EXT_RESET);
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
315 }
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
316 if (ext_id < hdrs_count && hdrs[ext_id].alloc_size > 0) {
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
317 T_BEGIN {
16552
8cf482b749e2 lib-index: Assert-crash instead of writing a broken transaction with too large ext header update.
Timo Sirainen <tss@iki.fi>
parents: 16551
diff changeset
318 log_append_ext_hdr_update(ctx, &hdrs[ext_id],
8cf482b749e2 lib-index: Assert-crash instead of writing a broken transaction with too large ext header update.
Timo Sirainen <tss@iki.fi>
parents: 16551
diff changeset
319 hdr_size);
9252
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
320 } T_END;
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
321 }
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
322 }
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
323 }
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
324
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
325 static void log_append_ext_recs(struct mail_index_export_context *ctx,
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
326 const ARRAY_TYPE(seq_array_array) *arr,
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
327 enum mail_transaction_type type)
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
328 {
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
329 struct mail_index_transaction *t = ctx->trans;
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
330 const ARRAY_TYPE(seq_array) *updates;
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
331 const uint32_t *reset_ids;
16552
8cf482b749e2 lib-index: Assert-crash instead of writing a broken transaction with too large ext header update.
Timo Sirainen <tss@iki.fi>
parents: 16551
diff changeset
332 unsigned int ext_id, count, reset_id_count, hdr_size;
9252
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
333 uint32_t reset_id;
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
334
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
335 if (!array_is_created(&t->ext_reset_ids)) {
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
336 reset_ids = NULL;
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
337 reset_id_count = 0;
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
338 } else {
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
339 reset_ids = array_get_modifiable(&t->ext_reset_ids,
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
340 &reset_id_count);
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
341 }
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
342
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
343 updates = array_get(arr, &count);
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
344 for (ext_id = 0; ext_id < count; ext_id++) {
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
345 if (!array_is_created(&updates[ext_id]))
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
346 continue;
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
347
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
348 reset_id = ext_id < reset_id_count ? reset_ids[ext_id] : 0;
16552
8cf482b749e2 lib-index: Assert-crash instead of writing a broken transaction with too large ext header update.
Timo Sirainen <tss@iki.fi>
parents: 16551
diff changeset
349 log_append_ext_intro(ctx, ext_id, reset_id, &hdr_size);
9252
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
350
9254
0e407ad46307 More cleanups to transaction log writing code.
Timo Sirainen <tss@iki.fi>
parents: 9252
diff changeset
351 log_append_buffer(ctx, updates[ext_id].arr.buffer, type);
9252
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
352 }
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
353 }
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
354
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
355 static void
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
356 log_append_keyword_update(struct mail_index_export_context *ctx,
9254
0e407ad46307 More cleanups to transaction log writing code.
Timo Sirainen <tss@iki.fi>
parents: 9252
diff changeset
357 buffer_t *tmp_buf, enum modify_type modify_type,
12758
99b340a4c747 lib-index: If keyword is added and remove within transaction, don't write a broken keyword update.
Timo Sirainen <tss@iki.fi>
parents: 11665
diff changeset
358 const char *keyword, const buffer_t *uid_buffer)
9252
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
359 {
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
360 struct mail_transaction_keyword_update kt_hdr;
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
361
12758
99b340a4c747 lib-index: If keyword is added and remove within transaction, don't write a broken keyword update.
Timo Sirainen <tss@iki.fi>
parents: 11665
diff changeset
362 i_assert(uid_buffer->used > 0);
99b340a4c747 lib-index: If keyword is added and remove within transaction, don't write a broken keyword update.
Timo Sirainen <tss@iki.fi>
parents: 11665
diff changeset
363
21389
59437f8764c6 global: Replaced all instances of memset(p, 0, sizeof(*p)) with the new i_zero() macro.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21146
diff changeset
364 i_zero(&kt_hdr);
9252
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
365 kt_hdr.modify_type = modify_type;
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
366 kt_hdr.name_size = strlen(keyword);
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
367
9254
0e407ad46307 More cleanups to transaction log writing code.
Timo Sirainen <tss@iki.fi>
parents: 9252
diff changeset
368 buffer_set_used_size(tmp_buf, 0);
0e407ad46307 More cleanups to transaction log writing code.
Timo Sirainen <tss@iki.fi>
parents: 9252
diff changeset
369 buffer_append(tmp_buf, &kt_hdr, sizeof(kt_hdr));
0e407ad46307 More cleanups to transaction log writing code.
Timo Sirainen <tss@iki.fi>
parents: 9252
diff changeset
370 buffer_append(tmp_buf, keyword, kt_hdr.name_size);
0e407ad46307 More cleanups to transaction log writing code.
Timo Sirainen <tss@iki.fi>
parents: 9252
diff changeset
371 if ((tmp_buf->used % 4) != 0)
0e407ad46307 More cleanups to transaction log writing code.
Timo Sirainen <tss@iki.fi>
parents: 9252
diff changeset
372 buffer_append_zero(tmp_buf, 4 - (tmp_buf->used % 4));
12758
99b340a4c747 lib-index: If keyword is added and remove within transaction, don't write a broken keyword update.
Timo Sirainen <tss@iki.fi>
parents: 11665
diff changeset
373 buffer_append(tmp_buf, uid_buffer->data, uid_buffer->used);
9252
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
374
9254
0e407ad46307 More cleanups to transaction log writing code.
Timo Sirainen <tss@iki.fi>
parents: 9252
diff changeset
375 log_append_buffer(ctx, tmp_buf, MAIL_TRANSACTION_KEYWORD_UPDATE);
9252
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
376 }
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
377
15063
0efc12f3eb2a lib-index: Changed mail_index_set_fsync_mode() to use a separate enum for the mask.
Timo Sirainen <tss@iki.fi>
parents: 15034
diff changeset
378 static enum mail_index_fsync_mask
9252
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
379 log_append_keyword_updates(struct mail_index_export_context *ctx)
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
380 {
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
381 const struct mail_index_transaction_keyword_update *updates;
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
382 const char *const *keywords;
9254
0e407ad46307 More cleanups to transaction log writing code.
Timo Sirainen <tss@iki.fi>
parents: 9252
diff changeset
383 buffer_t *tmp_buf;
15063
0efc12f3eb2a lib-index: Changed mail_index_set_fsync_mode() to use a separate enum for the mask.
Timo Sirainen <tss@iki.fi>
parents: 15034
diff changeset
384 enum mail_index_fsync_mask change_mask = 0;
9252
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
385 unsigned int i, count, keywords_count;
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
386
9254
0e407ad46307 More cleanups to transaction log writing code.
Timo Sirainen <tss@iki.fi>
parents: 9252
diff changeset
387 tmp_buf = buffer_create_dynamic(pool_datastack_create(), 64);
9252
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
388
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
389 keywords = array_get_modifiable(&ctx->trans->view->index->keywords,
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
390 &keywords_count);
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
391 updates = array_get_modifiable(&ctx->trans->keyword_updates, &count);
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
392 i_assert(count <= keywords_count);
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
393
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
394 for (i = 0; i < count; i++) {
12758
99b340a4c747 lib-index: If keyword is added and remove within transaction, don't write a broken keyword update.
Timo Sirainen <tss@iki.fi>
parents: 11665
diff changeset
395 if (array_is_created(&updates[i].add_seq) &&
99b340a4c747 lib-index: If keyword is added and remove within transaction, don't write a broken keyword update.
Timo Sirainen <tss@iki.fi>
parents: 11665
diff changeset
396 array_count(&updates[i].add_seq) > 0) {
15063
0efc12f3eb2a lib-index: Changed mail_index_set_fsync_mode() to use a separate enum for the mask.
Timo Sirainen <tss@iki.fi>
parents: 15034
diff changeset
397 change_mask |= MAIL_INDEX_FSYNC_MASK_KEYWORDS;
9254
0e407ad46307 More cleanups to transaction log writing code.
Timo Sirainen <tss@iki.fi>
parents: 9252
diff changeset
398 log_append_keyword_update(ctx, tmp_buf,
9252
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
399 MODIFY_ADD, keywords[i],
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
400 updates[i].add_seq.arr.buffer);
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
401 }
12758
99b340a4c747 lib-index: If keyword is added and remove within transaction, don't write a broken keyword update.
Timo Sirainen <tss@iki.fi>
parents: 11665
diff changeset
402 if (array_is_created(&updates[i].remove_seq) &&
99b340a4c747 lib-index: If keyword is added and remove within transaction, don't write a broken keyword update.
Timo Sirainen <tss@iki.fi>
parents: 11665
diff changeset
403 array_count(&updates[i].remove_seq) > 0) {
15063
0efc12f3eb2a lib-index: Changed mail_index_set_fsync_mode() to use a separate enum for the mask.
Timo Sirainen <tss@iki.fi>
parents: 15034
diff changeset
404 change_mask |= MAIL_INDEX_FSYNC_MASK_KEYWORDS;
9254
0e407ad46307 More cleanups to transaction log writing code.
Timo Sirainen <tss@iki.fi>
parents: 9252
diff changeset
405 log_append_keyword_update(ctx, tmp_buf,
9252
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
406 MODIFY_REMOVE, keywords[i],
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
407 updates[i].remove_seq.arr.buffer);
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
408 }
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
409 }
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
410 return change_mask;
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
411 }
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
412
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
413 void mail_index_transaction_export(struct mail_index_transaction *t,
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
414 struct mail_transaction_log_append_ctx *append_ctx)
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
415 {
10674
22354f505277 lib-index: Added support for undeleting a deleted index.
Timo Sirainen <tss@iki.fi>
parents: 10655
diff changeset
416 static uint8_t null4[4] = { 0, 0, 0, 0 };
15063
0efc12f3eb2a lib-index: Changed mail_index_set_fsync_mode() to use a separate enum for the mask.
Timo Sirainen <tss@iki.fi>
parents: 15034
diff changeset
417 enum mail_index_fsync_mask change_mask = 0;
9252
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
418 struct mail_index_export_context ctx;
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
419
21389
59437f8764c6 global: Replaced all instances of memset(p, 0, sizeof(*p)) with the new i_zero() macro.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21146
diff changeset
420 i_zero(&ctx);
9252
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
421 ctx.trans = t;
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
422 ctx.append_ctx = append_ctx;
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
423
10674
22354f505277 lib-index: Added support for undeleting a deleted index.
Timo Sirainen <tss@iki.fi>
parents: 10655
diff changeset
424 if (t->index_undeleted) {
22354f505277 lib-index: Added support for undeleting a deleted index.
Timo Sirainen <tss@iki.fi>
parents: 10655
diff changeset
425 i_assert(!t->index_deleted);
22354f505277 lib-index: Added support for undeleting a deleted index.
Timo Sirainen <tss@iki.fi>
parents: 10655
diff changeset
426 mail_transaction_log_append_add(ctx.append_ctx,
22354f505277 lib-index: Added support for undeleting a deleted index.
Timo Sirainen <tss@iki.fi>
parents: 10655
diff changeset
427 MAIL_TRANSACTION_INDEX_UNDELETED, &null4, 4);
22354f505277 lib-index: Added support for undeleting a deleted index.
Timo Sirainen <tss@iki.fi>
parents: 10655
diff changeset
428 }
22354f505277 lib-index: Added support for undeleting a deleted index.
Timo Sirainen <tss@iki.fi>
parents: 10655
diff changeset
429
9252
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
430 /* send all extension introductions and resizes before appends
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
431 to avoid resize overhead as much as possible */
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
432 mail_transaction_log_append_ext_intros(&ctx);
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
433
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
434 if (t->pre_hdr_changed) {
9254
0e407ad46307 More cleanups to transaction log writing code.
Timo Sirainen <tss@iki.fi>
parents: 9252
diff changeset
435 log_append_buffer(&ctx, log_get_hdr_update_buffer(t, TRUE),
0e407ad46307 More cleanups to transaction log writing code.
Timo Sirainen <tss@iki.fi>
parents: 9252
diff changeset
436 MAIL_TRANSACTION_HEADER_UPDATE);
9252
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
437 }
16023
db0136374bb0 lib-index: mail_index_attribute_[un]set() adds changed attributes' keys to transaction log.
Timo Sirainen <tss@iki.fi>
parents: 15715
diff changeset
438 if (t->attribute_updates != NULL) {
16215
edbfb39bc10d lib-index: Added missing NUL separator to attribute-update transaction log record.
Timo Sirainen <tss@iki.fi>
parents: 16208
diff changeset
439 buffer_append_c(t->attribute_updates, '\0');
16023
db0136374bb0 lib-index: mail_index_attribute_[un]set() adds changed attributes' keys to transaction log.
Timo Sirainen <tss@iki.fi>
parents: 15715
diff changeset
440 /* need to have 32bit alignment */
db0136374bb0 lib-index: mail_index_attribute_[un]set() adds changed attributes' keys to transaction log.
Timo Sirainen <tss@iki.fi>
parents: 15715
diff changeset
441 if (t->attribute_updates->used % 4 != 0) {
db0136374bb0 lib-index: mail_index_attribute_[un]set() adds changed attributes' keys to transaction log.
Timo Sirainen <tss@iki.fi>
parents: 15715
diff changeset
442 buffer_append_zero(t->attribute_updates,
db0136374bb0 lib-index: mail_index_attribute_[un]set() adds changed attributes' keys to transaction log.
Timo Sirainen <tss@iki.fi>
parents: 15715
diff changeset
443 4 - t->attribute_updates->used % 4);
db0136374bb0 lib-index: mail_index_attribute_[un]set() adds changed attributes' keys to transaction log.
Timo Sirainen <tss@iki.fi>
parents: 15715
diff changeset
444 }
16208
1ef57aca7d2f lib-index: Add timestamps and value lengths to attribute change records in transaction log.
Timo Sirainen <tss@iki.fi>
parents: 16023
diff changeset
445 /* append the timestamp and value lengths */
1ef57aca7d2f lib-index: Add timestamps and value lengths to attribute change records in transaction log.
Timo Sirainen <tss@iki.fi>
parents: 16023
diff changeset
446 buffer_append(t->attribute_updates,
1ef57aca7d2f lib-index: Add timestamps and value lengths to attribute change records in transaction log.
Timo Sirainen <tss@iki.fi>
parents: 16023
diff changeset
447 t->attribute_updates_suffix->data,
1ef57aca7d2f lib-index: Add timestamps and value lengths to attribute change records in transaction log.
Timo Sirainen <tss@iki.fi>
parents: 16023
diff changeset
448 t->attribute_updates_suffix->used);
1ef57aca7d2f lib-index: Add timestamps and value lengths to attribute change records in transaction log.
Timo Sirainen <tss@iki.fi>
parents: 16023
diff changeset
449 i_assert(t->attribute_updates->used % 4 == 0);
16023
db0136374bb0 lib-index: mail_index_attribute_[un]set() adds changed attributes' keys to transaction log.
Timo Sirainen <tss@iki.fi>
parents: 15715
diff changeset
450 log_append_buffer(&ctx, t->attribute_updates,
db0136374bb0 lib-index: mail_index_attribute_[un]set() adds changed attributes' keys to transaction log.
Timo Sirainen <tss@iki.fi>
parents: 15715
diff changeset
451 MAIL_TRANSACTION_ATTRIBUTE_UPDATE);
db0136374bb0 lib-index: mail_index_attribute_[un]set() adds changed attributes' keys to transaction log.
Timo Sirainen <tss@iki.fi>
parents: 15715
diff changeset
452 }
11665
b265dee142a6 Removed mail_update_uid() / mail_index_update_uid().
Timo Sirainen <tss@iki.fi>
parents: 10674
diff changeset
453 if (array_is_created(&t->appends)) {
15063
0efc12f3eb2a lib-index: Changed mail_index_set_fsync_mode() to use a separate enum for the mask.
Timo Sirainen <tss@iki.fi>
parents: 15034
diff changeset
454 change_mask |= MAIL_INDEX_FSYNC_MASK_APPENDS;
11665
b265dee142a6 Removed mail_update_uid() / mail_index_update_uid().
Timo Sirainen <tss@iki.fi>
parents: 10674
diff changeset
455 log_append_buffer(&ctx, t->appends.arr.buffer,
b265dee142a6 Removed mail_update_uid() / mail_index_update_uid().
Timo Sirainen <tss@iki.fi>
parents: 10674
diff changeset
456 MAIL_TRANSACTION_APPEND);
b265dee142a6 Removed mail_update_uid() / mail_index_update_uid().
Timo Sirainen <tss@iki.fi>
parents: 10674
diff changeset
457 }
9724
773b91d3ed13 lib-index: Fixes to handling UID changes.
Timo Sirainen <tss@iki.fi>
parents: 9691
diff changeset
458
9252
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
459 if (array_is_created(&t->updates)) {
15063
0efc12f3eb2a lib-index: Changed mail_index_set_fsync_mode() to use a separate enum for the mask.
Timo Sirainen <tss@iki.fi>
parents: 15034
diff changeset
460 change_mask |= MAIL_INDEX_FSYNC_MASK_FLAGS;
14599
dbd42f7198eb shared mailboxes: Per-user flags can now be stored in private index files.
Timo Sirainen <tss@iki.fi>
parents: 14580
diff changeset
461 log_append_flag_updates(&ctx, t);
9252
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
462 }
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
463
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
464 if (array_is_created(&t->ext_rec_updates)) {
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
465 log_append_ext_recs(&ctx, &t->ext_rec_updates,
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
466 MAIL_TRANSACTION_EXT_REC_UPDATE);
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
467 }
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
468 if (array_is_created(&t->ext_rec_atomics)) {
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
469 log_append_ext_recs(&ctx, &t->ext_rec_atomics,
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
470 MAIL_TRANSACTION_EXT_ATOMIC_INC);
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
471 }
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
472
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
473 if (array_is_created(&t->keyword_updates))
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
474 change_mask |= log_append_keyword_updates(&ctx);
9691
b09d9350a2d9 Added ability to specify message's minimum modseq value.
Timo Sirainen <tss@iki.fi>
parents: 9681
diff changeset
475 /* keep modseq updates almost last */
b09d9350a2d9 Added ability to specify message's minimum modseq value.
Timo Sirainen <tss@iki.fi>
parents: 9681
diff changeset
476 if (array_is_created(&t->modseq_updates)) {
b09d9350a2d9 Added ability to specify message's minimum modseq value.
Timo Sirainen <tss@iki.fi>
parents: 9681
diff changeset
477 log_append_buffer(&ctx, t->modseq_updates.arr.buffer,
b09d9350a2d9 Added ability to specify message's minimum modseq value.
Timo Sirainen <tss@iki.fi>
parents: 9681
diff changeset
478 MAIL_TRANSACTION_MODSEQ_UPDATE);
b09d9350a2d9 Added ability to specify message's minimum modseq value.
Timo Sirainen <tss@iki.fi>
parents: 9681
diff changeset
479 }
9252
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
480
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
481 if (array_is_created(&t->expunges)) {
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
482 /* non-external expunges are only requests, ignore them when
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
483 checking fsync_mask */
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
484 if ((t->flags & MAIL_INDEX_TRANSACTION_FLAG_EXTERNAL) != 0)
15063
0efc12f3eb2a lib-index: Changed mail_index_set_fsync_mode() to use a separate enum for the mask.
Timo Sirainen <tss@iki.fi>
parents: 15034
diff changeset
485 change_mask |= MAIL_INDEX_FSYNC_MASK_EXPUNGES;
9254
0e407ad46307 More cleanups to transaction log writing code.
Timo Sirainen <tss@iki.fi>
parents: 9252
diff changeset
486 log_append_buffer(&ctx, t->expunges.arr.buffer,
9624
2558ba736207 Keep track of expunged messages' GUIDs and expose them via mailbox_get_expunges().
Timo Sirainen <tss@iki.fi>
parents: 9623
diff changeset
487 MAIL_TRANSACTION_EXPUNGE_GUID);
9252
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
488 }
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
489
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
490 if (t->post_hdr_changed) {
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
491 log_append_buffer(&ctx, log_get_hdr_update_buffer(t, FALSE),
9254
0e407ad46307 More cleanups to transaction log writing code.
Timo Sirainen <tss@iki.fi>
parents: 9252
diff changeset
492 MAIL_TRANSACTION_HEADER_UPDATE);
9252
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
493 }
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
494
10655
fc0ac73f0b36 Added support for marking mailbox index deleted. Don't allow any changes after that.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
495 if (t->index_deleted) {
10674
22354f505277 lib-index: Added support for undeleting a deleted index.
Timo Sirainen <tss@iki.fi>
parents: 10655
diff changeset
496 i_assert(!t->index_undeleted);
10655
fc0ac73f0b36 Added support for marking mailbox index deleted. Don't allow any changes after that.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
497 mail_transaction_log_append_add(ctx.append_ctx,
fc0ac73f0b36 Added support for marking mailbox index deleted. Don't allow any changes after that.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
498 MAIL_TRANSACTION_INDEX_DELETED,
fc0ac73f0b36 Added support for marking mailbox index deleted. Don't allow any changes after that.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
499 &null4, 4);
fc0ac73f0b36 Added support for marking mailbox index deleted. Don't allow any changes after that.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
500 }
fc0ac73f0b36 Added support for marking mailbox index deleted. Don't allow any changes after that.
Timo Sirainen <tss@iki.fi>
parents: 10582
diff changeset
501
17609
16d4cf2c0d65 lib-index: Don't update log_file_tail_offset unnecessarily.
Timo Sirainen <tss@iki.fi>
parents: 17417
diff changeset
502 append_ctx->index_sync_transaction = t->sync_transaction;
16d4cf2c0d65 lib-index: Don't update log_file_tail_offset unnecessarily.
Timo Sirainen <tss@iki.fi>
parents: 17417
diff changeset
503 append_ctx->tail_offset_changed = t->tail_offset_changed;
9252
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
504 append_ctx->want_fsync =
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
505 (t->view->index->fsync_mask & change_mask) != 0 ||
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
506 (t->flags & MAIL_INDEX_TRANSACTION_FLAG_FSYNC) != 0;
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
507 }
21146
52a7790352e8 lib-index: Added mail_index_transaction_get_highest_modseq()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20323
diff changeset
508
52a7790352e8 lib-index: Added mail_index_transaction_get_highest_modseq()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20323
diff changeset
509 static unsigned int
52a7790352e8 lib-index: Added mail_index_transaction_get_highest_modseq()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20323
diff changeset
510 count_modseq_incs_with(struct mail_index_transaction *t,
52a7790352e8 lib-index: Added mail_index_transaction_get_highest_modseq()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20323
diff changeset
511 ARRAY_TYPE(seq_range) *tmp_seqs,
52a7790352e8 lib-index: Added mail_index_transaction_get_highest_modseq()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20323
diff changeset
512 const ARRAY_TYPE(seq_range) *orig_seqs)
52a7790352e8 lib-index: Added mail_index_transaction_get_highest_modseq()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20323
diff changeset
513 {
52a7790352e8 lib-index: Added mail_index_transaction_get_highest_modseq()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20323
diff changeset
514 if (!array_is_created(orig_seqs))
52a7790352e8 lib-index: Added mail_index_transaction_get_highest_modseq()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20323
diff changeset
515 return 0;
52a7790352e8 lib-index: Added mail_index_transaction_get_highest_modseq()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20323
diff changeset
516
52a7790352e8 lib-index: Added mail_index_transaction_get_highest_modseq()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20323
diff changeset
517 array_clear(tmp_seqs);
52a7790352e8 lib-index: Added mail_index_transaction_get_highest_modseq()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20323
diff changeset
518 array_append_array(tmp_seqs, orig_seqs);
52a7790352e8 lib-index: Added mail_index_transaction_get_highest_modseq()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20323
diff changeset
519 mail_index_transaction_seq_range_to_uid(t, tmp_seqs);
52a7790352e8 lib-index: Added mail_index_transaction_get_highest_modseq()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20323
diff changeset
520 return array_count(tmp_seqs) > 0 ? 1 : 0;
52a7790352e8 lib-index: Added mail_index_transaction_get_highest_modseq()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20323
diff changeset
521 }
52a7790352e8 lib-index: Added mail_index_transaction_get_highest_modseq()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20323
diff changeset
522
52a7790352e8 lib-index: Added mail_index_transaction_get_highest_modseq()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20323
diff changeset
523 static unsigned int
52a7790352e8 lib-index: Added mail_index_transaction_get_highest_modseq()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20323
diff changeset
524 mail_index_transaction_keywords_count_modseq_incs(struct mail_index_transaction *t)
52a7790352e8 lib-index: Added mail_index_transaction_get_highest_modseq()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20323
diff changeset
525 {
52a7790352e8 lib-index: Added mail_index_transaction_get_highest_modseq()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20323
diff changeset
526 const struct mail_index_transaction_keyword_update *update;
52a7790352e8 lib-index: Added mail_index_transaction_get_highest_modseq()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20323
diff changeset
527 ARRAY_TYPE(seq_range) tmp_seqs;
52a7790352e8 lib-index: Added mail_index_transaction_get_highest_modseq()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20323
diff changeset
528 unsigned int count = 0;
52a7790352e8 lib-index: Added mail_index_transaction_get_highest_modseq()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20323
diff changeset
529
52a7790352e8 lib-index: Added mail_index_transaction_get_highest_modseq()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20323
diff changeset
530 i_array_init(&tmp_seqs, 64);
52a7790352e8 lib-index: Added mail_index_transaction_get_highest_modseq()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20323
diff changeset
531 array_foreach_modifiable(&t->keyword_updates, update) {
52a7790352e8 lib-index: Added mail_index_transaction_get_highest_modseq()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20323
diff changeset
532 count += count_modseq_incs_with(t, &tmp_seqs, &update->add_seq);
52a7790352e8 lib-index: Added mail_index_transaction_get_highest_modseq()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20323
diff changeset
533 count += count_modseq_incs_with(t, &tmp_seqs, &update->remove_seq);
52a7790352e8 lib-index: Added mail_index_transaction_get_highest_modseq()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20323
diff changeset
534 }
52a7790352e8 lib-index: Added mail_index_transaction_get_highest_modseq()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20323
diff changeset
535 array_free(&tmp_seqs);
52a7790352e8 lib-index: Added mail_index_transaction_get_highest_modseq()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20323
diff changeset
536 return count;
52a7790352e8 lib-index: Added mail_index_transaction_get_highest_modseq()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20323
diff changeset
537 }
52a7790352e8 lib-index: Added mail_index_transaction_get_highest_modseq()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20323
diff changeset
538
21876
ccbdafa83dbc lib-index: Don't increase modseq for backend/dirty flag changes
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
539 static bool
ccbdafa83dbc lib-index: Don't increase modseq for backend/dirty flag changes
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
540 transaction_flag_updates_have_non_internal(struct mail_index_transaction *t)
ccbdafa83dbc lib-index: Don't increase modseq for backend/dirty flag changes
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
541 {
ccbdafa83dbc lib-index: Don't increase modseq for backend/dirty flag changes
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
542 struct mail_transaction_log_file *file = t->view->index->log->head;
ccbdafa83dbc lib-index: Don't increase modseq for backend/dirty flag changes
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
543 const uint8_t internal_flags =
ccbdafa83dbc lib-index: Don't increase modseq for backend/dirty flag changes
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
544 MAIL_INDEX_MAIL_FLAG_BACKEND | MAIL_INDEX_MAIL_FLAG_DIRTY;
ccbdafa83dbc lib-index: Don't increase modseq for backend/dirty flag changes
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
545 const struct mail_index_flag_update *u;
ccbdafa83dbc lib-index: Don't increase modseq for backend/dirty flag changes
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
546 const unsigned int hdr_version =
ccbdafa83dbc lib-index: Don't increase modseq for backend/dirty flag changes
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
547 MAIL_TRANSACTION_LOG_HDR_VERSION(&file->hdr);
ccbdafa83dbc lib-index: Don't increase modseq for backend/dirty flag changes
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
548
ccbdafa83dbc lib-index: Don't increase modseq for backend/dirty flag changes
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
549 if (!MAIL_TRANSACTION_LOG_VERSION_HAVE(hdr_version, HIDE_INTERNAL_MODSEQS)) {
ccbdafa83dbc lib-index: Don't increase modseq for backend/dirty flag changes
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
550 /* this check can be a bit racy if the call isn't done while
ccbdafa83dbc lib-index: Don't increase modseq for backend/dirty flag changes
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
551 transaction log is locked. practically it won't matter
ccbdafa83dbc lib-index: Don't increase modseq for backend/dirty flag changes
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
552 now though. */
ccbdafa83dbc lib-index: Don't increase modseq for backend/dirty flag changes
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
553 return array_count(&t->updates) > 0;
ccbdafa83dbc lib-index: Don't increase modseq for backend/dirty flag changes
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
554 }
ccbdafa83dbc lib-index: Don't increase modseq for backend/dirty flag changes
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
555
ccbdafa83dbc lib-index: Don't increase modseq for backend/dirty flag changes
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
556 array_foreach(&t->updates, u) {
ccbdafa83dbc lib-index: Don't increase modseq for backend/dirty flag changes
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
557 uint8_t changed_flags = u->add_flags | u->remove_flags;
ccbdafa83dbc lib-index: Don't increase modseq for backend/dirty flag changes
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
558
ccbdafa83dbc lib-index: Don't increase modseq for backend/dirty flag changes
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
559 if ((changed_flags & ~internal_flags) != 0)
ccbdafa83dbc lib-index: Don't increase modseq for backend/dirty flag changes
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
560 return TRUE;
ccbdafa83dbc lib-index: Don't increase modseq for backend/dirty flag changes
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
561 }
ccbdafa83dbc lib-index: Don't increase modseq for backend/dirty flag changes
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
562 return FALSE;
ccbdafa83dbc lib-index: Don't increase modseq for backend/dirty flag changes
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
563 }
ccbdafa83dbc lib-index: Don't increase modseq for backend/dirty flag changes
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
564
21146
52a7790352e8 lib-index: Added mail_index_transaction_get_highest_modseq()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20323
diff changeset
565 uint64_t mail_index_transaction_get_highest_modseq(struct mail_index_transaction *t)
52a7790352e8 lib-index: Added mail_index_transaction_get_highest_modseq()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20323
diff changeset
566 {
52a7790352e8 lib-index: Added mail_index_transaction_get_highest_modseq()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20323
diff changeset
567 struct mail_transaction_log_file *file = t->view->index->log->head;
52a7790352e8 lib-index: Added mail_index_transaction_get_highest_modseq()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20323
diff changeset
568 uint64_t new_highest_modseq = file->sync_highest_modseq;
52a7790352e8 lib-index: Added mail_index_transaction_get_highest_modseq()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20323
diff changeset
569
52a7790352e8 lib-index: Added mail_index_transaction_get_highest_modseq()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20323
diff changeset
570 i_assert(file->locked);
52a7790352e8 lib-index: Added mail_index_transaction_get_highest_modseq()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20323
diff changeset
571
52a7790352e8 lib-index: Added mail_index_transaction_get_highest_modseq()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20323
diff changeset
572 if (new_highest_modseq == 0) {
52a7790352e8 lib-index: Added mail_index_transaction_get_highest_modseq()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20323
diff changeset
573 /* highest-modseq tracking isn't enabled in this transaction
52a7790352e8 lib-index: Added mail_index_transaction_get_highest_modseq()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20323
diff changeset
574 log file. This shouldn't happen with logs created since
52a7790352e8 lib-index: Added mail_index_transaction_get_highest_modseq()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20323
diff changeset
575 v2.2.26+, because initial_modseq is always set. We don't
52a7790352e8 lib-index: Added mail_index_transaction_get_highest_modseq()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20323
diff changeset
576 also bother checking if this transaction itself enables the
52a7790352e8 lib-index: Added mail_index_transaction_get_highest_modseq()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20323
diff changeset
577 highest-modseq tracking, because it's always done as a
52a7790352e8 lib-index: Added mail_index_transaction_get_highest_modseq()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20323
diff changeset
578 standalone transaction in mail_index_modseq_enable(),
52a7790352e8 lib-index: Added mail_index_transaction_get_highest_modseq()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20323
diff changeset
579 which doesn't care about this function. */
52a7790352e8 lib-index: Added mail_index_transaction_get_highest_modseq()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20323
diff changeset
580 i_warning("%s: Requested highest-modseq for transaction, "
52a7790352e8 lib-index: Added mail_index_transaction_get_highest_modseq()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20323
diff changeset
581 "but modseq tracking isn't enabled for the file "
52a7790352e8 lib-index: Added mail_index_transaction_get_highest_modseq()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20323
diff changeset
582 "(this shouldn't happen)", file->filepath);
52a7790352e8 lib-index: Added mail_index_transaction_get_highest_modseq()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20323
diff changeset
583 return 0;
52a7790352e8 lib-index: Added mail_index_transaction_get_highest_modseq()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20323
diff changeset
584 }
52a7790352e8 lib-index: Added mail_index_transaction_get_highest_modseq()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20323
diff changeset
585
52a7790352e8 lib-index: Added mail_index_transaction_get_highest_modseq()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20323
diff changeset
586 /* finish everything that can affect highest-modseq */
52a7790352e8 lib-index: Added mail_index_transaction_get_highest_modseq()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20323
diff changeset
587 mail_index_transaction_finish_so_far(t);
52a7790352e8 lib-index: Added mail_index_transaction_get_highest_modseq()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20323
diff changeset
588
52a7790352e8 lib-index: Added mail_index_transaction_get_highest_modseq()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20323
diff changeset
589 /* NOTE: keep in sync with mail_transaction_update_modseq() */
52a7790352e8 lib-index: Added mail_index_transaction_get_highest_modseq()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20323
diff changeset
590 if (array_is_created(&t->appends) && array_count(&t->appends) > 0) {
52a7790352e8 lib-index: Added mail_index_transaction_get_highest_modseq()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20323
diff changeset
591 /* sorting may change the order of keyword_updates, */
52a7790352e8 lib-index: Added mail_index_transaction_get_highest_modseq()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20323
diff changeset
592 new_highest_modseq++;
52a7790352e8 lib-index: Added mail_index_transaction_get_highest_modseq()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20323
diff changeset
593 }
21876
ccbdafa83dbc lib-index: Don't increase modseq for backend/dirty flag changes
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
594 if (array_is_created(&t->updates) &&
ccbdafa83dbc lib-index: Don't increase modseq for backend/dirty flag changes
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
595 transaction_flag_updates_have_non_internal(t) > 0)
21146
52a7790352e8 lib-index: Added mail_index_transaction_get_highest_modseq()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20323
diff changeset
596 new_highest_modseq++;
52a7790352e8 lib-index: Added mail_index_transaction_get_highest_modseq()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20323
diff changeset
597 if (array_is_created(&t->keyword_updates)) {
52a7790352e8 lib-index: Added mail_index_transaction_get_highest_modseq()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20323
diff changeset
598 new_highest_modseq +=
52a7790352e8 lib-index: Added mail_index_transaction_get_highest_modseq()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20323
diff changeset
599 mail_index_transaction_keywords_count_modseq_incs(t);
52a7790352e8 lib-index: Added mail_index_transaction_get_highest_modseq()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20323
diff changeset
600 }
52a7790352e8 lib-index: Added mail_index_transaction_get_highest_modseq()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20323
diff changeset
601 if (t->attribute_updates != NULL)
52a7790352e8 lib-index: Added mail_index_transaction_get_highest_modseq()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20323
diff changeset
602 new_highest_modseq++;
52a7790352e8 lib-index: Added mail_index_transaction_get_highest_modseq()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20323
diff changeset
603 /* NOTE: the order of modseq_updates and everything following it
52a7790352e8 lib-index: Added mail_index_transaction_get_highest_modseq()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20323
diff changeset
604 must match mail_index_transaction_export(). */
52a7790352e8 lib-index: Added mail_index_transaction_get_highest_modseq()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20323
diff changeset
605 if (array_is_created(&t->modseq_updates)) {
52a7790352e8 lib-index: Added mail_index_transaction_get_highest_modseq()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20323
diff changeset
606 const struct mail_transaction_modseq_update *mu;
52a7790352e8 lib-index: Added mail_index_transaction_get_highest_modseq()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20323
diff changeset
607
52a7790352e8 lib-index: Added mail_index_transaction_get_highest_modseq()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20323
diff changeset
608 /* mail_index_update_highest_modseq() is handled here also,
52a7790352e8 lib-index: Added mail_index_transaction_get_highest_modseq()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20323
diff changeset
609 as a special case of uid==0. */
52a7790352e8 lib-index: Added mail_index_transaction_get_highest_modseq()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20323
diff changeset
610 array_foreach(&t->modseq_updates, mu) {
52a7790352e8 lib-index: Added mail_index_transaction_get_highest_modseq()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20323
diff changeset
611 uint64_t modseq = ((uint64_t)mu->modseq_high32 << 32) |
52a7790352e8 lib-index: Added mail_index_transaction_get_highest_modseq()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20323
diff changeset
612 mu->modseq_low32;
52a7790352e8 lib-index: Added mail_index_transaction_get_highest_modseq()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20323
diff changeset
613 if (new_highest_modseq < modseq)
52a7790352e8 lib-index: Added mail_index_transaction_get_highest_modseq()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20323
diff changeset
614 new_highest_modseq = modseq;
52a7790352e8 lib-index: Added mail_index_transaction_get_highest_modseq()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20323
diff changeset
615 }
52a7790352e8 lib-index: Added mail_index_transaction_get_highest_modseq()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20323
diff changeset
616 }
52a7790352e8 lib-index: Added mail_index_transaction_get_highest_modseq()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20323
diff changeset
617 if (array_is_created(&t->expunges) && array_count(&t->expunges) > 0 &&
52a7790352e8 lib-index: Added mail_index_transaction_get_highest_modseq()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20323
diff changeset
618 (t->flags & MAIL_INDEX_TRANSACTION_FLAG_EXTERNAL) != 0)
52a7790352e8 lib-index: Added mail_index_transaction_get_highest_modseq()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20323
diff changeset
619 new_highest_modseq++;
52a7790352e8 lib-index: Added mail_index_transaction_get_highest_modseq()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20323
diff changeset
620 return new_highest_modseq;
52a7790352e8 lib-index: Added mail_index_transaction_get_highest_modseq()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20323
diff changeset
621 }