index-transaction.c revision e05a4c4136fec723f019bee8383103080203f127
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen/* Copyright (C) 2003 Timo Sirainen */
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen#include "lib.h"
e05a4c4136fec723f019bee8383103080203f127Timo Sirainen#include "array.h"
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen#include "index-storage.h"
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen#include "index-mail.h"
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
24fc71a693331ffe77e2b6d81c70aca6fa055e47Timo Sirainenvoid index_transaction_init(struct index_transaction_context *t,
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen struct index_mailbox *ibox,
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen enum mailbox_transaction_flags flags)
24fc71a693331ffe77e2b6d81c70aca6fa055e47Timo Sirainen{
24fc71a693331ffe77e2b6d81c70aca6fa055e47Timo Sirainen t->mailbox_ctx.box = &ibox->box;
24fc71a693331ffe77e2b6d81c70aca6fa055e47Timo Sirainen t->ibox = ibox;
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen t->flags = flags;
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen
e05a4c4136fec723f019bee8383103080203f127Timo Sirainen array_create(&t->mailbox_ctx.module_contexts, default_pool,
e05a4c4136fec723f019bee8383103080203f127Timo Sirainen sizeof(void *), 5);
e05a4c4136fec723f019bee8383103080203f127Timo Sirainen
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen t->trans = mail_index_transaction_begin(ibox->view,
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen (flags & MAILBOX_TRANSACTION_FLAG_HIDE) != 0,
fdc557286bc9f92c5f3bb49096ff6e2bcec0ea79Timo Sirainen (flags & MAILBOX_TRANSACTION_FLAG_EXTERNAL) != 0);
09c3a491f4f6ccebe290c7709bdc0d79a187610bTimo Sirainen t->trans_view = mail_index_transaction_open_updated_view(t->trans);
24fc71a693331ffe77e2b6d81c70aca6fa055e47Timo Sirainen t->cache_view = mail_cache_view_open(ibox->cache, t->trans_view);
1efb8b95e87ca3940cc74f9553a3c8ca5d85ead3Timo Sirainen t->cache_trans = mail_cache_get_transaction(t->cache_view, t->trans);
24fc71a693331ffe77e2b6d81c70aca6fa055e47Timo Sirainen}
24fc71a693331ffe77e2b6d81c70aca6fa055e47Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenstatic void index_transaction_free(struct index_transaction_context *t)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen{
24fc71a693331ffe77e2b6d81c70aca6fa055e47Timo Sirainen mail_cache_view_close(t->cache_view);
09c3a491f4f6ccebe290c7709bdc0d79a187610bTimo Sirainen mail_index_view_close(t->trans_view);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen mail_index_view_unlock(t->ibox->view);
e05a4c4136fec723f019bee8383103080203f127Timo Sirainen array_free(&t->mailbox_ctx.module_contexts);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen i_free(t);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen}
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenint index_transaction_commit(struct mailbox_transaction_context *_t)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen{
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen struct index_transaction_context *t =
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen (struct index_transaction_context *)_t;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen uint32_t seq;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen uoff_t offset;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen int ret;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen ret = mail_index_transaction_commit(t->trans, &seq, &offset);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen if (ret < 0)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen mail_storage_set_index_error(t->ibox);
53ea5cb26b07671cfd3eaecd9383f80fb6332ff6Timo Sirainen else {
53ea5cb26b07671cfd3eaecd9383f80fb6332ff6Timo Sirainen if (seq != 0) {
53ea5cb26b07671cfd3eaecd9383f80fb6332ff6Timo Sirainen t->ibox->commit_log_file_seq = seq;
53ea5cb26b07671cfd3eaecd9383f80fb6332ff6Timo Sirainen t->ibox->commit_log_file_offset = offset;
53ea5cb26b07671cfd3eaecd9383f80fb6332ff6Timo Sirainen }
8a3d609fdd84f5938c82e8e7eeb84a24ab41b317Timo Sirainen }
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen index_transaction_free(t);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen return ret;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen}
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainenvoid index_transaction_rollback(struct mailbox_transaction_context *_t)
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen{
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen struct index_transaction_context *t =
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen (struct index_transaction_context *)_t;
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen mail_index_transaction_rollback(t->trans);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen index_transaction_free(t);
0cb2e8eb55e70f8ebe1e8349bdf49e4cbe5d8834Timo Sirainen}