dovecot-1.2: dbox: Allow getting streams to messages being saved.

dovecot at dovecot.org dovecot at dovecot.org
Mon Sep 7 01:32:08 EEST 2009


details:   http://hg.dovecot.org/dovecot-1.2/rev/dc66872f1856
changeset: 9358:dc66872f1856
user:      Timo Sirainen <tss at iki.fi>
date:      Sun Sep 06 18:32:03 2009 -0400
description:
dbox: Allow getting streams to messages being saved.

diffstat:

3 files changed, 38 insertions(+), 4 deletions(-)
src/lib-storage/index/dbox/dbox-mail.c    |   17 +++++++++++++----
src/lib-storage/index/dbox/dbox-save.c    |   21 +++++++++++++++++++++
src/lib-storage/index/dbox/dbox-storage.h |    4 ++++

diffs (78 lines):

diff -r 56e619176787 -r dc66872f1856 src/lib-storage/index/dbox/dbox-mail.c
--- a/src/lib-storage/index/dbox/dbox-mail.c	Sun Sep 06 17:19:00 2009 -0400
+++ b/src/lib-storage/index/dbox/dbox-mail.c	Sun Sep 06 18:32:03 2009 -0400
@@ -47,16 +47,25 @@ static int dbox_mail_lookup(struct dbox_
 			    uoff_t *offset_r, struct dbox_file **file_r)
 {
 	struct dbox_mailbox *mbox = (struct dbox_mailbox *)mail->imail.ibox;
+	struct mail *_mail = &mail->imail.mail.mail;
 	unsigned int file_id;
 
-	if (mail->open_file == NULL) {
-		if (!dbox_file_lookup(mbox, mbox->ibox.view,
-				      mail->imail.mail.mail.seq,
+	if (mail->open_file != NULL) {
+		/* already open */
+	} else if (_mail->uid != 0) {
+		if (!dbox_file_lookup(mbox, mbox->ibox.view, _mail->seq,
 				      &file_id, &mail->offset)) {
-			mail_set_expunged(&mail->imail.mail.mail);
+			mail_set_expunged(_mail);
 			return -1;
 		}
 		mail->open_file = dbox_file_init(mbox, file_id);
+	} 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++;
+
 	}
 
 	*file_r = mail->open_file;
diff -r 56e619176787 -r dc66872f1856 src/lib-storage/index/dbox/dbox-save.c
--- a/src/lib-storage/index/dbox/dbox-save.c	Sun Sep 06 17:19:00 2009 -0400
+++ b/src/lib-storage/index/dbox/dbox-save.c	Sun Sep 06 18:32:03 2009 -0400
@@ -48,6 +48,27 @@ 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_transaction_context *t =
+		(struct dbox_transaction_context *)_t;
+	struct dbox_save_context *ctx = 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);
+
+	*offset_r = mail->append_offset;
+	return mail->file;
+}
+
 static void dbox_save_keywords(struct dbox_save_context *ctx,
 			       struct mail_keywords *keywords)
 {
diff -r 56e619176787 -r dc66872f1856 src/lib-storage/index/dbox/dbox-storage.h
--- a/src/lib-storage/index/dbox/dbox-storage.h	Sun Sep 06 17:19:00 2009 -0400
+++ b/src/lib-storage/index/dbox/dbox-storage.h	Sun Sep 06 18:32:03 2009 -0400
@@ -93,6 +93,10 @@ int dbox_save_finish(struct mail_save_co
 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 dbox_save_context *ctx);
 void dbox_transaction_save_commit_post(struct dbox_save_context *ctx);
 void dbox_transaction_save_rollback(struct dbox_save_context *ctx);


More information about the dovecot-cvs mailing list