From: Timo Sirainen Date: Wed, 18 Mar 2009 19:22:59 +0000 (-0400) Subject: dbox: When saving a message, put the original mailbox name to metadata. X-Git-Tag: 2.0.alpha1~1038^2~42 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=dee5d532f0bb40acf55e17b617700762ff421cb0;p=thirdparty%2Fdovecot%2Fcore.git dbox: When saving a message, put the original mailbox name to metadata. --HG-- branch : HEAD --- diff --git a/src/lib-storage/index/dbox/dbox-file-maildir.c b/src/lib-storage/index/dbox/dbox-file-maildir.c index 2a3be03d06..2e7fc28075 100644 --- a/src/lib-storage/index/dbox/dbox-file-maildir.c +++ b/src/lib-storage/index/dbox/dbox-file-maildir.c @@ -68,6 +68,7 @@ const char *dbox_file_maildir_metadata_get(struct dbox_file *file, value = t_strdup_until(file->fname, p); } break; + case DBOX_METADATA_ORIG_MAILBOX: case DBOX_METADATA_OLDV1_EXPUNGED: case DBOX_METADATA_OLDV1_FLAGS: case DBOX_METADATA_OLDV1_KEYWORDS: diff --git a/src/lib-storage/index/dbox/dbox-file.h b/src/lib-storage/index/dbox/dbox-file.h index 67e35a66ae..6d5c0486a1 100644 --- a/src/lib-storage/index/dbox/dbox-file.h +++ b/src/lib-storage/index/dbox/dbox-file.h @@ -46,6 +46,10 @@ enum dbox_metadata_key { /* Pointer to external message data. Format is: 1*( ) */ DBOX_METADATA_EXT_REF = 'X', + /* Mailbox name where this message was originally saved to. + When rebuild finds a message whose mailbox is unknown, it's + placed to this mailbox. */ + DBOX_METADATA_ORIG_MAILBOX = 'B', /* metadata used by old Dovecot versions */ DBOX_METADATA_OLDV1_EXPUNGED = 'E', diff --git a/src/lib-storage/index/dbox/dbox-save.c b/src/lib-storage/index/dbox/dbox-save.c index 41680a2744..f0d63630c7 100644 --- a/src/lib-storage/index/dbox/dbox-save.c +++ b/src/lib-storage/index/dbox/dbox-save.c @@ -210,6 +210,15 @@ static void dbox_save_write_metadata(struct dbox_save_context *ctx) guid_128, NULL); } str_printfa(str, "%c%s\n", DBOX_METADATA_GUID, guid); + if (ctx->cur_file->single_mbox == NULL && + strchr(ctx->mbox->ibox.box.name, '\r') == NULL && + strchr(ctx->mbox->ibox.box.name, '\n') == NULL) { + /* multi-file: save the original mailbox name so if mailbox + indexes get corrupted we can place at least some + (hopefully most) of the messages to correct mailboxes. */ + str_printfa(str, "%c%s\n", DBOX_METADATA_ORIG_MAILBOX, + ctx->mbox->ibox.box.name); + } str_append_c(str, '\n'); o_stream_send(ctx->cur_output, str_data(str), str_len(str));