mail-index-transaction-sort-appends.c revision 5f5870385cff47efd2f58e7892f251cf13761528
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher/* Copyright (c) 2003-2012 Dovecot authors, see the included COPYING file */
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher#include "mail-index-transaction-private.h"
84ae5edab16ad6be5e3be956cb6fa031c1428eb5Stephen Gallagherstatic int uid_map_cmp(const void *p1, const void *p2)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallaghermail_index_transaction_sort_appends_ext(ARRAY_TYPE(seq_array_array) *updates,
1183d29d87c5c7439cf2364b7d7324d4a13b6e35Stephen Gallagher unsigned int i, j, count;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher ext_rec_arrays = array_get_modifiable(updates, &count);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher for (j = 0; j < count; j++) {
c89589fa349f38214c9cb8d9389c0fd557e5dca2Simo Sorce for (i = 0; i < ext_count; i++) {
86b61156743b7ebdc049450a6f88452890fd9a61Jakub Hrozek mail_index_seq_array_add(&new_array, seq, ext_rec+1,
86b61156743b7ebdc049450a6f88452890fd9a61Jakub Hrozeksort_appends_seq_range(ARRAY_TYPE(seq_range) *array, uint32_t first_new_seq,
48130eef6c5c64a07094b9e8582ba358b2048f24Jakub Hrozek unsigned int i, count;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher range = array_get_modifiable(array, &count);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher for (i = 0; i < count; i++) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher /* nothing to do */
327127bb7fcc07f882209f029e14026de1b23c94Maxim for (i = 0; i < count; i++) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher seq_range_array_add(array, 0, old_to_newseq_map[idx]);
bc9235cfb80bd64a3bfa959e8d26d5ad1be0bdf4Jakub Hrozekmail_index_transaction_sort_appends_keywords(struct mail_index_transaction *t,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher struct mail_index_transaction_keyword_update *update;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (array_is_created(&t->keyword_updates)) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher array_foreach_modifiable(&t->keyword_updates, update) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (array_is_created(&update->remove_seq)) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher sort_appends_seq_range(&update->remove_seq,
e07a94a66985b674c5df11ca466792902164c4e2George McCollister if (array_is_created(&t->keyword_resets)) {
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher sort_appends_seq_range(&t->keyword_resets, t->first_new_seq,
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallaghervoid mail_index_transaction_sort_appends(struct mail_index_transaction *t)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher struct mail_index_record *recs, *sorted_recs;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher unsigned int i, count;
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher if (!t->appends_nonsorted || !array_is_created(&t->appends))
a5077712fc8c24e8cad08207b7b5a6603bde6a7cJakub Hrozek /* first make a copy of the UIDs and map them to sequences */
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher recs = array_get_modifiable(&t->appends, &count);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher new_uid_map = i_new(struct uid_map, count);
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher for (i = 0; i < count; i++) {
2a5790216f57e9bdfb2930d52860bb5300366536Jakub Hrozek /* now sort the UID map */
b9e5bd09a5ff7009537a18914dbebcf10498f592Sumit Bose qsort(new_uid_map, count, sizeof(*new_uid_map), uid_map_cmp);
a679f0167b646cffdae86546ed77e105576991b0Pavel Březina /* sort mail records */
b32159300fea63222d8dd9200ed634087704ea74Stephen Gallagher sorted_recs = i_new(struct mail_index_record, count);
b32159300fea63222d8dd9200ed634087704ea74Stephen Gallagher sorted_recs[0] = recs[new_uid_map[0].idx];
b32159300fea63222d8dd9200ed634087704ea74Stephen Gallagher sorted_recs[i] = recs[new_uid_map[i].idx];
b32159300fea63222d8dd9200ed634087704ea74Stephen Gallagher if (sorted_recs[i].uid == sorted_recs[i-1].uid)
b32159300fea63222d8dd9200ed634087704ea74Stephen Gallagher i_panic("Duplicate UIDs added in transaction");
b32159300fea63222d8dd9200ed634087704ea74Stephen Gallagher buffer_write(t->appends.arr.buffer, 0, sorted_recs,
b32159300fea63222d8dd9200ed634087704ea74Stephen Gallagher old_to_newseq_map = i_new(uint32_t, count);
b32159300fea63222d8dd9200ed634087704ea74Stephen Gallagher for (i = 0; i < count; i++)
551aa6c36797ed720487f5974dcadabf19e6ff9fStephen Gallagher old_to_newseq_map[new_uid_map[i].idx] = i + t->first_new_seq;
574a1c20f114851071ae74112b34488c3d1aeeb3Ondrej Kos mail_index_transaction_sort_appends_ext(&t->ext_rec_updates,
574a1c20f114851071ae74112b34488c3d1aeeb3Ondrej Kos mail_index_transaction_sort_appends_ext(&t->ext_rec_atomics,