From: Timo Sirainen Date: Thu, 21 May 2009 02:59:41 +0000 (-0400) Subject: multi-dbox: Added save date to dbox index records so it won't be shared across mailboxes. X-Git-Tag: 2.0.alpha1~713 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=9e9f6b22fcc8c4d32be33b87172a02aca0b1181c;p=thirdparty%2Fdovecot%2Fcore.git multi-dbox: Added save date to dbox index records so it won't be shared across mailboxes. --HG-- branch : HEAD --- diff --git a/src/lib-storage/index/dbox/dbox-mail.c b/src/lib-storage/index/dbox/dbox-mail.c index 2bb9969732..ead161277a 100644 --- a/src/lib-storage/index/dbox/dbox-mail.c +++ b/src/lib-storage/index/dbox/dbox-mail.c @@ -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) diff --git a/src/lib-storage/index/dbox/dbox-save.c b/src/lib-storage/index/dbox/dbox-save.c index 49ecafd5b9..f780377190 100644 --- a/src/lib-storage/index/dbox/dbox-save.c +++ b/src/lib-storage/index/dbox/dbox-save.c @@ -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; diff --git a/src/lib-storage/index/dbox/dbox-storage-rebuild.c b/src/lib-storage/index/dbox/dbox-storage-rebuild.c index a64d78b8e8..2e6c13e931 100644 --- a/src/lib-storage/index/dbox/dbox-storage-rebuild.c +++ b/src/lib-storage/index/dbox/dbox-storage-rebuild.c @@ -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); diff --git a/src/lib-storage/index/dbox/dbox-storage.h b/src/lib-storage/index/dbox/dbox-storage.h index c3c45edb83..3b3a9707b8 100644 --- a/src/lib-storage/index/dbox/dbox-storage.h +++ b/src/lib-storage/index/dbox/dbox-storage.h @@ -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 {