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