From 9ffdc9d18870acef2e4dde99715d8528ff4b080d Mon Sep 17 00:00:00 2001 From: Timo Sirainen Date: Wed, 5 Aug 2009 20:09:24 -0400 Subject: [PATCH] mailbox_update(): Update index also. --HG-- branch : HEAD --- src/lib-storage/index/cydir/cydir-storage.c | 25 +--------- src/lib-storage/index/dbox/dbox-storage.c | 7 +++ src/lib-storage/index/index-storage.c | 49 +++++++++++++++++++ src/lib-storage/index/index-storage.h | 2 + .../index/maildir/maildir-storage.c | 4 +- 5 files changed, 62 insertions(+), 25 deletions(-) diff --git a/src/lib-storage/index/cydir/cydir-storage.c b/src/lib-storage/index/cydir/cydir-storage.c index c5e8d0e58c..c9abc8923d 100644 --- a/src/lib-storage/index/cydir/cydir-storage.c +++ b/src/lib-storage/index/cydir/cydir-storage.c @@ -132,27 +132,6 @@ static int cydir_mailbox_open(struct mailbox *box) return index_storage_mailbox_open(box); } -static int -cydir_mailbox_update(struct mailbox *box, const struct mailbox_update *update) -{ - struct cydir_mailbox *mbox = (struct cydir_mailbox *)box; - struct mail_index_transaction *trans; - - trans = mail_index_transaction_begin(mbox->ibox.view, 0); - if (update->uid_validity != 0) { - mail_index_update_header(trans, - offsetof(struct mail_index_header, uid_validity), - &update->uid_validity, sizeof(update->uid_validity), - TRUE); - } - /* FIXME: update next_uid, highestmodseq. guid is also missing.. */ - if (mail_index_transaction_commit(&trans) < 0) { - mail_storage_set_internal_error(box->storage); - return -1; - } - return 0; -} - static int cydir_mailbox_create(struct mailbox *box, const struct mailbox_update *update, bool directory) @@ -172,7 +151,7 @@ cydir_mailbox_create(struct mailbox *box, const struct mailbox_update *update, return -1; return directory || update == NULL ? 0 : - cydir_mailbox_update(box, update); + index_storage_mailbox_update(box, update); } static int @@ -379,7 +358,7 @@ struct mailbox cydir_mailbox = { cydir_mailbox_open, index_storage_mailbox_close, cydir_mailbox_create, - cydir_mailbox_update, + index_storage_mailbox_update, index_storage_get_status, NULL, NULL, diff --git a/src/lib-storage/index/dbox/dbox-storage.c b/src/lib-storage/index/dbox/dbox-storage.c index 9323b0131e..25457650e1 100644 --- a/src/lib-storage/index/dbox/dbox-storage.c +++ b/src/lib-storage/index/dbox/dbox-storage.c @@ -11,6 +11,7 @@ #include "unlink-old-files.h" #include "index-mail.h" #include "mail-copy.h" +#include "mail-index-modseq.h" #include "mailbox-uidvalidity.h" #include "maildir/maildir-uidlist.h" #include "dbox-map.h" @@ -275,6 +276,12 @@ static int dbox_write_index_header(struct mailbox *box, offsetof(struct mail_index_header, next_uid), &uid_next, sizeof(uid_next), TRUE); } + if (update != NULL && update->min_highest_modseq != 0 && + mail_index_modseq_get_highest(mbox->ibox.view) < + update->min_highest_modseq) { + mail_index_update_highest_modseq(trans, + update->min_highest_modseq); + } if (mail_index_transaction_commit(&trans) < 0) { mail_storage_set_internal_error(box->storage); diff --git a/src/lib-storage/index/index-storage.c b/src/lib-storage/index/index-storage.c index 546918d422..ff205fac5d 100644 --- a/src/lib-storage/index/index-storage.c +++ b/src/lib-storage/index/index-storage.c @@ -536,6 +536,55 @@ void index_storage_mailbox_close(struct mailbox *box) pool_unref(&box->pool); } +int index_storage_mailbox_update(struct mailbox *box, + const struct mailbox_update *update) +{ + struct index_mailbox *ibox = (struct index_mailbox *)box; + const struct mail_index_header *hdr; + struct mail_index_view *view; + struct mail_index_transaction *trans; + int ret; + + if (!box->opened) { + if (mailbox_open(box) < 0) + return -1; + } + + /* make sure we get the latest index info */ + (void)mail_index_refresh(ibox->index); + view = mail_index_view_open(ibox->index); + hdr = mail_index_get_header(view); + + trans = mail_index_transaction_begin(view, + MAIL_INDEX_TRANSACTION_FLAG_EXTERNAL); + if (update->uid_validity != 0 && + hdr->uid_validity != update->uid_validity) { + uint32_t uid_validity = update->uid_validity; + + mail_index_update_header(trans, + offsetof(struct mail_index_header, uid_validity), + &uid_validity, sizeof(uid_validity), TRUE); + } + if (update->min_next_uid != 0 && + hdr->next_uid < update->min_next_uid) { + uint32_t next_uid = update->min_next_uid; + + mail_index_update_header(trans, + offsetof(struct mail_index_header, next_uid), + &next_uid, sizeof(next_uid), FALSE); + } + if (update->min_highest_modseq != 0 && + mail_index_modseq_get_highest(view) < update->min_highest_modseq) { + mail_index_update_highest_modseq(trans, + update->min_highest_modseq); + } + + if ((ret = mail_index_transaction_commit(&trans)) < 0) + mail_storage_set_internal_error(box->storage); + mail_index_view_close(&view); + return ret; +} + bool index_storage_is_readonly(struct mailbox *box) { struct index_mailbox *ibox = (struct index_mailbox *) box; diff --git a/src/lib-storage/index/index-storage.h b/src/lib-storage/index/index-storage.h index c1c87eb79e..54b23eeba9 100644 --- a/src/lib-storage/index/index-storage.h +++ b/src/lib-storage/index/index-storage.h @@ -85,6 +85,8 @@ int index_storage_mailbox_open(struct mailbox *box); int index_storage_mailbox_enable(struct mailbox *box, enum mailbox_feature feature); void index_storage_mailbox_close(struct mailbox *box); +int index_storage_mailbox_update(struct mailbox *box, + const struct mailbox_update *update); bool index_storage_is_readonly(struct mailbox *box); bool index_storage_allow_new_keywords(struct mailbox *box); diff --git a/src/lib-storage/index/maildir/maildir-storage.c b/src/lib-storage/index/maildir/maildir-storage.c index 24b6bdc4bc..ecab2ebd13 100644 --- a/src/lib-storage/index/maildir/maildir-storage.c +++ b/src/lib-storage/index/maildir/maildir-storage.c @@ -515,9 +515,9 @@ maildir_mailbox_update(struct mailbox *box, const struct mailbox_update *update) maildir_uidlist_set_next_uid(uidlist, update->min_next_uid, FALSE); } - /* FIXME: update highestmodseq */ - ret = maildir_uidlist_update(uidlist); + if (ret == 0) + ret = index_storage_mailbox_update(box, update); maildir_uidlist_unlock(uidlist); return ret; } -- 2.47.3