Mercurial > dovecot > core-2.2
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 |
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 } |