static int index_transaction_index_commit(struct mail_index_transaction *index_trans, struct mail_index_transaction_commit_result *result_r) { struct index_transaction_context *it = MAIL_STORAGE_CONTEXT(index_trans); struct mailbox_transaction_context *t = &it->mailbox_ctx; struct index_mailbox_context *ibox = INDEX_STORAGE_CONTEXT(t->box); int ret = 0; if (t->save_ctx != NULL) { if (ibox->save_commit_pre(t->save_ctx) < 0) { t->save_ctx = NULL; ret = -1; } } i_assert(it->mail_ref_count == 0); if (ret < 0) it->super.rollback(index_trans); else { if (it->super.commit(index_trans, result_r) < 0) { mail_storage_set_index_error(t->box); ret = -1; } } if (t->save_ctx != NULL) ibox->save_commit_post(t->save_ctx, result_r); index_transaction_free(it); return ret; }
static int raw_sync(struct raw_mailbox *mbox) { struct mail_index_sync_ctx *index_sync_ctx; struct mail_index_view *sync_view; struct mail_index_transaction *trans; uint32_t seq, uid_validity = ioloop_time; enum mail_index_sync_flags sync_flags; int ret; i_assert(!mbox->synced); sync_flags = index_storage_get_sync_flags(&mbox->box) | MAIL_INDEX_SYNC_FLAG_FLUSH_DIRTY | MAIL_INDEX_SYNC_FLAG_REQUIRE_CHANGES; ret = mail_index_sync_begin(mbox->box.index, &index_sync_ctx, &sync_view, &trans, sync_flags); if (ret <= 0) { if (ret < 0) mail_storage_set_index_error(&mbox->box); return ret; } /* set our uidvalidity */ mail_index_update_header(trans, offsetof(struct mail_index_header, uid_validity), &uid_validity, sizeof(uid_validity), TRUE); /* add our one and only message */ mail_index_append(trans, 1, &seq); index_mailbox_set_recent_uid(&mbox->box, 1); if (mail_index_sync_commit(&index_sync_ctx) < 0) { mail_storage_set_index_error(&mbox->box); return -1; } mbox->synced = TRUE; return 0; }