mbox-transaction.c revision 4dec2a9f173755b475550f4af858bfe073e76518
b5ab29780f74cf88212a547ebbe3b6bc0cb867c5Stephan Bosch/* Copyright (C) 2004 Timo Sirainen */
d7a2f56cd0e550a92cb160b346f33a84b0daa75eTimo Sirainenstatic void (*next_hook_mail_index_transaction_created)
b28403dc4da6ee942ff18315596b43d4c4e9b7bdMartti Rannanjärvi (struct mail_index_transaction *t) = NULL;
b28403dc4da6ee942ff18315596b43d4c4e9b7bdMartti Rannanjärvistatic int mbox_transaction_commit(struct mail_index_transaction *t,
b28403dc4da6ee942ff18315596b43d4c4e9b7bdMartti Rannanjärvi struct mbox_transaction_context *mt = MAIL_STORAGE_CONTEXT(t);
b28403dc4da6ee942ff18315596b43d4c4e9b7bdMartti Rannanjärvi struct mbox_mailbox *mbox = (struct mbox_mailbox *)mt->ictx.ibox;
b28403dc4da6ee942ff18315596b43d4c4e9b7bdMartti Rannanjärvi enum mailbox_sync_flags flags = mt->ictx.commit_flags;
b28403dc4da6ee942ff18315596b43d4c4e9b7bdMartti Rannanjärvi ret = mbox_transaction_save_commit(mt->save_ctx);
b28403dc4da6ee942ff18315596b43d4c4e9b7bdMartti Rannanjärvi index_transaction_finish_rollback(&mt->ictx);
7ebda61d3fd228451530ca8faa33380105230ebeAki Tuomi if (index_transaction_finish_commit(&mt->ictx, log_file_seq_r,
b28403dc4da6ee942ff18315596b43d4c4e9b7bdMartti Rannanjärvi /* transaction is destroyed now. */
b28403dc4da6ee942ff18315596b43d4c4e9b7bdMartti Rannanjärvi if (lock_id != 0 && mbox->mbox_lock_type != F_WRLCK) {
7ebda61d3fd228451530ca8faa33380105230ebeAki Tuomi /* unlock before writing any changes */
b28403dc4da6ee942ff18315596b43d4c4e9b7bdMartti Rannanjärvi enum mbox_sync_flags mbox_sync_flags = MBOX_SYNC_LAST_COMMIT;
b28403dc4da6ee942ff18315596b43d4c4e9b7bdMartti Rannanjärvi if ((flags & MAILBOX_SYNC_FLAG_FULL_READ) != 0 &&
b28403dc4da6ee942ff18315596b43d4c4e9b7bdMartti Rannanjärvi if ((flags & MAILBOX_SYNC_FLAG_FULL_WRITE) != 0)
b28403dc4da6ee942ff18315596b43d4c4e9b7bdMartti Rannanjärvi /* after saving mails we want to update the last-uid */
b28403dc4da6ee942ff18315596b43d4c4e9b7bdMartti Rannanjärvi mbox_sync_flags |= MBOX_SYNC_HEADER | MBOX_SYNC_REWRITE;
b28403dc4da6ee942ff18315596b43d4c4e9b7bdMartti Rannanjärvi if (mbox_sync(mbox, mbox_sync_flags) < 0)
b28403dc4da6ee942ff18315596b43d4c4e9b7bdMartti Rannanjärvistatic void mbox_transaction_rollback(struct mail_index_transaction *t)
b28403dc4da6ee942ff18315596b43d4c4e9b7bdMartti Rannanjärvi struct mbox_transaction_context *mt = MAIL_STORAGE_CONTEXT(t);
b28403dc4da6ee942ff18315596b43d4c4e9b7bdMartti Rannanjärvi struct mbox_mailbox *mbox = (struct mbox_mailbox *)mt->ictx.ibox;
b28403dc4da6ee942ff18315596b43d4c4e9b7bdMartti Rannanjärvi (void)mbox_unlock(mbox, mt->mbox_lock_id);
b28403dc4da6ee942ff18315596b43d4c4e9b7bdMartti Rannanjärvi index_transaction_finish_rollback(&mt->ictx);
b28403dc4da6ee942ff18315596b43d4c4e9b7bdMartti Rannanjärvistatic void mbox_transaction_created(struct mail_index_transaction *t)
7ebda61d3fd228451530ca8faa33380105230ebeAki Tuomi struct mailbox *box = MAIL_STORAGE_CONTEXT(t->view->index);
796beea86bcdc92e4ba2f4865414a951b1717e5cTimo Sirainen /* index can be for mailbox list index, in which case box=NULL */
b28403dc4da6ee942ff18315596b43d4c4e9b7bdMartti Rannanjärvi if (box != NULL && strcmp(box->storage->name, MBOX_STORAGE_NAME) == 0) {
b28403dc4da6ee942ff18315596b43d4c4e9b7bdMartti Rannanjärvi struct mbox_mailbox *mbox = (struct mbox_mailbox *)box;
b28403dc4da6ee942ff18315596b43d4c4e9b7bdMartti Rannanjärvi mt = i_new(struct mbox_transaction_context, 1);
b28403dc4da6ee942ff18315596b43d4c4e9b7bdMartti Rannanjärvi t->v.rollback = mbox_transaction_rollback;
b28403dc4da6ee942ff18315596b43d4c4e9b7bdMartti Rannanjärvi MODULE_CONTEXT_SET(t, mail_storage_mail_index_module, mt);
b28403dc4da6ee942ff18315596b43d4c4e9b7bdMartti Rannanjärvi index_transaction_init(&mt->ictx, &mbox->ibox);
7ebda61d3fd228451530ca8faa33380105230ebeAki Tuomi if (next_hook_mail_index_transaction_created != NULL)
d7a2f56cd0e550a92cb160b346f33a84b0daa75eTimo Sirainen hook_mail_index_transaction_created = mbox_transaction_created;