Mercurial > dovecot > core-2.2
annotate src/lib-index/mail-index-transaction-sort-appends.c @ 22576:707ae9de3812
lib: istream-multiplex - Minor code cleanup
Avoid propagating the error twice, and avoid any confusion about what "got"
actually contains.
author | Timo Sirainen <timo.sirainen@dovecot.fi> |
---|---|
date | Thu, 05 Oct 2017 20:24:11 +0300 |
parents | 2e2563132d5f |
children | cb108f786fb4 |
rev | line source |
---|---|
21390
2e2563132d5f
Updated copyright notices to include the year 2017.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents:
21144
diff
changeset
|
1 /* Copyright (c) 2003-2017 Dovecot authors, see the included COPYING file */ |
9252
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
2 |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
3 #include "lib.h" |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
4 #include "array.h" |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
5 #include "seq-range-array.h" |
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-transaction-private.h" |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
8 |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
9 |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
10 struct uid_map { |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
11 uint32_t idx; |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
12 uint32_t uid; |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
13 }; |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
14 |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
15 static int uid_map_cmp(const void *p1, const void *p2) |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
16 { |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
17 const struct uid_map *m1 = p1, *m2 = p2; |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
18 |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
19 return m1->uid < m2->uid ? -1 : |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
20 (m1->uid > m2->uid ? 1 : 0); |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
21 } |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
22 |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
23 static void |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
24 mail_index_transaction_sort_appends_ext(ARRAY_TYPE(seq_array_array) *updates, |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
25 uint32_t first_new_seq, |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
26 const uint32_t *old_to_newseq_map) |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
27 { |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
28 ARRAY_TYPE(seq_array) *ext_rec_arrays; |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
29 ARRAY_TYPE(seq_array) *old_array; |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
30 ARRAY_TYPE(seq_array) new_array; |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
31 unsigned int ext_count; |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
32 const uint32_t *ext_rec; |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
33 uint32_t seq; |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
34 unsigned int i, j, count; |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
35 |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
36 if (!array_is_created(updates)) |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
37 return; |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
38 |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
39 ext_rec_arrays = array_get_modifiable(updates, &count); |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
40 for (j = 0; j < count; j++) { |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
41 old_array = &ext_rec_arrays[j]; |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
42 if (!array_is_created(old_array)) |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
43 continue; |
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 ext_count = array_count(old_array); |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
46 array_create(&new_array, default_pool, |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
47 old_array->arr.element_size, ext_count); |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
48 for (i = 0; i < ext_count; i++) { |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
49 ext_rec = array_idx(old_array, i); |
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 seq = *ext_rec < first_new_seq ? *ext_rec : |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
52 old_to_newseq_map[*ext_rec - first_new_seq]; |
14682
d0d7b810646b
Make sure we check all the functions' return values. Minor API changes to simplify this.
Timo Sirainen <tss@iki.fi>
parents:
14676
diff
changeset
|
53 (void)mail_index_seq_array_add(&new_array, seq, ext_rec+1, |
d0d7b810646b
Make sure we check all the functions' return values. Minor API changes to simplify this.
Timo Sirainen <tss@iki.fi>
parents:
14676
diff
changeset
|
54 old_array->arr.element_size - |
d0d7b810646b
Make sure we check all the functions' return values. Minor API changes to simplify this.
Timo Sirainen <tss@iki.fi>
parents:
14676
diff
changeset
|
55 sizeof(*ext_rec), NULL); |
9252
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
56 } |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
57 array_free(old_array); |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
58 ext_rec_arrays[j] = new_array; |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
59 } |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
60 } |
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 static void |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
63 sort_appends_seq_range(ARRAY_TYPE(seq_range) *array, uint32_t first_new_seq, |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
64 const uint32_t *old_to_newseq_map) |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
65 { |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
66 struct seq_range *range, temp_range; |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
67 ARRAY_TYPE(seq_range) old_seqs; |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
68 uint32_t idx, idx1, idx2; |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
69 unsigned int i, count; |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
70 |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
71 range = array_get_modifiable(array, &count); |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
72 for (i = 0; i < count; i++) { |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
73 if (range[i].seq2 >= first_new_seq) |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
74 break; |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
75 } |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
76 if (i == count) { |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
77 /* nothing to do */ |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
78 return; |
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 i_array_init(&old_seqs, count - i); |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
82 if (range[i].seq1 < first_new_seq) { |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
83 temp_range.seq1 = first_new_seq; |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
84 temp_range.seq2 = range[i].seq2; |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
85 array_append(&old_seqs, &temp_range, 1); |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
86 range[i].seq2 = first_new_seq - 1; |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
87 i++; |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
88 } |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
89 array_append(&old_seqs, &range[i], count - i); |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
90 array_delete(array, i, count - i); |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
91 |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
92 range = array_get_modifiable(&old_seqs, &count); |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
93 for (i = 0; i < count; i++) { |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
94 idx1 = range[i].seq1 - first_new_seq; |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
95 idx2 = range[i].seq2 - first_new_seq; |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
96 for (idx = idx1; idx <= idx2; idx++) |
14676
69ba6977bed8
seq_range_array_add() API changed. Added other functions to provide the less common use cases.
Timo Sirainen <tss@iki.fi>
parents:
14580
diff
changeset
|
97 seq_range_array_add(array, old_to_newseq_map[idx]); |
9252
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
98 } |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
99 array_free(&old_seqs); |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
100 } |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
101 |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
102 static void |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
103 mail_index_transaction_sort_appends_keywords(struct mail_index_transaction *t, |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
104 const uint32_t *old_to_newseq_map) |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
105 { |
10000
c610321584ca
Use array_foreach*() in some useful places.
Timo Sirainen <tss@iki.fi>
parents:
9252
diff
changeset
|
106 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
|
107 |
14580
2e7d718609fd
Don't write "keyword reset" records to transaction log anymore.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
108 if (!array_is_created(&t->keyword_updates)) |
2e7d718609fd
Don't write "keyword reset" records to transaction log anymore.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
109 return; |
2e7d718609fd
Don't write "keyword reset" records to transaction log anymore.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
110 |
2e7d718609fd
Don't write "keyword reset" records to transaction log anymore.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
111 array_foreach_modifiable(&t->keyword_updates, update) { |
2e7d718609fd
Don't write "keyword reset" records to transaction log anymore.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
112 if (array_is_created(&update->add_seq)) { |
2e7d718609fd
Don't write "keyword reset" records to transaction log anymore.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
113 sort_appends_seq_range(&update->add_seq, |
2e7d718609fd
Don't write "keyword reset" records to transaction log anymore.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
114 t->first_new_seq, |
2e7d718609fd
Don't write "keyword reset" records to transaction log anymore.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
115 old_to_newseq_map); |
9252
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
116 } |
14580
2e7d718609fd
Don't write "keyword reset" records to transaction log anymore.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
117 if (array_is_created(&update->remove_seq)) { |
2e7d718609fd
Don't write "keyword reset" records to transaction log anymore.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
118 sort_appends_seq_range(&update->remove_seq, |
2e7d718609fd
Don't write "keyword reset" records to transaction log anymore.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
119 t->first_new_seq, |
2e7d718609fd
Don't write "keyword reset" records to transaction log anymore.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
120 old_to_newseq_map); |
2e7d718609fd
Don't write "keyword reset" records to transaction log anymore.
Timo Sirainen <tss@iki.fi>
parents:
14133
diff
changeset
|
121 } |
9252
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
122 } |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
123 } |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
124 |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
125 void mail_index_transaction_sort_appends(struct mail_index_transaction *t) |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
126 { |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
127 struct mail_index_record *recs, *sorted_recs; |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
128 struct uid_map *new_uid_map; |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
129 uint32_t *old_to_newseq_map; |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
130 unsigned int i, count; |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
131 |
15663
df2e46c38c92
lib-index: Fixed sorting appended messages when some were assigned new UIDs.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
132 if (!array_is_created(&t->appends)) |
9252
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
133 return; |
21144
c430a59fe897
lib-index: Assert if mail_index_transaction_sort_appends() sees any uid==0
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
134 recs = array_get_modifiable(&t->appends, &count); |
c430a59fe897
lib-index: Assert if mail_index_transaction_sort_appends() sees any uid==0
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
135 i_assert(count > 0); |
c430a59fe897
lib-index: Assert if mail_index_transaction_sort_appends() sees any uid==0
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
136 |
15663
df2e46c38c92
lib-index: Fixed sorting appended messages when some were assigned new UIDs.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
137 if (!t->appends_nonsorted) { |
21144
c430a59fe897
lib-index: Assert if mail_index_transaction_sort_appends() sees any uid==0
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
138 i_assert(recs[0].uid != 0); |
15663
df2e46c38c92
lib-index: Fixed sorting appended messages when some were assigned new UIDs.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
139 #ifdef DEBUG |
df2e46c38c92
lib-index: Fixed sorting appended messages when some were assigned new UIDs.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
140 for (i = 1; i < count; i++) |
df2e46c38c92
lib-index: Fixed sorting appended messages when some were assigned new UIDs.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
141 i_assert(recs[i-1].uid < recs[i].uid); |
df2e46c38c92
lib-index: Fixed sorting appended messages when some were assigned new UIDs.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
142 #endif |
df2e46c38c92
lib-index: Fixed sorting appended messages when some were assigned new UIDs.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
143 return; |
df2e46c38c92
lib-index: Fixed sorting appended messages when some were assigned new UIDs.
Timo Sirainen <tss@iki.fi>
parents:
14682
diff
changeset
|
144 } |
9252
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
145 |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
146 /* first make a copy of the UIDs and map them to sequences */ |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
147 new_uid_map = i_new(struct uid_map, count); |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
148 for (i = 0; i < count; i++) { |
21144
c430a59fe897
lib-index: Assert if mail_index_transaction_sort_appends() sees any uid==0
Timo Sirainen <timo.sirainen@dovecot.fi>
parents:
19552
diff
changeset
|
149 i_assert(recs[i].uid != 0); |
9252
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
150 new_uid_map[i].idx = i; |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
151 new_uid_map[i].uid = recs[i].uid; |
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 |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
154 /* now sort the UID map */ |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
155 qsort(new_uid_map, count, sizeof(*new_uid_map), uid_map_cmp); |
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 /* sort mail records */ |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
158 sorted_recs = i_new(struct mail_index_record, count); |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
159 sorted_recs[0] = recs[new_uid_map[0].idx]; |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
160 for (i = 1; i < count; i++) { |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
161 sorted_recs[i] = recs[new_uid_map[i].idx]; |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
162 if (sorted_recs[i].uid == sorted_recs[i-1].uid) |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
163 i_panic("Duplicate UIDs added in transaction"); |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
164 } |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
165 buffer_write(t->appends.arr.buffer, 0, sorted_recs, |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
166 sizeof(*sorted_recs) * count); |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
167 i_free(sorted_recs); |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
168 |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
169 old_to_newseq_map = i_new(uint32_t, count); |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
170 for (i = 0; i < count; i++) |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
171 old_to_newseq_map[new_uid_map[i].idx] = i + t->first_new_seq; |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
172 i_free(new_uid_map); |
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 mail_index_transaction_sort_appends_ext(&t->ext_rec_updates, |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
175 t->first_new_seq, |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
176 old_to_newseq_map); |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
177 mail_index_transaction_sort_appends_ext(&t->ext_rec_atomics, |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
178 t->first_new_seq, |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
179 old_to_newseq_map); |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
180 mail_index_transaction_sort_appends_keywords(t, old_to_newseq_map); |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
181 i_free(old_to_newseq_map); |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
182 |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
183 t->appends_nonsorted = FALSE; |
937dca181d77
Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff
changeset
|
184 } |