]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
mailbox_update(): Update index also.
authorTimo Sirainen <tss@iki.fi>
Thu, 6 Aug 2009 00:09:24 +0000 (20:09 -0400)
committerTimo Sirainen <tss@iki.fi>
Thu, 6 Aug 2009 00:09:24 +0000 (20:09 -0400)
--HG--
branch : HEAD

src/lib-storage/index/cydir/cydir-storage.c
src/lib-storage/index/dbox/dbox-storage.c
src/lib-storage/index/index-storage.c
src/lib-storage/index/index-storage.h
src/lib-storage/index/maildir/maildir-storage.c

index c5e8d0e58ca9f3f6315d545c0fb954a69bd78349..c9abc8923d7c0d207cb84f80a12cdd516a9a54de 100644 (file)
@@ -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,
index 9323b0131e9a79bde60a706ab4282726e93baa5a..25457650e1e863c43786c99fb4eb282debf83553 100644 (file)
@@ -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);
index 546918d422fedee653b01693ce0b4c9446b1db3b..ff205fac5dc4157db8e401f451bf8e327abadd45 100644 (file)
@@ -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;
index c1c87eb79eefea0f11d5ddd9d57b5448d074134e..54b23eeba98dabd2be31fb6ec9492fc39290b61d 100644 (file)
@@ -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);
index 24b6bdc4bc5d9b035b32d6a67516dfb370b52c5a..ecab2ebd13402905b9773e2389806e1e276d30ec 100644 (file)
@@ -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;
 }