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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
21390
2e2563132d5f Updated copyright notices to include the year 2017.
Stephan Bosch <stephan.bosch@dovecot.fi>
parents: 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 }