]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
dbox: Allow getting streams to messages being saved.
authorTimo Sirainen <tss@iki.fi>
Sun, 6 Sep 2009 22:53:24 +0000 (18:53 -0400)
committerTimo Sirainen <tss@iki.fi>
Sun, 6 Sep 2009 22:53:24 +0000 (18:53 -0400)
--HG--
branch : HEAD

src/lib-storage/index/dbox/dbox-mail.c
src/lib-storage/index/dbox/dbox-save.c
src/lib-storage/index/dbox/dbox-storage.h

index ea18908ad7a4fe51b3326d84c880b93da51ca668..7851583153042e9f3928be3fbad23f7d55582c4b 100644 (file)
@@ -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))
index 8d06e7163faf595eb9f8872510d52e1049bee6c0..de8ec78b2ea55b0191e02e2ce87a0fe42f5440ee 100644 (file)
@@ -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);
 
index 9da8ee2a8d75e2b0405ae164d69f7dae63e644c8..33665c1d83e6472d2473dc9be04820e3e00bc0ed 100644 (file)
@@ -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);