mail-index-transaction-finish.c revision 1279090ba03f9c176976a69ab7718f0ed77b19af
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen/* Copyright (c) 2003-2009 Dovecot authors, see the included COPYING file */
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);
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainenmail_index_update_cancel_array(ARRAY_TYPE(seq_range) *array, uint32_t seq)
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainenmail_index_update_cancel(struct mail_index_transaction *t, uint32_t seq)
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen struct mail_index_transaction_keyword_update *kw;
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen struct mail_transaction_flag_update *updates, tmp_update;
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen unsigned int i, count;
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen ret = mail_index_update_cancel_array(&t->keyword_resets, seq);
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen kw = array_get_modifiable(&t->keyword_updates, &count);
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen for (i = 0; i < count; i++) {
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen if (mail_index_update_cancel_array(&kw[i].add_seq, seq))
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen if (mail_index_update_cancel_array(&kw[i].remove_seq,
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen updates = array_get_modifiable(&t->updates, &count);
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen i = mail_index_transaction_get_flag_update_pos(t, 0, count, seq);
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen if (i < count && updates[i].uid1 <= seq && updates[i].uid2 >= seq) {
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen if (updates[i].uid1 == seq && updates[i].uid2 == seq) {
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen /* need to split it in two */
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen array_insert(&t->updates, i + 1, &tmp_update, 1);
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) {
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen seq_range_array_add(t->conflict_seqs, 0, seq);
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);
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen rec = MAIL_INDEX_MAP_IDX(t->view->map, seq - 1);
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainenmail_index_convert_to_uids(struct mail_index_transaction *t,
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen unsigned int i, count;
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) {
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainenmail_index_convert_to_uid_ranges(struct mail_index_transaction *t,
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen unsigned int i, count;
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)
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen struct mail_index_transaction_keyword_update *updates;
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen unsigned int i, count;
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen updates = array_get_modifiable(&t->keyword_updates, &count);
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen for (i = 0; i < count; i++) {
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen mail_index_convert_to_uid_ranges(t, &updates[i].add_seq);
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen mail_index_convert_to_uid_ranges(t, &updates[i].remove_seq);
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainenmail_index_transaction_convert_to_uids(struct mail_index_transaction *t)
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen unsigned int i, count;
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen updates = array_get_modifiable(&t->ext_rec_updates, &count);
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen for (i = 0; i < count; i++)
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen mail_index_convert_to_uids(t, (void *)&updates[i]);
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen updates = array_get_modifiable(&t->ext_rec_atomics, &count);
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen for (i = 0; i < count; i++)
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen mail_index_convert_to_uids(t, (void *)&updates[i]);
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen mail_index_convert_to_uid_ranges(t, &t->expunges);
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen mail_index_convert_to_uid_ranges(t, (void *)&t->updates);
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen mail_index_convert_to_uid_ranges(t, &t->keyword_resets);
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainenint mail_index_transaction_finish(struct mail_index_transaction *t)
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen if (array_is_created(&t->ext_reset_atomic) || t->max_modseq != 0) {
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen /* finally convert all sequences to UIDs before we write them,
1279090ba03f9c176976a69ab7718f0ed77b19afTimo Sirainen but after we've checked and removed conflicts */