annotate src/lib-index/mail-index-transaction-sort-appends.c @ 14682:d0d7b810646b

Make sure we check all the functions' return values. Minor API changes to simplify this. Checked using a patched clang that adds attribute(warn_unused_result) to all functions. This commit fixes several error handling mistakes.
author Timo Sirainen <tss@iki.fi>
date Mon, 25 Jun 2012 01:14:03 +0300
parents 69ba6977bed8
children df2e46c38c92
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
14133
ba770cba5598 Updated copyright notices to include year 2012.
Timo Sirainen <tss@iki.fi>
parents: 12782
diff changeset
1 /* Copyright (c) 2003-2012 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 #include <stdlib.h>
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
10
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
11 struct uid_map {
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
12 uint32_t idx;
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
13 uint32_t uid;
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
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
16 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
17 {
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
18 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
19
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
20 return m1->uid < m2->uid ? -1 :
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
21 (m1->uid > m2->uid ? 1 : 0);
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
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
24 static void
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
25 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
26 uint32_t first_new_seq,
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
27 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
28 {
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
29 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
30 ARRAY_TYPE(seq_array) *old_array;
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
31 ARRAY_TYPE(seq_array) new_array;
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
32 unsigned int ext_count;
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
33 const uint32_t *ext_rec;
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
34 uint32_t seq;
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
35 unsigned int i, j, count;
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
36
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
37 if (!array_is_created(updates))
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
38 return;
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
39
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
40 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
41 for (j = 0; j < count; j++) {
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
42 old_array = &ext_rec_arrays[j];
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
43 if (!array_is_created(old_array))
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
44 continue;
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
45
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
46 ext_count = array_count(old_array);
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
47 array_create(&new_array, default_pool,
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
48 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
49 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
50 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
51
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
52 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
53 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
54 (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
55 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
56 sizeof(*ext_rec), NULL);
9252
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
57 }
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
58 array_free(old_array);
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
59 ext_rec_arrays[j] = new_array;
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
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
63 static void
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
64 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
65 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
66 {
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
67 struct seq_range *range, temp_range;
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
68 ARRAY_TYPE(seq_range) old_seqs;
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
69 uint32_t idx, idx1, idx2;
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
70 unsigned int i, count;
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
71
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
72 range = array_get_modifiable(array, &count);
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
73 for (i = 0; i < count; i++) {
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
74 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
75 break;
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
76 }
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
77 if (i == count) {
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
78 /* nothing to do */
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
79 return;
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
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
82 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
83 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
84 temp_range.seq1 = first_new_seq;
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
85 temp_range.seq2 = range[i].seq2;
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
86 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
87 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
88 i++;
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
89 }
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
90 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
91 array_delete(array, i, count - i);
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
92
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
93 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
94 for (i = 0; i < count; i++) {
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
95 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
96 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
97 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
98 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
99 }
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
100 array_free(&old_seqs);
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
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
103 static void
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
104 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
105 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
106 {
10000
c610321584ca Use array_foreach*() in some useful places.
Timo Sirainen <tss@iki.fi>
parents: 9252
diff changeset
107 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
108
14580
2e7d718609fd Don't write "keyword reset" records to transaction log anymore.
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
109 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
110 return;
2e7d718609fd Don't write "keyword reset" records to transaction log anymore.
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
111
2e7d718609fd Don't write "keyword reset" records to transaction log anymore.
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
112 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
113 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
114 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
115 t->first_new_seq,
2e7d718609fd Don't write "keyword reset" records to transaction log anymore.
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
116 old_to_newseq_map);
9252
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
117 }
14580
2e7d718609fd Don't write "keyword reset" records to transaction log anymore.
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
118 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
119 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
120 t->first_new_seq,
2e7d718609fd Don't write "keyword reset" records to transaction log anymore.
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
121 old_to_newseq_map);
2e7d718609fd Don't write "keyword reset" records to transaction log anymore.
Timo Sirainen <tss@iki.fi>
parents: 14133
diff changeset
122 }
9252
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
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
126 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
127 {
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
128 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
129 struct uid_map *new_uid_map;
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
130 uint32_t *old_to_newseq_map;
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
131 unsigned int i, count;
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
132
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
133 if (!t->appends_nonsorted || !array_is_created(&t->appends))
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
134 return;
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
135
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
136 /* 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
137 recs = array_get_modifiable(&t->appends, &count);
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
138 i_assert(count > 0);
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
139
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
140 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
141 for (i = 0; i < count; i++) {
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
142 new_uid_map[i].idx = i;
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
143 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
144 }
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 /* now sort the UID map */
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
147 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
148
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
149 /* sort mail records */
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
150 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
151 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
152 for (i = 1; i < count; i++) {
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
153 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
154 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
155 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
156 }
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
157 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
158 sizeof(*sorted_recs) * count);
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
159 i_free(sorted_recs);
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 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
162 for (i = 0; i < count; i++)
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
163 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
164 i_free(new_uid_map);
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
165
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
166 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
167 t->first_new_seq,
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
168 old_to_newseq_map);
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
169 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
170 t->first_new_seq,
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
171 old_to_newseq_map);
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
172 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
173 i_free(old_to_newseq_map);
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 t->appends_nonsorted = FALSE;
937dca181d77 Moved transaction commiting code to mail-index-transaction-*.c
Timo Sirainen <tss@iki.fi>
parents:
diff changeset
176 }