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