From: Timo Sirainen Date: Sun, 6 Sep 2009 22:53:24 +0000 (-0400) Subject: dbox: Allow getting streams to messages being saved. X-Git-Tag: 2.0.alpha1~167 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=0b208fe3c2ff7aa15b2232639db5987ff5f58ce4;p=thirdparty%2Fdovecot%2Fcore.git dbox: Allow getting streams to messages being saved. --HG-- branch : HEAD --- diff --git a/src/lib-storage/index/dbox/dbox-mail.c b/src/lib-storage/index/dbox/dbox-mail.c index ea18908ad7..7851583153 100644 --- a/src/lib-storage/index/dbox/dbox-mail.c +++ b/src/lib-storage/index/dbox/dbox-mail.c @@ -143,12 +143,22 @@ static int dbox_mail_open(struct dbox_mail *mail, return mail_set_aborted(_mail); do { - if (mail->open_file == NULL) { + if (mail->open_file != NULL) { + /* already open */ + } else if (_mail->uid != 0) { if (dbox_mail_lookup(mbox, mbox->ibox.view, _mail->seq, &mail->map_uid) < 0) return -1; if (dbox_mail_open_init(mail) < 0) return -1; + } else { + /* mail is being saved in this transaction */ + mail->open_file = + dbox_save_file_get_file(_mail->transaction, + _mail->seq, + &mail->offset); + mail->open_file->refcount++; + break; } if (!dbox_file_is_open(mail->open_file)) diff --git a/src/lib-storage/index/dbox/dbox-save.c b/src/lib-storage/index/dbox/dbox-save.c index 8d06e7163f..de8ec78b2e 100644 --- a/src/lib-storage/index/dbox/dbox-save.c +++ b/src/lib-storage/index/dbox/dbox-save.c @@ -53,6 +53,30 @@ struct dbox_save_context { unsigned int finished:1; }; +struct dbox_file * +dbox_save_file_get_file(struct mailbox_transaction_context *t, + uint32_t seq, uoff_t *offset_r) +{ + struct dbox_save_context *ctx = (struct dbox_save_context *)t->save_ctx; + const struct dbox_save_mail *mails, *mail; + unsigned int count; + + mails = array_get(&ctx->mails, &count); + i_assert(count > 0); + i_assert(seq >= mails[0].seq); + + mail = &mails[mails[0].seq - seq]; + i_assert(mail->seq == seq); + + if (o_stream_flush(mail->file->output) < 0) { + dbox_file_set_syscall_error(mail->file, "write()"); + ctx->failed = TRUE; + } + + *offset_r = mail->append_offset; + return mail->file; +} + struct mail_save_context * dbox_save_alloc(struct mailbox_transaction_context *t) { @@ -275,6 +299,11 @@ static int dbox_save_finish_write(struct mail_save_context *_ctx) ctx->failed = TRUE; } T_END; + if (o_stream_flush(ctx->cur_output) < 0) { + dbox_file_set_syscall_error(save_mail->file, "write()"); + ctx->failed = TRUE; + } + o_stream_unref(&ctx->cur_output); i_stream_unref(&ctx->input); diff --git a/src/lib-storage/index/dbox/dbox-storage.h b/src/lib-storage/index/dbox/dbox-storage.h index 9da8ee2a8d..33665c1d83 100644 --- a/src/lib-storage/index/dbox/dbox-storage.h +++ b/src/lib-storage/index/dbox/dbox-storage.h @@ -110,6 +110,10 @@ int dbox_save_continue(struct mail_save_context *ctx); int dbox_save_finish(struct mail_save_context *ctx); void dbox_save_cancel(struct mail_save_context *ctx); +struct dbox_file * +dbox_save_file_get_file(struct mailbox_transaction_context *t, + uint32_t seq, uoff_t *offset_r); + int dbox_transaction_save_commit_pre(struct mail_save_context *ctx); void dbox_transaction_save_commit_post(struct mail_save_context *ctx); void dbox_transaction_save_rollback(struct mail_save_context *ctx);