sdbox-save.c revision 9a02317c852face76737763fa6ec43b444688de5
02c335c23bf5fa225a467c19f2c063fb0dc7b8c3Timo Sirainen/* Copyright (c) 2007-2009 Dovecot authors, see the included COPYING file */
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainensdbox_save_file_get_file(struct mailbox_transaction_context *t, uint32_t seq)
a0c453a8edaec90fb0d945c874de0b1845bc7d7eTimo Sirainen unsigned int count;
421d30619384e72a27e2a5d13ff6525aff4d17feTimo Sirainensdbox_save_alloc(struct mailbox_transaction_context *t)
0dffa25d211be541ee3c953b23566a1a990789dfTimo Sirainen struct sdbox_mailbox *mbox = (struct sdbox_mailbox *)t->box;
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen i_assert((t->flags & MAILBOX_TRANSACTION_FLAG_EXTERNAL) != 0);
421d30619384e72a27e2a5d13ff6525aff4d17feTimo Sirainen /* use the existing allocated structure */
421d30619384e72a27e2a5d13ff6525aff4d17feTimo Sirainenint sdbox_save_begin(struct mail_save_context *_ctx, struct istream *input)
e7f8009c974ed6a6a5a0e88633d98fff2867fa92Timo Sirainen struct sdbox_save_context *ctx = (struct sdbox_save_context *)_ctx;
421d30619384e72a27e2a5d13ff6525aff4d17feTimo Sirainen ctx->append_ctx = dbox_file_append_init(file);
421d30619384e72a27e2a5d13ff6525aff4d17feTimo Sirainen ret = dbox_file_get_append_stream(ctx->append_ctx,
421d30619384e72a27e2a5d13ff6525aff4d17feTimo Sirainenstatic int dbox_save_mail_write_metadata(struct dbox_save_context *ctx,
421d30619384e72a27e2a5d13ff6525aff4d17feTimo Sirainen i_assert(file->msg_header_size == sizeof(dbox_msg_hdr));
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen file->msg_header_size - file->file_header_size;
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen dbox_save_write_metadata(&ctx->ctx, ctx->cur_output, NULL, guid_128);
0fd246126fece57712566c725d6353f255f5fcfaTimo Sirainen dbox_msg_header_fill(&dbox_msg_hdr, message_size);
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen if (o_stream_pwrite(ctx->cur_output, &dbox_msg_hdr,
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen dbox_file_set_syscall_error(file, "pwrite()");
bc93929cdd9000ca560a5f42a27f50ab307f1efbTimo Sirainenstatic int dbox_save_finish_write(struct mail_save_context *_ctx)
1537d20b852cbbf0d6971790b84e0cce5ca61307Timo Sirainen struct sdbox_save_context *ctx = (struct sdbox_save_context *)_ctx;
1537d20b852cbbf0d6971790b84e0cce5ca61307Timo Sirainen index_mail_cache_parse_deinit(_ctx->dest_mail,
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen files = array_idx_modifiable(&ctx->files, array_count(&ctx->files) - 1);
d54ab8987e482a8df250615b44f41fa040c38741Timo Sirainen if (dbox_save_mail_write_metadata(&ctx->ctx, *files) < 0)
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen else if (dbox_file_append_commit(&ctx->append_ctx) < 0)
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainenint sdbox_save_finish(struct mail_save_context *ctx)
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainenvoid sdbox_save_cancel(struct mail_save_context *_ctx)
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen struct dbox_save_context *ctx = (struct dbox_save_context *)_ctx;
a693adf01b5f9256b273bee0b38efb69bc2b0182Timo Sirainenstatic int dbox_save_assign_uids(struct sdbox_save_context *ctx,
a693adf01b5f9256b273bee0b38efb69bc2b0182Timo Sirainen unsigned int i, count, n = 0;
a693adf01b5f9256b273bee0b38efb69bc2b0182Timo Sirainen for (i = 0; i < count; i++) {
a693adf01b5f9256b273bee0b38efb69bc2b0182Timo Sirainen struct sdbox_file *sfile = (struct sdbox_file *)files[i];
a693adf01b5f9256b273bee0b38efb69bc2b0182Timo Sirainen ret = seq_range_array_iter_nth(&iter, n++, &uid);
eef4ba0cc3e78f8c26804c1c9251a76580a41f0cTimo Sirainen i_assert(!seq_range_array_iter_nth(&iter, n, &uid));
88dc563319efecd6e68bad16b0d92672da05584aTimo Sirainenstatic void dbox_save_unref_files(struct sdbox_save_context *ctx)
88dc563319efecd6e68bad16b0d92672da05584aTimo Sirainen struct mail_storage *storage = &ctx->mbox->storage->storage.storage;
88dc563319efecd6e68bad16b0d92672da05584aTimo Sirainen unsigned int i, count;
eef4ba0cc3e78f8c26804c1c9251a76580a41f0cTimo Sirainen files = array_get_modifiable(&ctx->files, &count);
88dc563319efecd6e68bad16b0d92672da05584aTimo Sirainen for (i = 0; i < count; i++) {
88dc563319efecd6e68bad16b0d92672da05584aTimo Sirainen "unlink(%s) failed: %m",
71748cca1bacd74451fd228db5536828bdfeb190Baofeng Wangint sdbox_transaction_save_commit_pre(struct mail_save_context *_ctx)
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen struct sdbox_save_context *ctx = (struct sdbox_save_context *)_ctx;
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen struct mailbox_transaction_context *_t = _ctx->transaction;
71748cca1bacd74451fd228db5536828bdfeb190Baofeng Wang if (sdbox_sync_begin(ctx->mbox, SDBOX_SYNC_FLAG_FORCE |
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen /* assign UIDs for new messages */
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen hdr = mail_index_get_header(ctx->sync_ctx->sync_view);
8d587838c414c48a331f0b54cd7ffd97e5024abdTimo Sirainen mail_index_append_finish_uids(ctx->ctx.trans, hdr->next_uid,
0211537cbf53ad17348408103fdb0c06de56ed5eTimo Sirainen if (dbox_save_assign_uids(ctx, &_t->changes->saved_uids) < 0) {
88dc563319efecd6e68bad16b0d92672da05584aTimo Sirainen _t->changes->uid_validity = hdr->uid_validity;
6f368f8571092c5ad94357752cfea34f69ef66d7Timo Sirainenvoid sdbox_transaction_save_commit_post(struct mail_save_context *_ctx)
6f368f8571092c5ad94357752cfea34f69ef66d7Timo Sirainen struct sdbox_save_context *ctx = (struct sdbox_save_context *)_ctx;
6f368f8571092c5ad94357752cfea34f69ef66d7Timo Sirainen _ctx->transaction = NULL; /* transaction is already freed */
6f368f8571092c5ad94357752cfea34f69ef66d7Timo Sirainen if (sdbox_sync_finish(&ctx->sync_ctx, TRUE) < 0)
6f368f8571092c5ad94357752cfea34f69ef66d7Timo Sirainen if (!ctx->mbox->storage->storage.storage.set->fsync_disable) {
6f368f8571092c5ad94357752cfea34f69ef66d7Timo Sirainen if (fdatasync_path(ctx->mbox->ibox.box.path) < 0) {
64b61cd24d630223478ccbe1934b9f60f0881f59Timo Sirainenvoid sdbox_transaction_save_rollback(struct mail_save_context *_ctx)
64b61cd24d630223478ccbe1934b9f60f0881f59Timo Sirainen struct sdbox_save_context *ctx = (struct sdbox_save_context *)_ctx;
04f70d9dc154761eb262f485415f27ed0345ece4Timo Sirainen (void)sdbox_sync_finish(&ctx->sync_ctx, FALSE);
6f368f8571092c5ad94357752cfea34f69ef66d7Timo Sirainenint sdbox_copy(struct mail_save_context *_ctx, struct mail *mail)
6f368f8571092c5ad94357752cfea34f69ef66d7Timo Sirainen struct dbox_save_context *ctx = (struct dbox_save_context *)_ctx;
6f368f8571092c5ad94357752cfea34f69ef66d7Timo Sirainen /* FIXME: use hard linking */