index-transaction.c revision 9293bf90039454f47e94e4ba3722a775cfa7d25c
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen/* Copyright (c) 2003-2008 Dovecot authors, see the included COPYING file */
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen#include "lib.h"
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen#include "array.h"
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen#include "index-storage.h"
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen#include "index-mail.h"
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainenvoid index_transaction_init(struct index_transaction_context *t,
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen struct index_mailbox *ibox)
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen{
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen t->mailbox_ctx.box = &ibox->box;
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen t->ibox = ibox;
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen array_create(&t->mailbox_ctx.module_contexts, default_pool,
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen sizeof(void *), 5);
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen t->trans_view = mail_index_transaction_open_updated_view(t->trans);
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen t->cache_view = mail_cache_view_open(ibox->cache, t->trans_view);
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen t->cache_trans = mail_cache_get_transaction(t->cache_view, t->trans);
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen}
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainenstatic void index_transaction_free(struct index_transaction_context *t)
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen{
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen mail_cache_view_close(t->cache_view);
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen mail_index_view_close(&t->trans_view);
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen array_free(&t->mailbox_ctx.module_contexts);
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen i_free(t);
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen}
d5cebe7f98e63d4e2822863ef2faa4971e8b3a5dTimo Sirainen
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainenint index_transaction_finish_commit(struct index_transaction_context *t,
d5cebe7f98e63d4e2822863ef2faa4971e8b3a5dTimo Sirainen uint32_t *log_file_seq_r,
d5cebe7f98e63d4e2822863ef2faa4971e8b3a5dTimo Sirainen uoff_t *log_file_offset_r)
d5cebe7f98e63d4e2822863ef2faa4971e8b3a5dTimo Sirainen{
d5cebe7f98e63d4e2822863ef2faa4971e8b3a5dTimo Sirainen int ret;
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen i_assert(t->mail_ref_count == 0);
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen ret = t->super.commit(t->trans, log_file_seq_r, log_file_offset_r);
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen if (ret < 0)
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen mail_storage_set_index_error(t->ibox);
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen else {
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen if (*log_file_seq_r != 0) {
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen t->ibox->commit_log_file_seq = *log_file_seq_r;
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen t->ibox->commit_log_file_offset = *log_file_offset_r;
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen }
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen }
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen index_transaction_free(t);
b6ff64ea9a8615271ffdfde1aad2da2fd1b0ba1fTimo Sirainen return ret;
b6ff64ea9a8615271ffdfde1aad2da2fd1b0ba1fTimo Sirainen}
b6ff64ea9a8615271ffdfde1aad2da2fd1b0ba1fTimo Sirainen
b6ff64ea9a8615271ffdfde1aad2da2fd1b0ba1fTimo Sirainenvoid index_transaction_finish_rollback(struct index_transaction_context *t)
8da8fa22f337c7e9f9ec6183e22f351811478387Timo Sirainen{
b6ff64ea9a8615271ffdfde1aad2da2fd1b0ba1fTimo Sirainen i_assert(t->mail_ref_count == 0);
b6ff64ea9a8615271ffdfde1aad2da2fd1b0ba1fTimo Sirainen
b6ff64ea9a8615271ffdfde1aad2da2fd1b0ba1fTimo Sirainen t->super.rollback(t->trans);
b6ff64ea9a8615271ffdfde1aad2da2fd1b0ba1fTimo Sirainen index_transaction_free(t);
b6ff64ea9a8615271ffdfde1aad2da2fd1b0ba1fTimo Sirainen}
b6ff64ea9a8615271ffdfde1aad2da2fd1b0ba1fTimo Sirainen
b6ff64ea9a8615271ffdfde1aad2da2fd1b0ba1fTimo Sirainenstruct mailbox_transaction_context *
b6ff64ea9a8615271ffdfde1aad2da2fd1b0ba1fTimo Sirainenindex_transaction_begin(struct mailbox *box,
b6ff64ea9a8615271ffdfde1aad2da2fd1b0ba1fTimo Sirainen enum mailbox_transaction_flags flags)
b6ff64ea9a8615271ffdfde1aad2da2fd1b0ba1fTimo Sirainen{
b6ff64ea9a8615271ffdfde1aad2da2fd1b0ba1fTimo Sirainen struct index_mailbox *ibox = (struct index_mailbox *)box;
b6ff64ea9a8615271ffdfde1aad2da2fd1b0ba1fTimo Sirainen struct mail_index_transaction *t;
b6ff64ea9a8615271ffdfde1aad2da2fd1b0ba1fTimo Sirainen struct index_transaction_context *it;
b6ff64ea9a8615271ffdfde1aad2da2fd1b0ba1fTimo Sirainen enum mail_index_transaction_flags trans_flags;
b6ff64ea9a8615271ffdfde1aad2da2fd1b0ba1fTimo Sirainen
b6ff64ea9a8615271ffdfde1aad2da2fd1b0ba1fTimo Sirainen if (!box->opened)
b6ff64ea9a8615271ffdfde1aad2da2fd1b0ba1fTimo Sirainen index_storage_mailbox_open(ibox);
b6ff64ea9a8615271ffdfde1aad2da2fd1b0ba1fTimo Sirainen
b6ff64ea9a8615271ffdfde1aad2da2fd1b0ba1fTimo Sirainen trans_flags = MAIL_INDEX_TRANSACTION_FLAG_AVOID_FLAG_UPDATES;
b6ff64ea9a8615271ffdfde1aad2da2fd1b0ba1fTimo Sirainen if ((flags & MAILBOX_TRANSACTION_FLAG_HIDE) != 0)
b6ff64ea9a8615271ffdfde1aad2da2fd1b0ba1fTimo Sirainen trans_flags |= MAIL_INDEX_TRANSACTION_FLAG_HIDE;
b6ff64ea9a8615271ffdfde1aad2da2fd1b0ba1fTimo Sirainen if ((flags & MAILBOX_TRANSACTION_FLAG_EXTERNAL) != 0)
b6ff64ea9a8615271ffdfde1aad2da2fd1b0ba1fTimo Sirainen trans_flags |= MAIL_INDEX_TRANSACTION_FLAG_EXTERNAL;
8da8fa22f337c7e9f9ec6183e22f351811478387Timo Sirainen if ((flags & MAILBOX_TRANSACTION_FLAG_REFRESH) != 0)
8da8fa22f337c7e9f9ec6183e22f351811478387Timo Sirainen (void)mail_index_refresh(ibox->index);
8da8fa22f337c7e9f9ec6183e22f351811478387Timo Sirainen t = mail_index_transaction_begin(ibox->view, trans_flags);
b6ff64ea9a8615271ffdfde1aad2da2fd1b0ba1fTimo Sirainen
b6ff64ea9a8615271ffdfde1aad2da2fd1b0ba1fTimo Sirainen it = MAIL_STORAGE_CONTEXT(t);
b6ff64ea9a8615271ffdfde1aad2da2fd1b0ba1fTimo Sirainen if (it == NULL) {
8da8fa22f337c7e9f9ec6183e22f351811478387Timo Sirainen i_panic("mail storage transaction context mising for type %s",
8da8fa22f337c7e9f9ec6183e22f351811478387Timo Sirainen box->storage->name);
b6ff64ea9a8615271ffdfde1aad2da2fd1b0ba1fTimo Sirainen }
b6ff64ea9a8615271ffdfde1aad2da2fd1b0ba1fTimo Sirainen it->flags = flags;
b6ff64ea9a8615271ffdfde1aad2da2fd1b0ba1fTimo Sirainen return &it->mailbox_ctx;
b6ff64ea9a8615271ffdfde1aad2da2fd1b0ba1fTimo Sirainen}
b6ff64ea9a8615271ffdfde1aad2da2fd1b0ba1fTimo Sirainen
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainenint index_transaction_commit(struct mailbox_transaction_context *_t,
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen uint32_t *uid_validity_r,
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen uint32_t *first_saved_uid_r,
b6ff64ea9a8615271ffdfde1aad2da2fd1b0ba1fTimo Sirainen uint32_t *last_saved_uid_r)
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen{
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen struct index_transaction_context *t =
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen (struct index_transaction_context *)_t;
f83a33d8ddb275984cd89835ee8afe0ff584fe91Timo Sirainen struct mail_index_transaction *itrans = t->trans;
f83a33d8ddb275984cd89835ee8afe0ff584fe91Timo Sirainen uint32_t seq;
f83a33d8ddb275984cd89835ee8afe0ff584fe91Timo Sirainen uoff_t offset;
f83a33d8ddb275984cd89835ee8afe0ff584fe91Timo Sirainen
f83a33d8ddb275984cd89835ee8afe0ff584fe91Timo Sirainen *uid_validity_r = 0;
f83a33d8ddb275984cd89835ee8afe0ff584fe91Timo Sirainen *first_saved_uid_r = *last_saved_uid_r = 0;
34861542d8975d85bc87a2e21e40ada22545b672Timo Sirainen
34861542d8975d85bc87a2e21e40ada22545b672Timo Sirainen t->saved_uid_validity = uid_validity_r;
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen t->first_saved_uid = first_saved_uid_r;
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen t->last_saved_uid = last_saved_uid_r;
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen return mail_index_transaction_commit(&itrans, &seq, &offset);
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen}
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainenvoid index_transaction_rollback(struct mailbox_transaction_context *_t)
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen{
1e47cfede3a0b62654105daab00e97b5d660bc6bTimo Sirainen struct index_transaction_context *t =
1e47cfede3a0b62654105daab00e97b5d660bc6bTimo Sirainen (struct index_transaction_context *)_t;
1e47cfede3a0b62654105daab00e97b5d660bc6bTimo Sirainen struct mail_index_transaction *itrans = t->trans;
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen mail_index_transaction_rollback(&itrans);
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen}
1098fc409a45e7603701dc94635927a673bee0c1Timo Sirainen