bcb4e51a409d94ae670de96afb8483a4f7855294Stephan Bosch/* Copyright (c) 2003-2018 Dovecot authors, see the included COPYING file */
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainenint mail_transaction_expunge_guid_cmp(const struct mail_transaction_expunge_guid *e1,
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen const struct mail_transaction_expunge_guid *e2)
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainenvoid mail_index_transaction_sort_expunges(struct mail_index_transaction *t)
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen array_sort(&t->expunges, mail_transaction_expunge_guid_cmp);
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainenext_reset_update_atomic(struct mail_index_transaction *t,
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen if (!mail_index_map_get_ext_idx(t->view->index->map, ext_id, &idx)) {
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen /* new extension */
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen map_ext = array_idx(&t->view->index->map->extensions, idx);
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen /* ignore this extension update */
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen array_idx_set(&t->ext_reset_ids, ext_id, &reset_id);
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen /* reseting existing data is optional */
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen reset = array_idx_modifiable(&t->ext_resets, ext_id);
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainentransaction_update_atomic_reset_ids(struct mail_index_transaction *t)
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen expected_reset_ids = array_get(&t->ext_reset_atomic, &count);
54b51a9c2705a19dfb1639647bc7e9378e37f881Timo Sirainenstatic unsigned int
54b51a9c2705a19dfb1639647bc7e9378e37f881Timo Sirainenmail_transaction_drop_range(struct mail_index_transaction *t,
19557f192d37cd54a1a090a8a26d9d47265e4413Aki Tuomi /* everything is kept */
54b51a9c2705a19dfb1639647bc7e9378e37f881Timo Sirainen /* add back all the updates we want to keep */
54b51a9c2705a19dfb1639647bc7e9378e37f881Timo Sirainen for (i = 0; i < keep_count; i++, update_idx++) {
54b51a9c2705a19dfb1639647bc7e9378e37f881Timo Sirainen array_insert(&t->updates, update_idx, &update, 1);
54b51a9c2705a19dfb1639647bc7e9378e37f881Timo Sirainenmail_index_transaction_finish_flag_updates(struct mail_index_transaction *t)
5da1aa5197a43d83f0fb3eeb83125c7cd73d1b62Timo Sirainen const struct mail_index_flag_update *updates, *u;
eab880d75fd73a80c7803289796d13e08e4b52cbTimo Sirainen if (!t->drop_unnecessary_flag_updates || !array_is_created(&t->updates))
54b51a9c2705a19dfb1639647bc7e9378e37f881Timo Sirainen for (i = 0; i < count; ) {
54b51a9c2705a19dfb1639647bc7e9378e37f881Timo Sirainen /* first get the list of changes to drop */
54b51a9c2705a19dfb1639647bc7e9378e37f881Timo Sirainen if ((rec->flags & u->add_flags) != u->add_flags ||
54b51a9c2705a19dfb1639647bc7e9378e37f881Timo Sirainen /* keep this change */
54b51a9c2705a19dfb1639647bc7e9378e37f881Timo Sirainen i = mail_transaction_drop_range(t, updates[i], i, &keeps);
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainenmail_index_transaction_check_conflicts(struct mail_index_transaction *t)
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen if (t->max_modseq == mail_index_modseq_get_highest(t->view)) {
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen /* no conflicts possible */
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen /* no flag updates */
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen for (seq = t->min_flagupdate_seq; seq <= t->max_flagupdate_seq; seq++) {
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen if (mail_index_modseq_lookup(t->view, seq) > t->max_modseq) {
02bb8313a711dfe50c7f01e8132e13ca93ecfb42Timo Sirainen ret1 = mail_index_cancel_flag_updates(t, seq);
02bb8313a711dfe50c7f01e8132e13ca93ecfb42Timo Sirainen ret2 = mail_index_cancel_keyword_updates(t, seq);
2738626e69754ba1278cb351c873f4187787fdfcTimo Sirainen seq_range_array_add_with_init(t->conflict_seqs,
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainenmail_index_transaction_get_uid(struct mail_index_transaction *t, uint32_t seq)
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen i_assert(seq <= t->view->map->hdr.messages_count);
1df526903ed039e8ff966a223c43b8d04eddf3c7Phil Carmody rec = MAIL_INDEX_REC_AT_SEQ(t->view->map, seq);
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainenmail_index_convert_to_uids(struct mail_index_transaction *t,
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen for (i = 0; i < count; i++) {
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen *seq = mail_index_transaction_get_uid(t, *seq);
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainenget_nonexpunged_uid2(struct mail_index_transaction *t,
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen while (mail_index_transaction_get_uid(t, seq1) == uid1 + 1) {
9e6d83a3ef6abb393eeebca423cfd0d8cb08d430Timo Sirainenvoid mail_index_transaction_seq_range_to_uid(struct mail_index_transaction *t,
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen for (i = 0; i < count; i++) {
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen uid1 = mail_index_transaction_get_uid(t, range->seq1);
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen uid2 = mail_index_transaction_get_uid(t, range->seq2);
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen if (uid2 - uid1 == range->seq2 - range->seq1) {
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen /* simple conversion */
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen /* remove expunged UIDs */
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen memcpy(new_range, range, array->arr.element_size);
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen new_range->seq2 = get_nonexpunged_uid2(t, uid1,
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen /* continue the range without the inserted seqs */
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen range->seq1 += new_range->seq2 - new_range->seq1 + 1;
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainenstatic void keyword_updates_convert_to_uids(struct mail_index_transaction *t)
e20e638805c4bd54e039891a3e92760b1dfa189aTimo Sirainen struct mail_index_transaction_keyword_update *update;
e20e638805c4bd54e039891a3e92760b1dfa189aTimo Sirainen array_foreach_modifiable(&t->keyword_updates, update) {
9e6d83a3ef6abb393eeebca423cfd0d8cb08d430Timo Sirainen mail_index_transaction_seq_range_to_uid(t, &update->add_seq);
9e6d83a3ef6abb393eeebca423cfd0d8cb08d430Timo Sirainen mail_index_transaction_seq_range_to_uid(t, &update->remove_seq);
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainenstatic void expunges_convert_to_uids(struct mail_index_transaction *t)
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen struct mail_transaction_expunge_guid *expunges;
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen expunges = array_get_modifiable(&t->expunges, &count);
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen /* convert uids and drop duplicates */
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen expunges[0].uid = mail_index_transaction_get_uid(t, expunges[0].uid);
0c909e3461607eadcd66f4eac69b7f34e37fccf1Timo Sirainen mail_index_transaction_get_uid(t, expunges[src].uid);
3a017aa592823edf0363d77f13458d569637915eTimo Sirainen if (expunges[dest-1].uid != expunges[dest].uid) {
4860b8746b3b7846a9fe65b8c2907ba8aebd422fTimo Sirainen memcpy(expunges[dest].guid_128, expunges[src].guid_128,
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainenmail_index_transaction_convert_to_uids(struct mail_index_transaction *t)
e20e638805c4bd54e039891a3e92760b1dfa189aTimo Sirainen array_foreach_modifiable(&t->ext_rec_updates, update)
e20e638805c4bd54e039891a3e92760b1dfa189aTimo Sirainen array_foreach_modifiable(&t->ext_rec_atomics, update)
ad48319996942463675b53877092ab7e13a7a75aTimo Sirainen mail_index_convert_to_uids(t, (void *)&t->modseq_updates);
9e6d83a3ef6abb393eeebca423cfd0d8cb08d430Timo Sirainen mail_index_transaction_seq_range_to_uid(t, (void *)&t->updates);
a42d489d99bcf7d18cfd0352fdf0c9348cb224fcTimo Sirainenvoid mail_index_transaction_finish_so_far(struct mail_index_transaction *t)
54b51a9c2705a19dfb1639647bc7e9378e37f881Timo Sirainen mail_index_transaction_finish_flag_updates(t);
a42d489d99bcf7d18cfd0352fdf0c9348cb224fcTimo Sirainenvoid mail_index_transaction_finish(struct mail_index_transaction *t)
d97f939b1c09e9f90b01b6f81bfb1c05da990148Timo Sirainen mail_index_update_day_headers(t, ioloop_time);
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen /* finally convert all sequences to UIDs before we write them,
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen but after we've checked and removed conflicts */
4b89231f4ec9cc69f4aea715e1d34f405c7e317dTimo Sirainen /* and kind of ugly way to update highest modseq */