}
static void
-mail_index_expunge_last_append_ext(ARRAY_TYPE(seq_array_array) *ext_updates,
- uint32_t seq)
+mail_index_revert_ext(ARRAY_TYPE(seq_array_array) *ext_updates,
+ uint32_t seq)
{
ARRAY_TYPE(seq_array) *seqs;
unsigned int idx;
}
static void
-mail_index_expunge_last_append(struct mail_index_transaction *t, uint32_t seq)
+mail_index_revert_changes_common(struct mail_index_transaction *t, uint32_t seq)
{
struct mail_index_transaction_keyword_update *kw_update;
unsigned int i;
- i_assert(seq == t->last_new_seq);
-
/* remove extension updates */
- mail_index_expunge_last_append_ext(&t->ext_rec_updates, seq);
- mail_index_expunge_last_append_ext(&t->ext_rec_atomics, seq);
+ mail_index_revert_ext(&t->ext_rec_updates, seq);
+ mail_index_revert_ext(&t->ext_rec_atomics, seq);
t->log_ext_updates = mail_index_transaction_has_ext_changes(t);
/* remove keywords */
if (array_is_created(&t->modseq_updates) &&
mail_index_seq_array_lookup((void *)&t->modseq_updates, seq, &i))
array_delete(&t->modseq_updates, i, 1);
+}
+
+void mail_index_revert_changes(struct mail_index_transaction *t, uint32_t seq)
+{
+ mail_index_revert_changes_common(t, seq);
+ mail_index_cancel_flag_updates(t, seq);
+}
+
+static void
+mail_index_expunge_last_append(struct mail_index_transaction *t, uint32_t seq)
+{
+ i_assert(seq == t->last_new_seq);
+
+ mail_index_revert_changes_common(t, seq);
/* and finally remove the append itself */
array_delete(&t->appends, seq - t->first_new_seq, 1);
/* Like mail_index_expunge(), but also write message GUID to transaction log. */
void mail_index_expunge_guid(struct mail_index_transaction *t, uint32_t seq,
const guid_128_t guid_128);
+/* Revert all changes done in this transaction to the given existing mail. */
+void mail_index_revert_changes(struct mail_index_transaction *t, uint32_t seq);
/* Update flags in index. */
void mail_index_update_flags(struct mail_index_transaction *t, uint32_t seq,
enum modify_type modify_type,