]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
dbox: When saving a message, put the original mailbox name to metadata.
authorTimo Sirainen <tss@iki.fi>
Wed, 18 Mar 2009 19:22:59 +0000 (15:22 -0400)
committerTimo Sirainen <tss@iki.fi>
Wed, 18 Mar 2009 19:22:59 +0000 (15:22 -0400)
--HG--
branch : HEAD

src/lib-storage/index/dbox/dbox-file-maildir.c
src/lib-storage/index/dbox/dbox-file.h
src/lib-storage/index/dbox/dbox-save.c

index 2a3be03d06910c3512f18c8a0246df3880b914ae..2e7fc280758b6b51481c77730ef2c368f5afe2af 100644 (file)
@@ -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:
index 67e35a66ae9d41b41dec860ce42841e8ffa693dd..6d5c0486a1f88be6d4a1d16df5b4f9637ff9423b 100644 (file)
@@ -46,6 +46,10 @@ enum dbox_metadata_key {
        /* Pointer to external message data. Format is:
           1*(<start offset> <byte count> <ref>) */
        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',
index 41680a27442d886cc9b238386dee99dd3ed6556c..f0d63630c75685b9ac8d5a1f619ce47817cd679f 100644 (file)
@@ -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));