struct mail_save_context *
cydir_save_alloc(struct mailbox_transaction_context *t)
{
- struct index_transaction_context *it =
- (struct index_transaction_context *)t;
struct cydir_mailbox *mbox = (struct cydir_mailbox *)t->box;
struct cydir_save_context *ctx =
(struct cydir_save_context *)t->save_ctx;
ctx = i_new(struct cydir_save_context, 1);
ctx->ctx.transaction = t;
ctx->mbox = mbox;
- ctx->trans = it->trans;
+ ctx->trans = t->itrans;
ctx->tmp_basename = cydir_generate_tmp_filename();
t->save_ctx = &ctx->ctx;
}
mdbox_copy_file_get_file(struct mailbox_transaction_context *t,
uint32_t seq, uoff_t *offset_r)
{
- struct index_transaction_context *it =
- (struct index_transaction_context *)t;
struct mdbox_save_context *ctx =
(struct mdbox_save_context *)t->save_ctx;
const struct mdbox_mail_index_record *rec;
bool expunged;
uint32_t file_id;
- mail_index_lookup_ext(it->trans_view, seq, ctx->mbox->ext_id,
+ mail_index_lookup_ext(t->view, seq, ctx->mbox->ext_id,
&data, &expunged);
rec = data;
struct mail_save_context *
mdbox_save_alloc(struct mailbox_transaction_context *t)
{
- struct index_transaction_context *it =
- (struct index_transaction_context *)t;
struct mdbox_mailbox *mbox = (struct mdbox_mailbox *)t->box;
struct mdbox_save_context *ctx =
(struct mdbox_save_context *)t->save_ctx;
ctx = i_new(struct mdbox_save_context, 1);
ctx->ctx.ctx.transaction = t;
- ctx->ctx.trans = it->trans;
+ ctx->ctx.trans = t->itrans;
ctx->mbox = mbox;
ctx->append_ctx = dbox_map_append_begin(mbox->storage->map, 0);
i_array_init(&ctx->mails, 32);
struct mail_save_context *
sdbox_save_alloc(struct mailbox_transaction_context *t)
{
- struct index_transaction_context *it =
- (struct index_transaction_context *)t;
struct sdbox_mailbox *mbox = (struct sdbox_mailbox *)t->box;
struct sdbox_save_context *ctx =
(struct sdbox_save_context *)t->save_ctx;
ctx = i_new(struct sdbox_save_context, 1);
ctx->ctx.ctx.transaction = t;
- ctx->ctx.trans = it->trans;
+ ctx->ctx.trans = t->itrans;
ctx->mbox = mbox;
i_array_init(&ctx->files, 32);
t->save_ctx = &ctx->ctx.ctx;
size_r, sizeof(*size_r));
}
-enum mail_flags index_mail_get_flags(struct mail *_mail)
+enum mail_flags index_mail_get_flags(struct mail *mail)
{
- struct index_mail *mail = (struct index_mail *)_mail;
const struct mail_index_record *rec;
enum mail_flags flags;
- rec = mail_index_lookup(mail->trans->trans_view, _mail->seq);
+ rec = mail_index_lookup(mail->transaction->view, mail->seq);
flags = rec->flags & (MAIL_FLAGS_NONRECENT |
MAIL_INDEX_MAIL_FLAG_BACKEND);
- if (index_mailbox_is_recent(_mail->box, _mail->uid))
+ if (index_mailbox_is_recent(mail->box, mail->uid))
flags |= MAIL_RECENT;
return flags;
mail_index_modseq_enable(_mail->box->index);
mail->data.modseq =
- mail_index_modseq_lookup(mail->trans->trans_view, _mail->seq);
+ mail_index_modseq_lookup(_mail->transaction->view, _mail->seq);
return mail->data.modseq;
}
if (!array_is_created(&data->keyword_indexes)) {
p_array_init(&data->keyword_indexes, mail->data_pool, 32);
- mail_index_lookup_keywords(mail->trans->trans_view,
+ mail_index_lookup_keywords(_mail->transaction->view,
mail->data.seq,
&data->keyword_indexes);
}
data->seq = seq;
mail->mail.mail.seq = seq;
- mail_index_lookup_uid(mail->trans->trans_view, seq,
+ mail_index_lookup_uid(_mail->transaction->view, seq,
&mail->mail.mail.uid);
- if (mail_index_view_is_inconsistent(mail->trans->trans_view)) {
+ if (mail_index_view_is_inconsistent(_mail->transaction->view)) {
mail_set_expunged(&mail->mail.mail);
return;
}
(void)index_mail_parse_body_finish(mail, 0);
}
-static void index_mail_drop_recent_flag(struct index_mail *imail)
+static void index_mail_drop_recent_flag(struct mail *mail)
{
const struct mail_index_header *hdr;
- uint32_t first_recent_uid = imail->mail.mail.uid + 1;
+ uint32_t first_recent_uid = mail->uid + 1;
- hdr = mail_index_get_header(imail->trans->trans_view);
+ hdr = mail_index_get_header(mail->transaction->view);
if (hdr->first_recent_uid < first_recent_uid) {
- mail_index_update_header(imail->trans->trans,
+ mail_index_update_header(mail->transaction->itrans,
offsetof(struct mail_index_header, first_recent_uid),
&first_recent_uid, sizeof(first_recent_uid), FALSE);
}
void index_mail_update_flags(struct mail *mail, enum modify_type modify_type,
enum mail_flags flags)
{
- struct index_mail *imail = (struct index_mail *)mail;
-
if ((flags & MAIL_RECENT) == 0 &&
index_mailbox_is_recent(mail->box, mail->uid))
- index_mail_drop_recent_flag(imail);
+ index_mail_drop_recent_flag(mail);
flags &= MAIL_FLAGS_NONRECENT | MAIL_INDEX_MAIL_FLAG_BACKEND;
- mail_index_update_flags(imail->trans->trans, mail->seq, modify_type,
- flags);
+ mail_index_update_flags(mail->transaction->itrans, mail->seq,
+ modify_type, flags);
}
void index_mail_update_keywords(struct mail *mail, enum modify_type modify_type,
sizeof(imail->data.keywords));
}
- mail_index_update_keywords(imail->trans->trans, mail->seq, modify_type,
- keywords);
+ mail_index_update_keywords(mail->transaction->itrans, mail->seq,
+ modify_type, keywords);
}
void index_mail_update_modseq(struct mail *mail, uint64_t min_modseq)
{
- struct index_mail *imail = (struct index_mail *)mail;
-
- mail_index_update_modseq(imail->trans->trans, mail->seq, min_modseq);
+ mail_index_update_modseq(mail->transaction->itrans, mail->seq,
+ min_modseq);
}
void index_mail_update_uid(struct mail *mail, uint32_t new_uid)
{
- struct index_mail *imail = (struct index_mail *)mail;
-
- mail_index_update_uid(imail->trans->trans, mail->seq, new_uid);
+ mail_index_update_uid(mail->transaction->itrans, mail->seq, new_uid);
}
void index_mail_expunge(struct mail *mail)
{
- struct index_mail *imail = (struct index_mail *)mail;
const char *value;
uint8_t guid_128[MAIL_GUID_128_SIZE];
if (mail_get_special(mail, MAIL_FETCH_GUID, &value) < 0)
- mail_index_expunge(imail->trans->trans, mail->seq);
+ mail_index_expunge(mail->transaction->itrans, mail->seq);
else {
mail_generate_guid_128_hash(value, guid_128);
- mail_index_expunge_guid(imail->trans->trans,
+ mail_index_expunge_guid(mail->transaction->itrans,
mail->seq, guid_128);
}
}
}
struct mail_search_context *
-index_storage_search_init(struct mailbox_transaction_context *_t,
+index_storage_search_init(struct mailbox_transaction_context *t,
struct mail_search_args *args,
const enum mail_sort_type *sort_program)
{
- struct index_transaction_context *t =
- (struct index_transaction_context *)_t;
struct index_search_context *ctx;
struct mailbox_status status;
ctx = i_new(struct index_search_context, 1);
- ctx->mail_ctx.transaction = _t;
- ctx->box = _t->box;
- ctx->view = t->trans_view;
+ ctx->mail_ctx.transaction = t;
+ ctx->box = t->box;
+ ctx->view = t->view;
ctx->mail_ctx.args = args;
- ctx->mail_ctx.sort_program = index_sort_program_init(_t, sort_program);
+ ctx->mail_ctx.sort_program = index_sort_program_init(t, sort_program);
ctx->next_time_check_cost = SEARCH_INITIAL_MAX_COST;
if (gettimeofday(&ctx->last_nonblock_timeval, NULL) < 0)
i_fatal("gettimeofday() failed: %m");
- mailbox_get_status(_t->box, STATUS_MESSAGES, &status);
+ mailbox_get_status(t->box, STATUS_MESSAGES, &status);
ctx->mail_ctx.progress_max = status.messages;
i_array_init(&ctx->mail_ctx.results, 5);
mail_search_args_reset(ctx->mail_ctx.args->args, TRUE);
if (args->have_inthreads) {
- if (mail_thread_init(_t->box, NULL, &ctx->thread_ctx) < 0)
+ if (mail_thread_init(t->box, NULL, &ctx->thread_ctx) < 0)
ctx->failed = TRUE;
if (search_build_inthreads(ctx, args->args) < 0)
ctx->failed = TRUE;
static void index_sort_node_add(struct sort_string_context *ctx,
struct mail_sort_node *node)
{
- struct index_transaction_context *t =
- (struct index_transaction_context *)ctx->program->t;
struct mail_index_map *map;
const void *data;
uint32_t reset_id;
bool expunged;
- mail_index_lookup_ext_full(t->trans_view, node->seq,
+ mail_index_lookup_ext_full(ctx->program->t->view, node->seq,
ctx->ext_id, &map, &data, &expunged);
if (expunged) {
/* we don't want to update expunged messages' sort IDs */
if (node->sort_id != 0) {
/* if reset ID increases, lookup all existing messages' sort
IDs again. if it decreases, ignore the sort ID. */
- if (!mail_index_ext_get_reset_id(t->trans_view, map,
+ if (!mail_index_ext_get_reset_id(ctx->program->t->view, map,
ctx->ext_id, &reset_id))
reset_id = 0;
if (reset_id != ctx->highest_reset_id) {
static void index_sort_write_changed_sort_ids(struct sort_string_context *ctx)
{
- struct index_transaction_context *t =
- (struct index_transaction_context *)ctx->program->t;
+ struct mail_index_transaction *itrans = ctx->program->t->itrans;
uint32_t ext_id = ctx->ext_id;
const struct mail_sort_node *nodes;
unsigned int i, count;
return;
}
- mail_index_ext_reset_inc(t->trans, ext_id, ctx->highest_reset_id, FALSE);
+ mail_index_ext_reset_inc(itrans, ext_id,
+ ctx->highest_reset_id, FALSE);
/* add the missing sort IDs to index */
nodes = array_get_modifiable(&ctx->sorted_nodes, &count);
if (!nodes[i].sort_id_changed || nodes[i].no_update)
continue;
- mail_index_update_ext(t->trans, nodes[i].seq, ext_id,
+ mail_index_update_ext(itrans, nodes[i].seq, ext_id,
&nodes[i].sort_id, NULL);
}
}
struct mail_index_transaction_vfuncs super;
int mail_ref_count;
- struct mail_index_transaction *trans;
- struct mail_index_view *trans_view;
struct mail_cache_view *cache_view;
struct mail_cache_transaction_ctx *cache_trans;
};
static void index_transaction_free(struct index_transaction_context *t)
{
mail_cache_view_close(t->cache_view);
- mail_index_view_close(&t->trans_view);
+ mail_index_view_close(&t->mailbox_ctx.view);
array_free(&t->mailbox_ctx.module_contexts);
i_free(t);
}
i_assert(it->mail_ref_count == 0);
if (ret < 0)
- it->super.rollback(it->trans);
+ it->super.rollback(index_trans);
else {
- if (it->super.commit(it->trans, result_r) < 0) {
+ if (it->super.commit(index_trans, result_r) < 0) {
mail_storage_set_index_error(t->box);
ret = -1;
}
if (it->mailbox_ctx.save_ctx != NULL)
ibox->save_rollback(it->mailbox_ctx.save_ctx);
- it->super.rollback(it->trans);
+ it->super.rollback(t);
index_transaction_free(it);
}
struct mailbox *box,
enum mailbox_transaction_flags flags)
{
+ struct mailbox_transaction_context *t = &it->mailbox_ctx;
enum mail_index_transaction_flags trans_flags;
i_assert(box->opened);
if ((flags & MAILBOX_TRANSACTION_FLAG_REFRESH) != 0)
(void)mail_index_refresh(box->index);
- it->trans = mail_index_transaction_begin(box->view, trans_flags);
- it->mailbox_ctx.box = box;
+ t->box = box;
+ t->itrans = mail_index_transaction_begin(box->view, trans_flags);
+ t->view = mail_index_transaction_open_updated_view(t->itrans);
- array_create(&it->mailbox_ctx.module_contexts, default_pool,
+ array_create(&t->module_contexts, default_pool,
sizeof(void *), 5);
- it->trans_view = mail_index_transaction_open_updated_view(it->trans);
- it->cache_view = mail_cache_view_open(box->cache, it->trans_view);
- it->cache_trans = mail_cache_get_transaction(it->cache_view, it->trans);
+ it->cache_view = mail_cache_view_open(box->cache, t->view);
+ it->cache_trans = mail_cache_get_transaction(it->cache_view, t->itrans);
/* set up after mail_cache_get_transaction(), so that we'll still
have the cache_trans available in _index_commit() */
- it->super = it->trans->v;
- it->trans->v.commit = index_transaction_index_commit;
- it->trans->v.rollback = index_transaction_index_rollback;
- MODULE_CONTEXT_SET(it->trans, mail_storage_mail_index_module, it);
+ it->super = t->itrans->v;
+ t->itrans->v.commit = index_transaction_index_commit;
+ t->itrans->v.rollback = index_transaction_index_rollback;
+ MODULE_CONTEXT_SET(t->itrans, mail_storage_mail_index_module, it);
}
struct mailbox_transaction_context *
return &it->mailbox_ctx;
}
-int index_transaction_commit(struct mailbox_transaction_context *_t,
+int index_transaction_commit(struct mailbox_transaction_context *t,
struct mail_transaction_commit_changes *changes_r)
{
- struct index_transaction_context *t =
- (struct index_transaction_context *)_t;
- struct mailbox *box = _t->box;
- struct mail_index_transaction *itrans = t->trans;
+ struct mailbox *box = t->box;
+ struct mail_index_transaction *itrans = t->itrans;
struct mail_index_transaction_commit_result result;
int ret;
changes_r->pool = pool_alloconly_create(MEMPOOL_GROWING
"transaction changes", 512);
p_array_init(&changes_r->saved_uids, changes_r->pool, 32);
- _t->changes = changes_r;
+ t->changes = changes_r;
ret = mail_index_transaction_commit_full(&itrans, &result);
- _t = NULL;
+ t = NULL;
if (ret < 0 && mail_index_is_deleted(box->index))
mailbox_set_deleted(box);
return ret;
}
-void index_transaction_rollback(struct mailbox_transaction_context *_t)
+void index_transaction_rollback(struct mailbox_transaction_context *t)
{
- struct index_transaction_context *t =
- (struct index_transaction_context *)_t;
- struct mailbox *box = _t->box;
- struct mail_index_transaction *itrans = t->trans;
+ struct mailbox *box = t->box;
+ struct mail_index_transaction *itrans = t->itrans;
mail_index_transaction_rollback(&itrans);
box->view->transactions == 0);
}
-void index_transaction_set_max_modseq(struct mailbox_transaction_context *_t,
+void index_transaction_set_max_modseq(struct mailbox_transaction_context *t,
uint64_t max_modseq,
ARRAY_TYPE(seq_range) *seqs)
{
- struct index_transaction_context *t =
- (struct index_transaction_context *)_t;
-
- mail_index_transaction_set_max_modseq(t->trans, max_modseq, seqs);
+ mail_index_transaction_set_max_modseq(t->itrans, max_modseq, seqs);
}
ctx->ctx.transaction = t;
ctx->pool = pool;
ctx->mbox = mbox;
- ctx->trans = ((struct index_transaction_context *)t)->trans;
+ ctx->trans = t->itrans;
ctx->files_tail = &ctx->files;
ctx->fd = -1;
if (mbox_file_open_stream(mbox) < 0)
return -1;
- ret = mbox_file_seek(mbox, mail->trans->trans_view,
+ ret = mbox_file_seek(mbox, _mail->transaction->view,
_mail->seq, &deleted);
if (ret > 0) {
/* success */
if (mail->data.guid != NULL)
return mail->data.guid;
- mail_index_lookup_ext(mail->trans->trans_view, mail->mail.mail.seq,
- mbox->md5hdr_ext_idx, &ext_data, NULL);
+ mail_index_lookup_ext(mail->mail.mail.transaction->view,
+ mail->mail.mail.seq, mbox->md5hdr_ext_idx,
+ &ext_data, NULL);
if (ext_data != NULL && memcmp(ext_data, empty_md5, 16) != 0) {
mail->data.guid = p_strdup(mail->data_pool,
binary_to_hex(ext_data, 16));
int trailer_size;
int ret = 1;
- hdr = mail_index_get_header(mail->trans->trans_view);
+ hdr = mail_index_get_header(mail->mail.mail.transaction->view);
if (mail->mail.mail.seq > hdr->messages_count) {
/* we're appending a new message */
return 0;
struct mail_save_context *
mbox_save_alloc(struct mailbox_transaction_context *t)
{
- struct mbox_transaction_context *mt =
- (struct mbox_transaction_context *)t;
struct mbox_mailbox *mbox = (struct mbox_mailbox *)t->box;
struct mbox_save_context *ctx;
ctx = i_new(struct mbox_save_context, 1);
ctx->ctx.transaction = t;
ctx->mbox = mbox;
- ctx->trans = mt->ictx.trans;
+ ctx->trans = t->itrans;
ctx->append_offset = (uoff_t)-1;
ctx->headers = str_new(default_pool, 512);
ctx->mail_offset = (uoff_t)-1;
struct mailbox *box;
enum mailbox_transaction_flags flags;
+ struct mail_index_transaction *itrans;
+ /* view contains all changes done within this transaction */
+ struct mail_index_view *view;
+
struct mail_transaction_commit_changes *changes;
ARRAY_DEFINE(module_contexts,
union mailbox_transaction_module_context *);
return t;
}
-static void first_nonexpunged_timestamp(struct mailbox_transaction_context *_t,
+static void first_nonexpunged_timestamp(struct mailbox_transaction_context *t,
time_t *stamp_r)
{
- struct index_transaction_context *t =
- (struct index_transaction_context *)_t;
- struct mail_index_view *view = t->trans_view;
+ struct mail_index_view *view = t->view;
const struct mail_index_header *hdr;
struct mail *mail;
uint32_t seq;
- mail = mail_alloc(_t, 0, NULL);
+ mail = mail_alloc(t, 0, NULL);
/* find the first non-expunged mail. we're here because the first
mail was expunged, so don't bother checking it. */