dbox-transaction.c revision 687bb904e1bb76c21a6e392f60c990486b298ea4
e59faf65ce864fe95dc00f5d52b8323cdbd0608aTimo Sirainen/* Copyright (C) 2005 Timo Sirainen */
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen#include "lib.h"
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen#include "array.h"
b039dabf4c53f72454e795930e7643b6e0e625f9Timo Sirainen#include "dbox-sync.h"
2f30b72d49fbff0c4096125c139e4bdfef45669cTimo Sirainen#include "dbox-storage.h"
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen
91b203fd2132510a47a4b34252c0ae0efd688a19Timo Sirainenstatic void (*next_hook_mail_index_transaction_created)
61b0637759146621cbb7edcbd0b03a71cfd66dfeTimo Sirainen (struct mail_index_transaction *t) = NULL;
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainenstatic int dbox_transaction_commit(struct mail_index_transaction *t,
b039dabf4c53f72454e795930e7643b6e0e625f9Timo Sirainen uint32_t *log_file_seq_r,
b039dabf4c53f72454e795930e7643b6e0e625f9Timo Sirainen uoff_t *log_file_offset_r)
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen{
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen struct dbox_transaction_context *dt = MAIL_STORAGE_TRANSACTION(t);
c040ee67d0ac0fb7375bb543965bf67dcae6affaTimo Sirainen struct dbox_mailbox *dbox = (struct dbox_mailbox *)dt->ictx.ibox;
b039dabf4c53f72454e795930e7643b6e0e625f9Timo Sirainen struct dbox_save_context *save_ctx;
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen bool syncing = t->sync_transaction;
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen int ret = 0;
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen if (dt->save_ctx != NULL) {
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen if (dbox_transaction_save_commit_pre(dt->save_ctx) < 0) {
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen dt->save_ctx = NULL;
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen ret = -1;
4c1deab456fe8877bf025d11843167ac1f36327aTimo Sirainen }
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen }
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen save_ctx = dt->save_ctx;
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen if (ret < 0)
c040ee67d0ac0fb7375bb543965bf67dcae6affaTimo Sirainen index_transaction_finish_rollback(&dt->ictx);
c040ee67d0ac0fb7375bb543965bf67dcae6affaTimo Sirainen else {
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen if (index_transaction_finish_commit(&dt->ictx, log_file_seq_r,
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen log_file_offset_r) < 0)
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen ret = -1;
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen }
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen
b039dabf4c53f72454e795930e7643b6e0e625f9Timo Sirainen /* transaction is destroyed now. */
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen dt = NULL;
648d24583c1574441c4fa0331a90bd4d6e7996c5Timo Sirainen
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen if (save_ctx != NULL) {
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen /* unlock uidlist file after writing to transaction log,
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen to make sure we don't write uids in wrong order. */
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen dbox_transaction_save_commit_post(save_ctx);
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen }
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen if (ret == 0 && !syncing) {
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen if (dbox_sync(dbox, FALSE) < 0)
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen ret = -1;
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen }
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen return ret;
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen}
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen
dca6d617a23e3f93af3b8df59acb46478179fe55Timo Sirainenstatic void dbox_transaction_rollback(struct mail_index_transaction *t)
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen{
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen struct dbox_transaction_context *dt = MAIL_STORAGE_TRANSACTION(t);
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen if (dt->save_ctx != NULL)
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen dbox_transaction_save_rollback(dt->save_ctx);
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen index_transaction_finish_rollback(&dt->ictx);
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen}
dca6d617a23e3f93af3b8df59acb46478179fe55Timo Sirainen
dca6d617a23e3f93af3b8df59acb46478179fe55Timo Sirainenvoid dbox_transaction_created(struct mail_index_transaction *t)
dca6d617a23e3f93af3b8df59acb46478179fe55Timo Sirainen{
dca6d617a23e3f93af3b8df59acb46478179fe55Timo Sirainen struct mailbox *box = MAIL_STORAGE_INDEX(t->view->index);
dca6d617a23e3f93af3b8df59acb46478179fe55Timo Sirainen
dca6d617a23e3f93af3b8df59acb46478179fe55Timo Sirainen if (strcmp(box->storage->name, DBOX_STORAGE_NAME) == 0) {
dca6d617a23e3f93af3b8df59acb46478179fe55Timo Sirainen struct dbox_mailbox *dbox = (struct dbox_mailbox *)box;
dca6d617a23e3f93af3b8df59acb46478179fe55Timo Sirainen struct dbox_transaction_context *mt;
dca6d617a23e3f93af3b8df59acb46478179fe55Timo Sirainen
dca6d617a23e3f93af3b8df59acb46478179fe55Timo Sirainen mt = i_new(struct dbox_transaction_context, 1);
dca6d617a23e3f93af3b8df59acb46478179fe55Timo Sirainen mt->ictx.trans = t;
dca6d617a23e3f93af3b8df59acb46478179fe55Timo Sirainen mt->ictx.super = t->v;
dca6d617a23e3f93af3b8df59acb46478179fe55Timo Sirainen
dca6d617a23e3f93af3b8df59acb46478179fe55Timo Sirainen t->v.commit = dbox_transaction_commit;
dca6d617a23e3f93af3b8df59acb46478179fe55Timo Sirainen t->v.rollback = dbox_transaction_rollback;
dca6d617a23e3f93af3b8df59acb46478179fe55Timo Sirainen
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen array_idx_set(&t->mail_index_transaction_module_contexts,
dca6d617a23e3f93af3b8df59acb46478179fe55Timo Sirainen mail_storage_mail_index_module_id, &mt);
dca6d617a23e3f93af3b8df59acb46478179fe55Timo Sirainen
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen index_transaction_init(&mt->ictx, &dbox->ibox);
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen }
dca6d617a23e3f93af3b8df59acb46478179fe55Timo Sirainen
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen if (next_hook_mail_index_transaction_created != NULL)
dca6d617a23e3f93af3b8df59acb46478179fe55Timo Sirainen next_hook_mail_index_transaction_created(t);
dca6d617a23e3f93af3b8df59acb46478179fe55Timo Sirainen}
dca6d617a23e3f93af3b8df59acb46478179fe55Timo Sirainen
dca6d617a23e3f93af3b8df59acb46478179fe55Timo Sirainenvoid dbox_transaction_class_init(void)
dca6d617a23e3f93af3b8df59acb46478179fe55Timo Sirainen{
dca6d617a23e3f93af3b8df59acb46478179fe55Timo Sirainen next_hook_mail_index_transaction_created =
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen hook_mail_index_transaction_created;
dca6d617a23e3f93af3b8df59acb46478179fe55Timo Sirainen hook_mail_index_transaction_created = dbox_transaction_created;
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen}
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainenvoid dbox_transaction_class_deinit(void)
533bfba437e4120aa29dd45bca2aa87e30ee28a2Timo Sirainen{
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen i_assert(hook_mail_index_transaction_created ==
a64adf62fa33f2463a86f990217b0c9078531a40Timo Sirainen dbox_transaction_created);
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen hook_mail_index_transaction_created =
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen next_hook_mail_index_transaction_created;
533bfba437e4120aa29dd45bca2aa87e30ee28a2Timo Sirainen}
a27e065f1a1f91c7fbdf7c2ea1c387441af0cbb3Timo Sirainen