cydir-transaction.c revision 398d66217c5916b14485714954c14cf8af0c8547
854b4074ac77a138b3983d72510b4d8779d15040Timo Sirainen/* Copyright (c) 2007-2009 Dovecot authors, see the included COPYING file */
854b4074ac77a138b3983d72510b4d8779d15040Timo Sirainen
854b4074ac77a138b3983d72510b4d8779d15040Timo Sirainen#include "lib.h"
854b4074ac77a138b3983d72510b4d8779d15040Timo Sirainen#include "array.h"
854b4074ac77a138b3983d72510b4d8779d15040Timo Sirainen#include "cydir-storage.h"
854b4074ac77a138b3983d72510b4d8779d15040Timo Sirainen#include "cydir-sync.h"
854b4074ac77a138b3983d72510b4d8779d15040Timo Sirainen
854b4074ac77a138b3983d72510b4d8779d15040Timo Sirainenstatic void (*next_hook_mail_index_transaction_created)
854b4074ac77a138b3983d72510b4d8779d15040Timo Sirainen (struct mail_index_transaction *t) = NULL;
854b4074ac77a138b3983d72510b4d8779d15040Timo Sirainen
854b4074ac77a138b3983d72510b4d8779d15040Timo Sirainenstatic int cydir_transaction_commit(struct mail_index_transaction *t,
854b4074ac77a138b3983d72510b4d8779d15040Timo Sirainen uint32_t *log_file_seq_r,
854b4074ac77a138b3983d72510b4d8779d15040Timo Sirainen uoff_t *log_file_offset_r)
decdff03c32cb5d0e99d71c5678fd008714de70bTimo Sirainen{
854b4074ac77a138b3983d72510b4d8779d15040Timo Sirainen struct cydir_transaction_context *dt = MAIL_STORAGE_CONTEXT(t);
854b4074ac77a138b3983d72510b4d8779d15040Timo Sirainen struct cydir_save_context *save_ctx;
854b4074ac77a138b3983d72510b4d8779d15040Timo Sirainen int ret = 0;
854b4074ac77a138b3983d72510b4d8779d15040Timo Sirainen
854b4074ac77a138b3983d72510b4d8779d15040Timo Sirainen if (dt->save_ctx != NULL) {
854b4074ac77a138b3983d72510b4d8779d15040Timo Sirainen if (cydir_transaction_save_commit_pre(dt->save_ctx) < 0) {
854b4074ac77a138b3983d72510b4d8779d15040Timo Sirainen dt->save_ctx = NULL;
854b4074ac77a138b3983d72510b4d8779d15040Timo Sirainen ret = -1;
854b4074ac77a138b3983d72510b4d8779d15040Timo Sirainen }
854b4074ac77a138b3983d72510b4d8779d15040Timo Sirainen }
854b4074ac77a138b3983d72510b4d8779d15040Timo Sirainen
854b4074ac77a138b3983d72510b4d8779d15040Timo Sirainen save_ctx = dt->save_ctx;
854b4074ac77a138b3983d72510b4d8779d15040Timo Sirainen
854b4074ac77a138b3983d72510b4d8779d15040Timo Sirainen if (ret < 0)
854b4074ac77a138b3983d72510b4d8779d15040Timo Sirainen index_transaction_finish_rollback(&dt->ictx);
854b4074ac77a138b3983d72510b4d8779d15040Timo Sirainen else {
854b4074ac77a138b3983d72510b4d8779d15040Timo Sirainen if (index_transaction_finish_commit(&dt->ictx, log_file_seq_r,
854b4074ac77a138b3983d72510b4d8779d15040Timo Sirainen log_file_offset_r) < 0)
854b4074ac77a138b3983d72510b4d8779d15040Timo Sirainen ret = -1;
854b4074ac77a138b3983d72510b4d8779d15040Timo Sirainen }
854b4074ac77a138b3983d72510b4d8779d15040Timo Sirainen
854b4074ac77a138b3983d72510b4d8779d15040Timo Sirainen /* transaction is destroyed now. */
854b4074ac77a138b3983d72510b4d8779d15040Timo Sirainen dt = NULL;
854b4074ac77a138b3983d72510b4d8779d15040Timo Sirainen
854b4074ac77a138b3983d72510b4d8779d15040Timo Sirainen if (save_ctx != NULL) {
854b4074ac77a138b3983d72510b4d8779d15040Timo Sirainen /* unlock uidlist file after writing to transaction log,
854b4074ac77a138b3983d72510b4d8779d15040Timo Sirainen to make sure we don't write uids in wrong order. */
854b4074ac77a138b3983d72510b4d8779d15040Timo Sirainen cydir_transaction_save_commit_post(save_ctx);
854b4074ac77a138b3983d72510b4d8779d15040Timo Sirainen }
854b4074ac77a138b3983d72510b4d8779d15040Timo Sirainen return ret;
854b4074ac77a138b3983d72510b4d8779d15040Timo Sirainen}
854b4074ac77a138b3983d72510b4d8779d15040Timo Sirainen
854b4074ac77a138b3983d72510b4d8779d15040Timo Sirainenstatic void cydir_transaction_rollback(struct mail_index_transaction *t)
854b4074ac77a138b3983d72510b4d8779d15040Timo Sirainen{
854b4074ac77a138b3983d72510b4d8779d15040Timo Sirainen struct cydir_transaction_context *dt = MAIL_STORAGE_CONTEXT(t);
854b4074ac77a138b3983d72510b4d8779d15040Timo Sirainen
854b4074ac77a138b3983d72510b4d8779d15040Timo Sirainen if (dt->save_ctx != NULL)
854b4074ac77a138b3983d72510b4d8779d15040Timo Sirainen cydir_transaction_save_rollback(dt->save_ctx);
854b4074ac77a138b3983d72510b4d8779d15040Timo Sirainen
854b4074ac77a138b3983d72510b4d8779d15040Timo Sirainen index_transaction_finish_rollback(&dt->ictx);
854b4074ac77a138b3983d72510b4d8779d15040Timo Sirainen}
854b4074ac77a138b3983d72510b4d8779d15040Timo Sirainen
854b4074ac77a138b3983d72510b4d8779d15040Timo Sirainenstatic void cydir_transaction_created(struct mail_index_transaction *t)
854b4074ac77a138b3983d72510b4d8779d15040Timo Sirainen{
854b4074ac77a138b3983d72510b4d8779d15040Timo Sirainen struct mailbox *box = MAIL_STORAGE_CONTEXT(t->view);
854b4074ac77a138b3983d72510b4d8779d15040Timo Sirainen
854b4074ac77a138b3983d72510b4d8779d15040Timo Sirainen /* index can be for mailbox list index, in which case box=NULL */
854b4074ac77a138b3983d72510b4d8779d15040Timo Sirainen if (box != NULL &&
854b4074ac77a138b3983d72510b4d8779d15040Timo Sirainen strcmp(box->storage->name, CYDIR_STORAGE_NAME) == 0) {
854b4074ac77a138b3983d72510b4d8779d15040Timo Sirainen struct cydir_mailbox *cydir = (struct cydir_mailbox *)box;
854b4074ac77a138b3983d72510b4d8779d15040Timo Sirainen struct cydir_transaction_context *mt;
854b4074ac77a138b3983d72510b4d8779d15040Timo Sirainen
854b4074ac77a138b3983d72510b4d8779d15040Timo Sirainen mt = i_new(struct cydir_transaction_context, 1);
854b4074ac77a138b3983d72510b4d8779d15040Timo Sirainen mt->ictx.trans = t;
854b4074ac77a138b3983d72510b4d8779d15040Timo Sirainen index_transaction_init(&mt->ictx, &cydir->ibox);
854b4074ac77a138b3983d72510b4d8779d15040Timo Sirainen
854b4074ac77a138b3983d72510b4d8779d15040Timo Sirainen t->v.commit = cydir_transaction_commit;
854b4074ac77a138b3983d72510b4d8779d15040Timo Sirainen t->v.rollback = cydir_transaction_rollback;
854b4074ac77a138b3983d72510b4d8779d15040Timo Sirainen MODULE_CONTEXT_SET(t, mail_storage_mail_index_module, mt);
854b4074ac77a138b3983d72510b4d8779d15040Timo Sirainen }
854b4074ac77a138b3983d72510b4d8779d15040Timo Sirainen
854b4074ac77a138b3983d72510b4d8779d15040Timo Sirainen if (next_hook_mail_index_transaction_created != NULL)
854b4074ac77a138b3983d72510b4d8779d15040Timo Sirainen next_hook_mail_index_transaction_created(t);
854b4074ac77a138b3983d72510b4d8779d15040Timo Sirainen}
decdff03c32cb5d0e99d71c5678fd008714de70bTimo Sirainen
decdff03c32cb5d0e99d71c5678fd008714de70bTimo Sirainenvoid cydir_transaction_class_init(void)
decdff03c32cb5d0e99d71c5678fd008714de70bTimo Sirainen{
decdff03c32cb5d0e99d71c5678fd008714de70bTimo Sirainen next_hook_mail_index_transaction_created =
decdff03c32cb5d0e99d71c5678fd008714de70bTimo Sirainen hook_mail_index_transaction_created;
decdff03c32cb5d0e99d71c5678fd008714de70bTimo Sirainen hook_mail_index_transaction_created = cydir_transaction_created;
decdff03c32cb5d0e99d71c5678fd008714de70bTimo Sirainen}
854b4074ac77a138b3983d72510b4d8779d15040Timo Sirainen
854b4074ac77a138b3983d72510b4d8779d15040Timo Sirainenvoid cydir_transaction_class_deinit(void)
854b4074ac77a138b3983d72510b4d8779d15040Timo Sirainen{
854b4074ac77a138b3983d72510b4d8779d15040Timo Sirainen i_assert(hook_mail_index_transaction_created ==
854b4074ac77a138b3983d72510b4d8779d15040Timo Sirainen cydir_transaction_created);
854b4074ac77a138b3983d72510b4d8779d15040Timo Sirainen hook_mail_index_transaction_created =
854b4074ac77a138b3983d72510b4d8779d15040Timo Sirainen next_hook_mail_index_transaction_created;
854b4074ac77a138b3983d72510b4d8779d15040Timo Sirainen}
854b4074ac77a138b3983d72510b4d8779d15040Timo Sirainen