]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
lib-storage: Moved box->private_flags_mask to mailbox_get_private_flags_mask()
authorTimo Sirainen <tss@iki.fi>
Mon, 6 Dec 2010 01:11:07 +0000 (01:11 +0000)
committerTimo Sirainen <tss@iki.fi>
Mon, 6 Dec 2010 01:11:07 +0000 (01:11 +0000)
This allows getting it lazily only when it's actually needed.

15 files changed:
src/lib-storage/index/cydir/cydir-storage.c
src/lib-storage/index/dbox-multi/mdbox-storage.c
src/lib-storage/index/dbox-single/sdbox-storage.c
src/lib-storage/index/index-storage.c
src/lib-storage/index/maildir/maildir-storage.c
src/lib-storage/index/maildir/maildir-storage.h
src/lib-storage/index/maildir/maildir-sync-index.c
src/lib-storage/index/mbox/mbox-storage.c
src/lib-storage/index/raw/raw-storage.c
src/lib-storage/mail-storage-private.h
src/lib-storage/mail-storage.c
src/lib-storage/mail-storage.h
src/lib-storage/test-mailbox.c
src/plugins/acl/acl-mailbox.c
src/plugins/virtual/virtual-storage.c

index 674107e6760a2594c061321f5b5c1e93473d1368..d1bf328d439fa652797e58405522efb3c91c847a 100644 (file)
@@ -167,6 +167,7 @@ struct mailbox cydir_mailbox = {
                NULL,
                NULL,
                NULL,
+               NULL,
                index_mail_alloc,
                index_header_lookup_init,
                index_header_lookup_deinit,
index b69eac3665c23d2db7e3a04ee3819cf7881e8e32..be4fdb84d9b45134e5e248bc7ed0ab46b4c66b1e 100644 (file)
@@ -426,6 +426,7 @@ struct mailbox mdbox_mailbox = {
                NULL,
                NULL,
                NULL,
+               NULL,
                dbox_mail_alloc,
                index_header_lookup_init,
                index_header_lookup_deinit,
index b15816b43c36322773851a16ab47676d81719189..9b0b76027e1734b0ab7eaf9f9652f92f9b5d3ab4 100644 (file)
@@ -393,6 +393,7 @@ struct mailbox sdbox_mailbox = {
                NULL,
                NULL,
                NULL,
+               NULL,
                dbox_mail_alloc,
                index_header_lookup_init,
                index_header_lookup_deinit,
index 0c9335eb79fb07611f5551764c47243b8a8b576e..9353901c3e8f4c3c831d263510b0ddf09a6d3139 100644 (file)
@@ -482,7 +482,7 @@ bool index_storage_is_readonly(struct mailbox *box)
        if (box->backend_readonly) {
                /* return read-only only if there are no private flags
                   (that are stored in index files) */
-               if (box->private_flags_mask == 0)
+               if (mailbox_get_private_flags_mask(box) == 0)
                        return TRUE;
        }
        return FALSE;
index 9d9d7f23e4d6e80d5088ab378554a17b7fadb544..de4e00bf45333e252fb0d8e10e3aabbff0231344 100644 (file)
@@ -292,16 +292,11 @@ maildir_mailbox_alloc(struct mail_storage *storage, struct mailbox_list *list,
 static int maildir_mailbox_open_existing(struct mailbox *box)
 {
        struct maildir_mailbox *mbox = (struct maildir_mailbox *)box;
-       const char *shared_path, *box_path = mailbox_get_path(box);
-       struct stat st;
+       const char *box_path = mailbox_get_path(box);
 
        mbox->uidlist = maildir_uidlist_init(mbox);
        mbox->keywords = maildir_keywords_init(mbox);
 
-       shared_path = t_strconcat(box_path, "/dovecot-shared", NULL);
-       if (stat(shared_path, &st) == 0)
-               box->private_flags_mask = MAIL_SEEN;
-
        if ((box->flags & MAILBOX_FLAG_KEEP_LOCKED) != 0) {
                if (maildir_uidlist_lock(mbox->uidlist) <= 0)
                        return -1;
@@ -578,6 +573,22 @@ uint32_t maildir_get_uidvalidity_next(struct mailbox_list *list)
        return mailbox_uidvalidity_next(list, path);
 }
 
+static enum mail_flags maildir_get_private_flags_mask(struct mailbox *box)
+{
+       struct maildir_mailbox *mbox = (struct maildir_mailbox *)box;
+       const char *path;
+       struct stat st;
+
+       if (!mbox->private_flags_mask_set) {
+               path = t_strconcat(mailbox_get_path(box), "/dovecot-shared", NULL);
+               if (stat(path, &st) < 0)
+                       mbox->_private_flags_mask = 0;
+               else
+                       mbox->_private_flags_mask = MAIL_SEEN;
+       }
+       return mbox->_private_flags_mask;
+}
+
 struct mail_storage maildir_storage = {
        .name = MAILDIR_STORAGE_NAME,
        .class_flags = 0,
@@ -631,6 +642,7 @@ struct mailbox maildir_mailbox = {
                NULL,
                NULL,
                NULL,
+               maildir_get_private_flags_mask,
                index_mail_alloc,
                index_header_lookup_init,
                index_header_lookup_deinit,
index 8562eec994a58d637acd88396de89a25a22c5f4c..b0b2fb63275b55afdde436d700b9942cff6b30e6 100644 (file)
@@ -78,6 +78,9 @@ struct maildir_mailbox {
 
        struct timeout *keep_lock_to;
 
+       /* Filled lazily by mailbox_get_private_flags_mask() */
+       enum mail_flags _private_flags_mask;
+
        /* maildir sync: */
        struct maildir_uidlist *uidlist;
        struct maildir_keywords *keywords;
@@ -87,6 +90,7 @@ struct maildir_mailbox {
 
        unsigned int synced:1;
        unsigned int syncing_commit:1;
+       unsigned int private_flags_mask_set:1;
 };
 
 extern struct mail_vfuncs maildir_mail_vfuncs;
index c9deab905739792ac291ac915bcccee27ee298e3..9d0b8eff945750b66f4d24c2563fbb025169c9e8 100644 (file)
@@ -467,6 +467,7 @@ int maildir_sync_index(struct maildir_index_sync_context *ctx,
        int ret = 0;
        time_t time_before_sync;
        uint8_t expunged_guid_128[MAIL_GUID_128_SIZE];
+       enum mail_flags private_flags_mask;
        bool expunged, full_rescan = FALSE;
 
        i_assert(!mbox->syncing_commit);
@@ -492,6 +493,7 @@ int maildir_sync_index(struct maildir_index_sync_context *ctx,
        }
        hdr_next_uid = hdr->next_uid;
 
+       private_flags_mask = mailbox_get_private_flags_mask(&mbox->box);
        time_before_sync = time(NULL);
        mbox->syncing_commit = TRUE;
        seq = prev_uid = 0; first_recent_uid = I_MAX(hdr->first_recent_uid, 1);
@@ -507,7 +509,7 @@ int maildir_sync_index(struct maildir_index_sync_context *ctx,
 
                /* the private flags are kept only in indexes. don't use them
                   at all even for newly seen mails */
-               ctx->flags &= ~mbox->box.private_flags_mask;
+               ctx->flags &= ~private_flags_mask;
 
        again:
                seq++;
@@ -582,7 +584,7 @@ int maildir_sync_index(struct maildir_index_sync_context *ctx,
                }
 
                /* the private flags are stored only in indexes, keep them */
-               ctx->flags |= rec->flags & mbox->box.private_flags_mask;
+               ctx->flags |= rec->flags & private_flags_mask;
 
                if (index_sync_changes_have(ctx->sync_changes)) {
                        /* apply flag changes to maildir */
index 52a60504ebe75be66252c51905f43ac305218f29..1ea3c843107036af41193116c2b1ad4cc87f930f 100644 (file)
@@ -750,6 +750,7 @@ struct mailbox mbox_mailbox = {
                NULL,
                NULL,
                NULL,
+               NULL,
                index_mail_alloc,
                index_header_lookup_init,
                index_header_lookup_deinit,
index 3d03728d96432c4a8828e684d5e50e0165a50104..367bc4f044c057b0c4de5daa3d4b84114dc0b89a 100644 (file)
@@ -167,6 +167,7 @@ struct mailbox raw_mailbox = {
                NULL,
                NULL,
                NULL,
+               NULL,
                index_mail_alloc,
                index_header_lookup_init,
                index_header_lookup_deinit,
index db4d515bc7d7c81471ffc9dd74e636b3b48d389f..60b3b2a2ea37ee15fbff1dabdbcabff133bdeea9 100644 (file)
@@ -184,6 +184,7 @@ struct mailbox_vfuncs {
        void (*get_virtual_box_patterns)(struct mailbox *box,
                                ARRAY_TYPE(mailbox_virtual_patterns) *includes,
                                ARRAY_TYPE(mailbox_virtual_patterns) *excludes);
+       enum mail_flags (*get_private_flags_mask)(struct mailbox *box);
 
        struct mail *
                (*mail_alloc)(struct mailbox_transaction_context *t,
@@ -263,9 +264,6 @@ struct mailbox {
        unsigned int transaction_count;
        enum mailbox_feature enabled_features;
 
-       /* User's private flags if this is a shared mailbox */
-       enum mail_flags private_flags_mask;
-
        /* Mailbox notification settings: */
        unsigned int notify_min_interval;
        mailbox_notify_callback_t *notify_callback;
index aaa141e149dcca5081eae8b8d40653a6ef961a4a..51ec53f0046e779ca7dfcd275a28dd9ef676048b 100644 (file)
@@ -930,6 +930,14 @@ int mailbox_get_guid(struct mailbox *box, uint8_t guid[MAIL_GUID_128_SIZE])
        return 0;
 }
 
+enum mail_flags mailbox_get_private_flags_mask(struct mailbox *box)
+{
+       if (box->v.get_private_flags_mask == NULL)
+               return 0;
+       else
+               return box->v.get_private_flags_mask(box);
+}
+
 struct mailbox_sync_context *
 mailbox_sync_init(struct mailbox *box, enum mailbox_sync_flags flags)
 {
index c4413da423c7f578127ca02cb0bab9a32aed8737..5336c8d8cf1038c60a49827557a03abd40401942 100644 (file)
@@ -398,6 +398,9 @@ void mailbox_get_status(struct mailbox *box, enum mailbox_status_items items,
                        struct mailbox_status *status_r);
 /* Get mailbox GUID, creating it if necessary. */
 int mailbox_get_guid(struct mailbox *box, uint8_t guid[MAIL_GUID_128_SIZE]);
+/* Returns a mask of flags that are private to user in this mailbox
+   (as opposed to flags shared between users). */
+enum mail_flags mailbox_get_private_flags_mask(struct mailbox *box);
 
 /* Synchronize the mailbox. */
 struct mailbox_sync_context *
index 78c52063921d54451c285f9ce20c4fed24e8e190..126cd1806fcc1aa32def046f7796a666a125e6ba 100644 (file)
@@ -351,6 +351,7 @@ struct mailbox test_mailbox = {
                NULL,
                NULL,
                NULL,
+               NULL,
                test_mailbox_mail_alloc,
                test_mailbox_header_lookup_init,
                test_mailbox_header_lookup_deinit,
index 128fe2c79d0a4051409cdaa4751cb376a26c0dec..dec085d0d20869c38510af5b138eb29fcd9e5897 100644 (file)
@@ -64,6 +64,7 @@ static bool acl_is_readonly(struct mailbox *box)
 {
        struct acl_mailbox *abox = ACL_CONTEXT(box);
        enum acl_storage_rights save_right;
+       enum mail_flags private_flags_mask;
 
        if (abox->module_ctx.super.is_readonly(box))
                return TRUE;
@@ -78,10 +79,12 @@ static bool acl_is_readonly(struct mailbox *box)
        /* Next up is the "shared flag rights" */
        if (acl_mailbox_right_lookup(box, ACL_STORAGE_RIGHT_WRITE) > 0)
                return FALSE;
-       if ((box->private_flags_mask & MAIL_DELETED) == 0 &&
+
+       private_flags_mask = mailbox_get_private_flags_mask(box);
+       if ((private_flags_mask & MAIL_DELETED) == 0 &&
            acl_mailbox_right_lookup(box, ACL_STORAGE_RIGHT_WRITE_DELETED) > 0)
                return FALSE;
-       if ((box->private_flags_mask & MAIL_SEEN) == 0 &&
+       if ((private_flags_mask & MAIL_SEEN) == 0 &&
            acl_mailbox_right_lookup(box, ACL_STORAGE_RIGHT_WRITE_SEEN) > 0)
                return FALSE;
 
index 910be64b0ea088d3930cd02eef39508321770390..f15f4e5f9ca17d60e85a90096852417ecc62b253 100644 (file)
@@ -538,6 +538,7 @@ struct mailbox virtual_mailbox = {
                virtual_get_virtual_uid,
                virtual_get_virtual_backend_boxes,
                virtual_get_virtual_box_patterns,
+               NULL,
                virtual_mail_alloc,
                index_header_lookup_init,
                index_header_lookup_deinit,