mail-index-transaction-sort-appends.c revision bcb4e51a409d94ae670de96afb8483a4f7855294
bcb4e51a409d94ae670de96afb8483a4f7855294Stephan Bosch/* Copyright (c) 2003-2018 Dovecot authors, see the included COPYING file */
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainenstatic int uid_map_cmp(const void *p1, const void *p2)
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainenmail_index_transaction_sort_appends_ext(ARRAY_TYPE(seq_array_array) *updates,
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen unsigned int i, j, count;
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen ext_rec_arrays = array_get_modifiable(updates, &count);
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen for (j = 0; j < count; j++) {
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen for (i = 0; i < ext_count; i++) {
e34d170f8f0e084bd94bfbc1a7085ece67e508dfTimo Sirainen (void)mail_index_seq_array_add(&new_array, seq, ext_rec+1,
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainensort_appends_seq_range(ARRAY_TYPE(seq_range) *array, uint32_t first_new_seq,
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen unsigned int i, count;
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen for (i = 0; i < count; i++) {
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen /* nothing to do */
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen array_append(&old_seqs, &range[i], count - i);
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen range = array_get_modifiable(&old_seqs, &count);
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen for (i = 0; i < count; i++) {
86bde2c1838d1ce967fa2b394bb952004a4adcb7Timo Sirainen seq_range_array_add(array, old_to_newseq_map[idx]);
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainenmail_index_transaction_sort_appends_keywords(struct mail_index_transaction *t,
e20e638805c4bd54e039891a3e92760b1dfa189aTimo Sirainen struct mail_index_transaction_keyword_update *update;
250105a1440167ef000323cdb2721cd2a3688e1eTimo Sirainen array_foreach_modifiable(&t->keyword_updates, update) {
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainenvoid mail_index_transaction_sort_appends(struct mail_index_transaction *t)
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen unsigned int i, count;
f09d0344609e8c410a18685fa20ee3998646c2d9Timo Sirainen recs = array_get_modifiable(&t->appends, &count);
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen /* first make a copy of the UIDs and map them to sequences */
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen for (i = 0; i < count; i++) {
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen /* now sort the UID map */
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen qsort(new_uid_map, count, sizeof(*new_uid_map), uid_map_cmp);
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen /* sort mail records */
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen sorted_recs = i_new(struct mail_index_record, count);
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen if (sorted_recs[i].uid == sorted_recs[i-1].uid)
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen i_panic("Duplicate UIDs added in transaction");
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen buffer_write(t->appends.arr.buffer, 0, sorted_recs,
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen for (i = 0; i < count; i++)
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen old_to_newseq_map[new_uid_map[i].idx] = i + t->first_new_seq;
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen mail_index_transaction_sort_appends_ext(&t->ext_rec_updates,
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen mail_index_transaction_sort_appends_ext(&t->ext_rec_atomics,