annotate src/lib-index/mail-index-transaction-finish.c @ 22691:dca05b22217b

director: Fix crash when handling expired USER timestamps. The fix in 154f91726624265fce15097eb4bbbf6e55f8c477 wasn't complete.
author Timo Sirainen <timo.sirainen@dovecot.fi>
date Tue, 28 Nov 2017 13:10:35 +0200
parents d1860907acf9
children cb108f786fb4
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
21390
2e2563132d5f Updated copyright notices to include the year 2017.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 21146
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"
21570
d1860907acf9 lib-index: Add day_stamp parameter to mail_index_update_day_headers()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
5 #include "ioloop.h"
9252
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
6 #include "mail-index-private.h"
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
7 #include "mail-index-modseq.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
9624
2558ba736207 Keep track of expunged messages' GUIDs and expose them via mailbox_get_expunges().
Timo Sirainen <tss@iki.fi>
parents: 9622
diff changeset
10 int mail_transaction_expunge_guid_cmp(const struct mail_transaction_expunge_guid *e1,
2558ba736207 Keep track of expunged messages' GUIDs and expose them via mailbox_get_expunges().
Timo Sirainen <tss@iki.fi>
parents: 9622
diff changeset
11 const struct mail_transaction_expunge_guid *e2)
2558ba736207 Keep track of expunged messages' GUIDs and expose them via mailbox_get_expunges().
Timo Sirainen <tss@iki.fi>
parents: 9622
diff changeset
12 {
2558ba736207 Keep track of expunged messages' GUIDs and expose them via mailbox_get_expunges().
Timo Sirainen <tss@iki.fi>
parents: 9622
diff changeset
13 if (e1->uid < e2->uid)
2558ba736207 Keep track of expunged messages' GUIDs and expose them via mailbox_get_expunges().
Timo Sirainen <tss@iki.fi>
parents: 9622
diff changeset
14 return -1;
2558ba736207 Keep track of expunged messages' GUIDs and expose them via mailbox_get_expunges().
Timo Sirainen <tss@iki.fi>
parents: 9622
diff changeset
15 else if (e1->uid > e2->uid)
2558ba736207 Keep track of expunged messages' GUIDs and expose them via mailbox_get_expunges().
Timo Sirainen <tss@iki.fi>
parents: 9622
diff changeset
16 return 1;
2558ba736207 Keep track of expunged messages' GUIDs and expose them via mailbox_get_expunges().
Timo Sirainen <tss@iki.fi>
parents: 9622
diff changeset
17 else
2558ba736207 Keep track of expunged messages' GUIDs and expose them via mailbox_get_expunges().
Timo Sirainen <tss@iki.fi>
parents: 9622
diff changeset
18 return 0;
2558ba736207 Keep track of expunged messages' GUIDs and expose them via mailbox_get_expunges().
Timo Sirainen <tss@iki.fi>
parents: 9622
diff changeset
19 }
2558ba736207 Keep track of expunged messages' GUIDs and expose them via mailbox_get_expunges().
Timo Sirainen <tss@iki.fi>
parents: 9622
diff changeset
20
2558ba736207 Keep track of expunged messages' GUIDs and expose them via mailbox_get_expunges().
Timo Sirainen <tss@iki.fi>
parents: 9622
diff changeset
21 void mail_index_transaction_sort_expunges(struct mail_index_transaction *t)
2558ba736207 Keep track of expunged messages' GUIDs and expose them via mailbox_get_expunges().
Timo Sirainen <tss@iki.fi>
parents: 9622
diff changeset
22 {
2558ba736207 Keep track of expunged messages' GUIDs and expose them via mailbox_get_expunges().
Timo Sirainen <tss@iki.fi>
parents: 9622
diff changeset
23 if (!t->expunges_nonsorted)
2558ba736207 Keep track of expunged messages' GUIDs and expose them via mailbox_get_expunges().
Timo Sirainen <tss@iki.fi>
parents: 9622
diff changeset
24 return;
2558ba736207 Keep track of expunged messages' GUIDs and expose them via mailbox_get_expunges().
Timo Sirainen <tss@iki.fi>
parents: 9622
diff changeset
25
2558ba736207 Keep track of expunged messages' GUIDs and expose them via mailbox_get_expunges().
Timo Sirainen <tss@iki.fi>
parents: 9622
diff changeset
26 array_sort(&t->expunges, mail_transaction_expunge_guid_cmp);
2558ba736207 Keep track of expunged messages' GUIDs and expose them via mailbox_get_expunges().
Timo Sirainen <tss@iki.fi>
parents: 9622
diff changeset
27 t->expunges_nonsorted = FALSE;
2558ba736207 Keep track of expunged messages' GUIDs and expose them via mailbox_get_expunges().
Timo Sirainen <tss@iki.fi>
parents: 9622
diff changeset
28 }
2558ba736207 Keep track of expunged messages' GUIDs and expose them via mailbox_get_expunges().
Timo Sirainen <tss@iki.fi>
parents: 9622
diff changeset
29
9252
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
30 static void
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
31 ext_reset_update_atomic(struct mail_index_transaction *t,
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
32 uint32_t ext_id, uint32_t expected_reset_id)
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
33 {
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
34 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
35 struct mail_transaction_ext_reset *reset;
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
36 uint32_t idx, reset_id;
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
37
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
38 if (!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
39 /* new extension */
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
40 reset_id = 1;
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
41 } else {
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
42 map_ext = 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
43 reset_id = map_ext->reset_id + 1;
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
44 }
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
45 if (reset_id != expected_reset_id) {
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
46 /* ignore this extension update */
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
47 mail_index_ext_set_reset_id(t, ext_id, 0);
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
48 return;
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
49 }
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
50
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
51 if (reset_id == 0)
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
52 reset_id++;
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 array_idx_set(&t->ext_reset_ids, ext_id, &reset_id);
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
55
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
56 /* reseting existing data is optional */
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
57 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
58 reset = array_idx_modifiable(&t->ext_resets, ext_id);
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
59 if (reset->new_reset_id == (uint32_t)-1)
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
60 reset->new_reset_id = reset_id;
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 }
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
63
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
64 static void
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
65 transaction_update_atomic_reset_ids(struct mail_index_transaction *t)
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
66 {
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
67 const uint32_t *expected_reset_ids;
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
68 unsigned int ext_id, count;
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
69
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
70 if (!array_is_created(&t->ext_reset_atomic))
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
71 return;
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
72
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
73 expected_reset_ids = array_get(&t->ext_reset_atomic, &count);
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
74 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
75 if (expected_reset_ids[ext_id] != 0) {
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
76 ext_reset_update_atomic(t, ext_id,
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
77 expected_reset_ids[ext_id]);
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
9616
1f8629349b41 mail_index_update_flags*() now does a better job of merging flag changes together.
Timo Sirainen <tss@iki.fi>
parents: 9252
diff changeset
82 static unsigned int
1f8629349b41 mail_index_update_flags*() now does a better job of merging flag changes together.
Timo Sirainen <tss@iki.fi>
parents: 9252
diff changeset
83 mail_transaction_drop_range(struct mail_index_transaction *t,
14599
dbd42f7198eb shared mailboxes: Per-user flags can now be stored in private index files.
Timo Sirainen <tss@iki.fi>
parents: 14580
diff changeset
84 struct mail_index_flag_update update,
9616
1f8629349b41 mail_index_update_flags*() now does a better job of merging flag changes together.
Timo Sirainen <tss@iki.fi>
parents: 9252
diff changeset
85 unsigned int update_idx,
1f8629349b41 mail_index_update_flags*() now does a better job of merging flag changes together.
Timo Sirainen <tss@iki.fi>
parents: 9252
diff changeset
86 ARRAY_TYPE(seq_range) *keeps)
1f8629349b41 mail_index_update_flags*() now does a better job of merging flag changes together.
Timo Sirainen <tss@iki.fi>
parents: 9252
diff changeset
87 {
1f8629349b41 mail_index_update_flags*() now does a better job of merging flag changes together.
Timo Sirainen <tss@iki.fi>
parents: 9252
diff changeset
88 const struct seq_range *keep_range;
1f8629349b41 mail_index_update_flags*() now does a better job of merging flag changes together.
Timo Sirainen <tss@iki.fi>
parents: 9252
diff changeset
89 unsigned int i, keep_count;
1f8629349b41 mail_index_update_flags*() now does a better job of merging flag changes together.
Timo Sirainen <tss@iki.fi>
parents: 9252
diff changeset
90
1f8629349b41 mail_index_update_flags*() now does a better job of merging flag changes together.
Timo Sirainen <tss@iki.fi>
parents: 9252
diff changeset
91 keep_range = array_get(keeps, &keep_count);
1f8629349b41 mail_index_update_flags*() now does a better job of merging flag changes together.
Timo Sirainen <tss@iki.fi>
parents: 9252
diff changeset
92 if (keep_count == 1 &&
1f8629349b41 mail_index_update_flags*() now does a better job of merging flag changes together.
Timo Sirainen <tss@iki.fi>
parents: 9252
diff changeset
93 update.uid1 == keep_range[0].seq1 &&
1f8629349b41 mail_index_update_flags*() now does a better job of merging flag changes together.
Timo Sirainen <tss@iki.fi>
parents: 9252
diff changeset
94 update.uid2 == keep_range[0].seq2) {
1f8629349b41 mail_index_update_flags*() now does a better job of merging flag changes together.
Timo Sirainen <tss@iki.fi>
parents: 9252
diff changeset
95 /* evereything is kept */
1f8629349b41 mail_index_update_flags*() now does a better job of merging flag changes together.
Timo Sirainen <tss@iki.fi>
parents: 9252
diff changeset
96 return update_idx + 1;
1f8629349b41 mail_index_update_flags*() now does a better job of merging flag changes together.
Timo Sirainen <tss@iki.fi>
parents: 9252
diff changeset
97 }
1f8629349b41 mail_index_update_flags*() now does a better job of merging flag changes together.
Timo Sirainen <tss@iki.fi>
parents: 9252
diff changeset
98
1f8629349b41 mail_index_update_flags*() now does a better job of merging flag changes together.
Timo Sirainen <tss@iki.fi>
parents: 9252
diff changeset
99 array_delete(&t->updates, update_idx, 1);
1f8629349b41 mail_index_update_flags*() now does a better job of merging flag changes together.
Timo Sirainen <tss@iki.fi>
parents: 9252
diff changeset
100
1f8629349b41 mail_index_update_flags*() now does a better job of merging flag changes together.
Timo Sirainen <tss@iki.fi>
parents: 9252
diff changeset
101 /* add back all the updates we want to keep */
1f8629349b41 mail_index_update_flags*() now does a better job of merging flag changes together.
Timo Sirainen <tss@iki.fi>
parents: 9252
diff changeset
102 for (i = 0; i < keep_count; i++, update_idx++) {
1f8629349b41 mail_index_update_flags*() now does a better job of merging flag changes together.
Timo Sirainen <tss@iki.fi>
parents: 9252
diff changeset
103 update.uid1 = keep_range[i].seq1;
1f8629349b41 mail_index_update_flags*() now does a better job of merging flag changes together.
Timo Sirainen <tss@iki.fi>
parents: 9252
diff changeset
104 update.uid2 = keep_range[i].seq2;
1f8629349b41 mail_index_update_flags*() now does a better job of merging flag changes together.
Timo Sirainen <tss@iki.fi>
parents: 9252
diff changeset
105 array_insert(&t->updates, update_idx, &update, 1);
1f8629349b41 mail_index_update_flags*() now does a better job of merging flag changes together.
Timo Sirainen <tss@iki.fi>
parents: 9252
diff changeset
106 }
1f8629349b41 mail_index_update_flags*() now does a better job of merging flag changes together.
Timo Sirainen <tss@iki.fi>
parents: 9252
diff changeset
107 return update_idx;
1f8629349b41 mail_index_update_flags*() now does a better job of merging flag changes together.
Timo Sirainen <tss@iki.fi>
parents: 9252
diff changeset
108 }
1f8629349b41 mail_index_update_flags*() now does a better job of merging flag changes together.
Timo Sirainen <tss@iki.fi>
parents: 9252
diff changeset
109
1f8629349b41 mail_index_update_flags*() now does a better job of merging flag changes together.
Timo Sirainen <tss@iki.fi>
parents: 9252
diff changeset
110 static void
1f8629349b41 mail_index_update_flags*() now does a better job of merging flag changes together.
Timo Sirainen <tss@iki.fi>
parents: 9252
diff changeset
111 mail_index_transaction_finish_flag_updates(struct mail_index_transaction *t)
1f8629349b41 mail_index_update_flags*() now does a better job of merging flag changes together.
Timo Sirainen <tss@iki.fi>
parents: 9252
diff changeset
112 {
14599
dbd42f7198eb shared mailboxes: Per-user flags can now be stored in private index files.
Timo Sirainen <tss@iki.fi>
parents: 14580
diff changeset
113 const struct mail_index_flag_update *updates, *u;
9616
1f8629349b41 mail_index_update_flags*() now does a better job of merging flag changes together.
Timo Sirainen <tss@iki.fi>
parents: 9252
diff changeset
114 const struct mail_index_record *rec;
1f8629349b41 mail_index_update_flags*() now does a better job of merging flag changes together.
Timo Sirainen <tss@iki.fi>
parents: 9252
diff changeset
115 unsigned int i, count;
1f8629349b41 mail_index_update_flags*() now does a better job of merging flag changes together.
Timo Sirainen <tss@iki.fi>
parents: 9252
diff changeset
116 ARRAY_TYPE(seq_range) keeps;
1f8629349b41 mail_index_update_flags*() now does a better job of merging flag changes together.
Timo Sirainen <tss@iki.fi>
parents: 9252
diff changeset
117 uint32_t seq;
1f8629349b41 mail_index_update_flags*() now does a better job of merging flag changes together.
Timo Sirainen <tss@iki.fi>
parents: 9252
diff changeset
118
11741
962c9144a31d lib-index: Crashfix in some cases when flags unexpectedly weren't changed
Timo Sirainen <tss@iki.fi>
parents: 11665
diff changeset
119 if (!t->drop_unnecessary_flag_updates || !array_is_created(&t->updates))
9616
1f8629349b41 mail_index_update_flags*() now does a better job of merging flag changes together.
Timo Sirainen <tss@iki.fi>
parents: 9252
diff changeset
120 return;
1f8629349b41 mail_index_update_flags*() now does a better job of merging flag changes together.
Timo Sirainen <tss@iki.fi>
parents: 9252
diff changeset
121
1f8629349b41 mail_index_update_flags*() now does a better job of merging flag changes together.
Timo Sirainen <tss@iki.fi>
parents: 9252
diff changeset
122 t_array_init(&keeps, 64);
1f8629349b41 mail_index_update_flags*() now does a better job of merging flag changes together.
Timo Sirainen <tss@iki.fi>
parents: 9252
diff changeset
123 updates = array_get(&t->updates, &count);
1f8629349b41 mail_index_update_flags*() now does a better job of merging flag changes together.
Timo Sirainen <tss@iki.fi>
parents: 9252
diff changeset
124 for (i = 0; i < count; ) {
1f8629349b41 mail_index_update_flags*() now does a better job of merging flag changes together.
Timo Sirainen <tss@iki.fi>
parents: 9252
diff changeset
125 /* first get the list of changes to drop */
1f8629349b41 mail_index_update_flags*() now does a better job of merging flag changes together.
Timo Sirainen <tss@iki.fi>
parents: 9252
diff changeset
126 u = &updates[i];
1f8629349b41 mail_index_update_flags*() now does a better job of merging flag changes together.
Timo Sirainen <tss@iki.fi>
parents: 9252
diff changeset
127 array_clear(&keeps);
1f8629349b41 mail_index_update_flags*() now does a better job of merging flag changes together.
Timo Sirainen <tss@iki.fi>
parents: 9252
diff changeset
128 for (seq = u->uid1; seq <= u->uid2; seq++) {
1f8629349b41 mail_index_update_flags*() now does a better job of merging flag changes together.
Timo Sirainen <tss@iki.fi>
parents: 9252
diff changeset
129 rec = mail_index_lookup(t->view, seq);
1f8629349b41 mail_index_update_flags*() now does a better job of merging flag changes together.
Timo Sirainen <tss@iki.fi>
parents: 9252
diff changeset
130 if ((rec->flags & u->add_flags) != u->add_flags ||
1f8629349b41 mail_index_update_flags*() now does a better job of merging flag changes together.
Timo Sirainen <tss@iki.fi>
parents: 9252
diff changeset
131 (rec->flags & u->remove_flags) != 0) {
1f8629349b41 mail_index_update_flags*() now does a better job of merging flag changes together.
Timo Sirainen <tss@iki.fi>
parents: 9252
diff changeset
132 /* keep this change */
14676
69ba6977bed8 seq_range_array_add() API changed. Added other functions to provide the less common use cases.
Timo Sirainen <tss@iki.fi>
parents: 14599
diff changeset
133 seq_range_array_add(&keeps, seq);
9616
1f8629349b41 mail_index_update_flags*() now does a better job of merging flag changes together.
Timo Sirainen <tss@iki.fi>
parents: 9252
diff changeset
134 }
1f8629349b41 mail_index_update_flags*() now does a better job of merging flag changes together.
Timo Sirainen <tss@iki.fi>
parents: 9252
diff changeset
135 }
1f8629349b41 mail_index_update_flags*() now does a better job of merging flag changes together.
Timo Sirainen <tss@iki.fi>
parents: 9252
diff changeset
136 i = mail_transaction_drop_range(t, updates[i], i, &keeps);
9618
8bdfb66bf660 Fix to previous flag update changes: Avoid crashes / infinite looping.
Timo Sirainen <tss@iki.fi>
parents: 9617
diff changeset
137 updates = array_get(&t->updates, &count);
9616
1f8629349b41 mail_index_update_flags*() now does a better job of merging flag changes together.
Timo Sirainen <tss@iki.fi>
parents: 9252
diff changeset
138 }
9617
e852cb4c5cd2 If all flag changes are dropped, make sure we don't write anything to transaction log.
Timo Sirainen <tss@iki.fi>
parents: 9616
diff changeset
139
e852cb4c5cd2 If all flag changes are dropped, make sure we don't write anything to transaction log.
Timo Sirainen <tss@iki.fi>
parents: 9616
diff changeset
140 if (array_count(&t->updates) == 0)
e852cb4c5cd2 If all flag changes are dropped, make sure we don't write anything to transaction log.
Timo Sirainen <tss@iki.fi>
parents: 9616
diff changeset
141 array_free(&t->updates);
9616
1f8629349b41 mail_index_update_flags*() now does a better job of merging flag changes together.
Timo Sirainen <tss@iki.fi>
parents: 9252
diff changeset
142 }
1f8629349b41 mail_index_update_flags*() now does a better job of merging flag changes together.
Timo Sirainen <tss@iki.fi>
parents: 9252
diff changeset
143
9252
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
144 static void
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
145 mail_index_transaction_check_conflicts(struct mail_index_transaction *t)
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
146 {
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
147 uint32_t seq;
9626
b45be8d8b388 mail index transactions: More code cleanups and unit tests.
Timo Sirainen <tss@iki.fi>
parents: 9625
diff changeset
148 bool ret1, ret2;
9252
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
149
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
150 i_assert(t->max_modseq != 0);
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
151 i_assert(t->conflict_seqs != NULL);
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
152
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
153 if (t->max_modseq == mail_index_modseq_get_highest(t->view)) {
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
154 /* no conflicts possible */
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
155 return;
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
156 }
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
157 if (t->min_flagupdate_seq == 0) {
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
158 /* no flag updates */
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
159 return;
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
160 }
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
161
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
162 for (seq = t->min_flagupdate_seq; seq <= t->max_flagupdate_seq; seq++) {
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
163 if (mail_index_modseq_lookup(t->view, seq) > t->max_modseq) {
9626
b45be8d8b388 mail index transactions: More code cleanups and unit tests.
Timo Sirainen <tss@iki.fi>
parents: 9625
diff changeset
164 ret1 = mail_index_cancel_flag_updates(t, seq);
b45be8d8b388 mail index transactions: More code cleanups and unit tests.
Timo Sirainen <tss@iki.fi>
parents: 9625
diff changeset
165 ret2 = mail_index_cancel_keyword_updates(t, seq);
14678
42d1459958ec seq_range_array_add() API change triggered a crash in buggy code.
Timo Sirainen <tss@iki.fi>
parents: 14676
diff changeset
166 if (ret1 || ret2) {
42d1459958ec seq_range_array_add() API change triggered a crash in buggy code.
Timo Sirainen <tss@iki.fi>
parents: 14676
diff changeset
167 seq_range_array_add_with_init(t->conflict_seqs,
42d1459958ec seq_range_array_add() API change triggered a crash in buggy code.
Timo Sirainen <tss@iki.fi>
parents: 14676
diff changeset
168 16, seq);
42d1459958ec seq_range_array_add() API change triggered a crash in buggy code.
Timo Sirainen <tss@iki.fi>
parents: 14676
diff changeset
169 }
9252
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
170 }
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
171 }
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
172 mail_index_transaction_set_log_updates(t);
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
173 }
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
174
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
175 static uint32_t
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
176 mail_index_transaction_get_uid(struct mail_index_transaction *t, uint32_t seq)
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
177 {
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
178 const struct mail_index_record *rec;
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
179
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
180 i_assert(seq > 0);
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
181
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
182 if (seq >= t->first_new_seq)
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
183 rec = mail_index_transaction_lookup(t, seq);
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
184 else {
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
185 i_assert(seq <= t->view->map->hdr.messages_count);
17428
4b1117b5cd8e mail-index: trivial robomatic migration from _MAP_IDX to new helper
Phil Carmody <phil@dovecot.fi>
parents: 17130
diff changeset
186 rec = MAIL_INDEX_REC_AT_SEQ(t->view->map, seq);
9252
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
187 }
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
188 i_assert(rec->uid != 0);
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
189 return rec->uid;
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
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
192 static void
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
193 mail_index_convert_to_uids(struct mail_index_transaction *t,
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
194 ARRAY_TYPE(seq_array) *array)
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 uint32_t *seq;
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
197 unsigned int i, count;
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
198
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
199 if (!array_is_created(array))
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
200 return;
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
201
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
202 count = array_count(array);
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
203 for (i = 0; i < count; i++) {
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
204 seq = array_idx_modifiable(array, i);
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
205 *seq = mail_index_transaction_get_uid(t, *seq);
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
206 }
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
207 }
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 static uint32_t
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
210 get_nonexpunged_uid2(struct mail_index_transaction *t,
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
211 uint32_t uid1, uint32_t seq1)
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
212 {
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
213 seq1++;
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
214
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
215 while (mail_index_transaction_get_uid(t, seq1) == uid1 + 1) {
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
216 seq1++;
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
217 uid1++;
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
218 }
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
219 return uid1;
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
220 }
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
221
21146
52a7790352e8 lib-index: Added mail_index_transaction_get_highest_modseq()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21145
diff changeset
222 void mail_index_transaction_seq_range_to_uid(struct mail_index_transaction *t,
52a7790352e8 lib-index: Added mail_index_transaction_get_highest_modseq()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21145
diff changeset
223 ARRAY_TYPE(seq_range) *array)
9252
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
224 {
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
225 struct seq_range *range, *new_range;
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
226 unsigned int i, count;
15645
970dc6b0760b lib-index: Added asserts.
Timo Sirainen <tss@iki.fi>
parents: 14678
diff changeset
227 uint32_t uid1, uid2, prev_uid = 0;
9252
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
228
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
229 if (!array_is_created(array))
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
230 return;
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 count = array_count(array);
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
233 for (i = 0; i < count; i++) {
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
234 range = array_idx_modifiable(array, i);
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
235
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
236 uid1 = mail_index_transaction_get_uid(t, range->seq1);
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
237 uid2 = mail_index_transaction_get_uid(t, range->seq2);
15645
970dc6b0760b lib-index: Added asserts.
Timo Sirainen <tss@iki.fi>
parents: 14678
diff changeset
238 i_assert(uid1 > prev_uid);
9252
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
239 if (uid2 - uid1 == range->seq2 - range->seq1) {
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
240 /* simple conversion */
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
241 range->seq1 = uid1;
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
242 range->seq2 = uid2;
15645
970dc6b0760b lib-index: Added asserts.
Timo Sirainen <tss@iki.fi>
parents: 14678
diff changeset
243 prev_uid = uid2;
9252
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
244 } else {
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
245 /* remove expunged UIDs */
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
246 new_range = array_insert_space(array, i);
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
247 range = array_idx_modifiable(array, i + 1);
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
248 count++;
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
249
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
250 memcpy(new_range, range, array->arr.element_size);
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
251 new_range->seq1 = uid1;
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
252 new_range->seq2 = get_nonexpunged_uid2(t, uid1,
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
253 range->seq1);
15645
970dc6b0760b lib-index: Added asserts.
Timo Sirainen <tss@iki.fi>
parents: 14678
diff changeset
254 i_assert(new_range->seq2 < uid2);
9252
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
255
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
256 /* continue the range without the inserted seqs */
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
257 range->seq1 += new_range->seq2 - new_range->seq1 + 1;
15645
970dc6b0760b lib-index: Added asserts.
Timo Sirainen <tss@iki.fi>
parents: 14678
diff changeset
258 prev_uid = new_range->seq2;
9252
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 }
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
262
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
263 static void keyword_updates_convert_to_uids(struct mail_index_transaction *t)
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
264 {
10000
c610321584ca Use array_foreach*() in some useful places.
Timo Sirainen <tss@iki.fi>
parents: 9725
diff changeset
265 struct mail_index_transaction_keyword_update *update;
9252
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 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
268 return;
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
269
10000
c610321584ca Use array_foreach*() in some useful places.
Timo Sirainen <tss@iki.fi>
parents: 9725
diff changeset
270 array_foreach_modifiable(&t->keyword_updates, update) {
21146
52a7790352e8 lib-index: Added mail_index_transaction_get_highest_modseq()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21145
diff changeset
271 mail_index_transaction_seq_range_to_uid(t, &update->add_seq);
52a7790352e8 lib-index: Added mail_index_transaction_get_highest_modseq()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21145
diff changeset
272 mail_index_transaction_seq_range_to_uid(t, &update->remove_seq);
9252
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
273 }
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
274 }
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
275
9624
2558ba736207 Keep track of expunged messages' GUIDs and expose them via mailbox_get_expunges().
Timo Sirainen <tss@iki.fi>
parents: 9622
diff changeset
276 static void expunges_convert_to_uids(struct mail_index_transaction *t)
2558ba736207 Keep track of expunged messages' GUIDs and expose them via mailbox_get_expunges().
Timo Sirainen <tss@iki.fi>
parents: 9622
diff changeset
277 {
2558ba736207 Keep track of expunged messages' GUIDs and expose them via mailbox_get_expunges().
Timo Sirainen <tss@iki.fi>
parents: 9622
diff changeset
278 struct mail_transaction_expunge_guid *expunges;
2558ba736207 Keep track of expunged messages' GUIDs and expose them via mailbox_get_expunges().
Timo Sirainen <tss@iki.fi>
parents: 9622
diff changeset
279 unsigned int src, dest, count;
2558ba736207 Keep track of expunged messages' GUIDs and expose them via mailbox_get_expunges().
Timo Sirainen <tss@iki.fi>
parents: 9622
diff changeset
280
2558ba736207 Keep track of expunged messages' GUIDs and expose them via mailbox_get_expunges().
Timo Sirainen <tss@iki.fi>
parents: 9622
diff changeset
281 if (!array_is_created(&t->expunges))
2558ba736207 Keep track of expunged messages' GUIDs and expose them via mailbox_get_expunges().
Timo Sirainen <tss@iki.fi>
parents: 9622
diff changeset
282 return;
2558ba736207 Keep track of expunged messages' GUIDs and expose them via mailbox_get_expunges().
Timo Sirainen <tss@iki.fi>
parents: 9622
diff changeset
283
2558ba736207 Keep track of expunged messages' GUIDs and expose them via mailbox_get_expunges().
Timo Sirainen <tss@iki.fi>
parents: 9622
diff changeset
284 mail_index_transaction_sort_expunges(t);
2558ba736207 Keep track of expunged messages' GUIDs and expose them via mailbox_get_expunges().
Timo Sirainen <tss@iki.fi>
parents: 9622
diff changeset
285
2558ba736207 Keep track of expunged messages' GUIDs and expose them via mailbox_get_expunges().
Timo Sirainen <tss@iki.fi>
parents: 9622
diff changeset
286 expunges = array_get_modifiable(&t->expunges, &count);
2558ba736207 Keep track of expunged messages' GUIDs and expose them via mailbox_get_expunges().
Timo Sirainen <tss@iki.fi>
parents: 9622
diff changeset
287 if (count == 0)
2558ba736207 Keep track of expunged messages' GUIDs and expose them via mailbox_get_expunges().
Timo Sirainen <tss@iki.fi>
parents: 9622
diff changeset
288 return;
2558ba736207 Keep track of expunged messages' GUIDs and expose them via mailbox_get_expunges().
Timo Sirainen <tss@iki.fi>
parents: 9622
diff changeset
289
2558ba736207 Keep track of expunged messages' GUIDs and expose them via mailbox_get_expunges().
Timo Sirainen <tss@iki.fi>
parents: 9622
diff changeset
290 /* convert uids and drop duplicates */
2558ba736207 Keep track of expunged messages' GUIDs and expose them via mailbox_get_expunges().
Timo Sirainen <tss@iki.fi>
parents: 9622
diff changeset
291 expunges[0].uid = mail_index_transaction_get_uid(t, expunges[0].uid);
2558ba736207 Keep track of expunged messages' GUIDs and expose them via mailbox_get_expunges().
Timo Sirainen <tss@iki.fi>
parents: 9622
diff changeset
292 for (src = dest = 1; src < count; src++) {
2558ba736207 Keep track of expunged messages' GUIDs and expose them via mailbox_get_expunges().
Timo Sirainen <tss@iki.fi>
parents: 9622
diff changeset
293 expunges[dest].uid =
2558ba736207 Keep track of expunged messages' GUIDs and expose them via mailbox_get_expunges().
Timo Sirainen <tss@iki.fi>
parents: 9622
diff changeset
294 mail_index_transaction_get_uid(t, expunges[src].uid);
9625
e8b9f78d2b3c mail index transaction: Dropping duplicate expunges changed expunges' GUIDs.
Timo Sirainen <tss@iki.fi>
parents: 9624
diff changeset
295 if (expunges[dest-1].uid != expunges[dest].uid) {
16447
74875424373d lib-index: Avoid memcpy()ing data over itself.
Timo Sirainen <tss@iki.fi>
parents: 15715
diff changeset
296 if (dest != src) {
74875424373d lib-index: Avoid memcpy()ing data over itself.
Timo Sirainen <tss@iki.fi>
parents: 15715
diff changeset
297 memcpy(expunges[dest].guid_128, expunges[src].guid_128,
74875424373d lib-index: Avoid memcpy()ing data over itself.
Timo Sirainen <tss@iki.fi>
parents: 15715
diff changeset
298 sizeof(expunges[dest].guid_128));
74875424373d lib-index: Avoid memcpy()ing data over itself.
Timo Sirainen <tss@iki.fi>
parents: 15715
diff changeset
299 }
9624
2558ba736207 Keep track of expunged messages' GUIDs and expose them via mailbox_get_expunges().
Timo Sirainen <tss@iki.fi>
parents: 9622
diff changeset
300 dest++;
9625
e8b9f78d2b3c mail index transaction: Dropping duplicate expunges changed expunges' GUIDs.
Timo Sirainen <tss@iki.fi>
parents: 9624
diff changeset
301 }
9624
2558ba736207 Keep track of expunged messages' GUIDs and expose them via mailbox_get_expunges().
Timo Sirainen <tss@iki.fi>
parents: 9622
diff changeset
302 }
2558ba736207 Keep track of expunged messages' GUIDs and expose them via mailbox_get_expunges().
Timo Sirainen <tss@iki.fi>
parents: 9622
diff changeset
303 array_delete(&t->expunges, dest, count-dest);
2558ba736207 Keep track of expunged messages' GUIDs and expose them via mailbox_get_expunges().
Timo Sirainen <tss@iki.fi>
parents: 9622
diff changeset
304 }
2558ba736207 Keep track of expunged messages' GUIDs and expose them via mailbox_get_expunges().
Timo Sirainen <tss@iki.fi>
parents: 9622
diff changeset
305
9252
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
306 static void
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
307 mail_index_transaction_convert_to_uids(struct mail_index_transaction *t)
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
308 {
10000
c610321584ca Use array_foreach*() in some useful places.
Timo Sirainen <tss@iki.fi>
parents: 9725
diff changeset
309 ARRAY_TYPE(seq_array) *update;
9252
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
310
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
311 if (array_is_created(&t->ext_rec_updates)) {
10000
c610321584ca Use array_foreach*() in some useful places.
Timo Sirainen <tss@iki.fi>
parents: 9725
diff changeset
312 array_foreach_modifiable(&t->ext_rec_updates, update)
c610321584ca Use array_foreach*() in some useful places.
Timo Sirainen <tss@iki.fi>
parents: 9725
diff changeset
313 mail_index_convert_to_uids(t, update);
9252
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
314 }
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
315 if (array_is_created(&t->ext_rec_atomics)) {
10000
c610321584ca Use array_foreach*() in some useful places.
Timo Sirainen <tss@iki.fi>
parents: 9725
diff changeset
316 array_foreach_modifiable(&t->ext_rec_atomics, update)
c610321584ca Use array_foreach*() in some useful places.
Timo Sirainen <tss@iki.fi>
parents: 9725
diff changeset
317 mail_index_convert_to_uids(t, update);
9252
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
318 }
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
319
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
320 keyword_updates_convert_to_uids(t);
9624
2558ba736207 Keep track of expunged messages' GUIDs and expose them via mailbox_get_expunges().
Timo Sirainen <tss@iki.fi>
parents: 9622
diff changeset
321 expunges_convert_to_uids(t);
9691
b09d9350a2d9 Added ability to specify message's minimum modseq value.
Timo Sirainen <tss@iki.fi>
parents: 9681
diff changeset
322 mail_index_convert_to_uids(t, (void *)&t->modseq_updates);
21146
52a7790352e8 lib-index: Added mail_index_transaction_get_highest_modseq()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21145
diff changeset
323 mail_index_transaction_seq_range_to_uid(t, (void *)&t->updates);
9252
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
21145
e39b12e1b321 lib-index: Added internal mail_index_transaction_finish_so_far()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20155
diff changeset
326 void mail_index_transaction_finish_so_far(struct mail_index_transaction *t)
e39b12e1b321 lib-index: Added internal mail_index_transaction_finish_so_far()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20155
diff changeset
327 {
e39b12e1b321 lib-index: Added internal mail_index_transaction_finish_so_far()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20155
diff changeset
328 if (array_is_created(&t->appends))
e39b12e1b321 lib-index: Added internal mail_index_transaction_finish_so_far()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20155
diff changeset
329 mail_index_transaction_sort_appends(t);
e39b12e1b321 lib-index: Added internal mail_index_transaction_finish_so_far()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20155
diff changeset
330 mail_index_transaction_finish_flag_updates(t);
e39b12e1b321 lib-index: Added internal mail_index_transaction_finish_so_far()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20155
diff changeset
331 if (t->max_modseq != 0)
e39b12e1b321 lib-index: Added internal mail_index_transaction_finish_so_far()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20155
diff changeset
332 mail_index_transaction_check_conflicts(t);
e39b12e1b321 lib-index: Added internal mail_index_transaction_finish_so_far()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20155
diff changeset
333 }
e39b12e1b321 lib-index: Added internal mail_index_transaction_finish_so_far()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20155
diff changeset
334
12251
ab2222fd3f5d lib-index: Always update index map while committing a transaction.
Timo Sirainen <tss@iki.fi>
parents: 11741
diff changeset
335 void mail_index_transaction_finish(struct mail_index_transaction *t)
9252
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
336 {
21145
e39b12e1b321 lib-index: Added internal mail_index_transaction_finish_so_far()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20155
diff changeset
337 mail_index_transaction_finish_so_far(t);
e39b12e1b321 lib-index: Added internal mail_index_transaction_finish_so_far()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20155
diff changeset
338
e39b12e1b321 lib-index: Added internal mail_index_transaction_finish_so_far()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 20155
diff changeset
339 if (array_is_created(&t->appends))
21570
d1860907acf9 lib-index: Add day_stamp parameter to mail_index_update_day_headers()
Timo Sirainen <timo.sirainen@dovecot.fi>
parents: 21390
diff changeset
340 mail_index_update_day_headers(t, ioloop_time);
9252
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
341 if (array_is_created(&t->ext_reset_atomic))
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
342 transaction_update_atomic_reset_ids(t);
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
343 /* finally convert all sequences to UIDs before we write them,
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
344 but after we've checked and removed conflicts */
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
345 mail_index_transaction_convert_to_uids(t);
9725
1411f157ffdd lib-index: Added mail_index_update_highest_modseq().
Timo Sirainen <tss@iki.fi>
parents: 9691
diff changeset
346
1411f157ffdd lib-index: Added mail_index_update_highest_modseq().
Timo Sirainen <tss@iki.fi>
parents: 9691
diff changeset
347 /* and kind of ugly way to update highest modseq */
1411f157ffdd lib-index: Added mail_index_update_highest_modseq().
Timo Sirainen <tss@iki.fi>
parents: 9691
diff changeset
348 if (t->min_highest_modseq != 0)
1411f157ffdd lib-index: Added mail_index_update_highest_modseq().
Timo Sirainen <tss@iki.fi>
parents: 9691
diff changeset
349 mail_index_update_modseq(t, 0, t->min_highest_modseq);
9252
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
350 }