]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
multi-dbox: Added save date to dbox index records so it won't be shared across mailboxes.
authorTimo Sirainen <tss@iki.fi>
Thu, 21 May 2009 02:59:41 +0000 (22:59 -0400)
committerTimo Sirainen <tss@iki.fi>
Thu, 21 May 2009 02:59:41 +0000 (22:59 -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-rebuild.c
src/lib-storage/index/dbox/dbox-storage.h

index 2bb996973274eecb936409552e2b30c861e92ee0..ead161277a703fb9592f711f81e82fc05255e46e 100644 (file)
@@ -217,6 +217,24 @@ static int dbox_mail_get_received_date(struct mail *_mail, time_t *date_r)
        return 0;
 }
 
+static bool multi_dbox_get_save_date(struct mail *mail, time_t *date_r)
+{
+       struct dbox_mailbox *mbox =
+               (struct dbox_mailbox *)mail->transaction->box;
+       const struct dbox_mail_index_record *dbox_rec;
+       const void *data;
+       bool expunged;
+
+       mail_index_lookup_ext(mbox->ibox.view, mail->seq,
+                             mbox->dbox_ext_id, &data, &expunged);
+       dbox_rec = data;
+       if (dbox_rec == NULL || dbox_rec->map_uid == 0)
+               return FALSE;
+
+       *date_r = dbox_rec->save_date;
+       return TRUE;
+}
+
 static int dbox_mail_get_save_date(struct mail *_mail, time_t *date_r)
 {
        struct dbox_mail *mail = (struct dbox_mail *)_mail;
@@ -225,7 +243,10 @@ static int dbox_mail_get_save_date(struct mail *_mail, time_t *date_r)
        struct stat st;
        const char *value;
 
-       if (index_mail_get_save_date(_mail, date_r) == 0)
+       if (multi_dbox_get_save_date(_mail, date_r))
+               return 0;
+
+       if (index_mail_get_save_date(_mail, date_r) == 0)
                return 0;
 
        if (dbox_mail_metadata_read(mail, &file) < 0)
index 49ecafd5b9fe27e3bea029e25893022aa6549d2c..f780377190879e88ef050d939dadcb1139c20bdc 100644 (file)
@@ -395,6 +395,7 @@ int dbox_transaction_save_commit_pre(struct dbox_save_context *ctx)
                dbox_add_missing_map_uidvalidity(ctx);
 
                memset(&rec, 0, sizeof(rec));
+               rec.save_date = ioloop_time;
                mails = array_get(&ctx->mails, &count);
                for (i = 0; i < count; i++) {
                        if (mails[i].file->single_mbox != NULL)
@@ -487,6 +488,7 @@ int dbox_copy(struct mail_save_context *_ctx, struct mail *mail)
        src_mbox = (struct dbox_mailbox *)mail->box;
 
        memset(&rec, 0, sizeof(rec));
+       rec.save_date = ioloop_time;
        if (dbox_mail_lookup(src_mbox, src_mbox->ibox.view, mail->seq,
                             &rec.map_uid) < 0)
                return -1;
index a64d78b8e81c4ea9ac5a0f4689e10d1404ade387..2e6c13e93160a4df397382627dec2ffee71b8c25 100644 (file)
@@ -2,6 +2,7 @@
 
 #include "lib.h"
 #include "array.h"
+#include "ioloop.h"
 #include "istream.h"
 #include "hash.h"
 #include "hex-binary.h"
@@ -561,6 +562,7 @@ static int rebuild_restore_msg(struct dbox_storage_rebuild_context *ctx,
        /* add the new message */
        memset(&dbox_rec, 0, sizeof(dbox_rec));
        dbox_rec.map_uid = msg->map_uid;
+       dbox_rec.save_date = ioloop_time;
        mail_index_append(ctx->prev_msg.trans, ctx->prev_msg.next_uid++, &seq);
        mail_index_update_ext(ctx->prev_msg.trans, seq, mbox->dbox_ext_id,
                              &dbox_rec, NULL);
index c3c45edb8336a978bde5cd30dae51d78c22b877e..3b3a9707b88fff15eac1d983806ef6700c4ccfdc 100644 (file)
@@ -58,6 +58,9 @@ struct dbox_storage {
 
 struct dbox_mail_index_record {
        uint32_t map_uid;
+       /* UNIX timestamp of when the message was saved/copied to this
+          mailbox */
+       uint32_t save_date;
 };
 
 struct dbox_mailbox {