]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
virtual: Moved virtual_mailbox_vfuncs to lib-storage.
authorTimo Sirainen <timo.sirainen@dovecot.fi>
Mon, 30 May 2016 16:07:16 +0000 (19:07 +0300)
committerGitLab <gitlab@git.dovecot.net>
Fri, 3 Jun 2016 11:39:27 +0000 (14:39 +0300)
This allows implementing other virtual storage backends.

src/lib-storage/mail-storage-private.h
src/plugins/fts/fts-api.c
src/plugins/fts/fts-search.c
src/plugins/fts/fts-storage.c
src/plugins/virtual/virtual-storage.c
src/plugins/virtual/virtual-storage.h

index 6a2b53756e555c6e9cd94f832cbd481da176e5df..0aad8f83f80cbed4a15795ae5193162d1dfade6d 100644 (file)
@@ -150,6 +150,24 @@ struct mail_attachment_part {
        const char *content_type, *content_disposition;
 };
 
+struct virtual_mailbox_vfuncs {
+       /* convert backend UIDs to virtual UIDs. if some backend UID doesn't
+          exist in mailbox, it's simply ignored */
+       void (*get_virtual_uids)(struct mailbox *box,
+                                struct mailbox *backend_mailbox,
+                                const ARRAY_TYPE(seq_range) *backend_uids,
+                                ARRAY_TYPE(seq_range) *virtual_uids_r);
+       /* like get_virtual_uids(), but if a backend UID doesn't exist,
+          convert it to 0. */
+       void (*get_virtual_uid_map)(struct mailbox *box,
+                                   struct mailbox *backend_mailbox,
+                                   const ARRAY_TYPE(seq_range) *backend_uids,
+                                   ARRAY_TYPE(uint32_t) *virtual_uids_r);
+       void (*get_virtual_backend_boxes)(struct mailbox *box,
+                                         ARRAY_TYPE(mailboxes) *mailboxes,
+                                         bool only_with_msgs);
+};
+
 struct mailbox_vfuncs {
        bool (*is_readonly)(struct mailbox *box);
 
@@ -286,7 +304,9 @@ struct mailbox {
        struct mail_storage *storage;
        struct mailbox_list *list;
 
-        struct mailbox_vfuncs v, *vlast;
+       struct mailbox_vfuncs v, *vlast;
+       /* virtual mailboxes: */
+       const struct virtual_mailbox_vfuncs *virtual_vfuncs;
 /* private: */
        pool_t pool, metadata_pool;
        /* Linked list of all mailboxes in this storage */
index 66c09c900a79505ca1235b20c817bb878777723d..f3a94223ce26b60d96b40d873c99c78afa7ad208 100644 (file)
@@ -8,7 +8,6 @@
 #include "mail-storage-private.h"
 #include "mailbox-list-iter.h"
 #include "mail-search.h"
-#include "../virtual/virtual-storage.h"
 #include "fts-api-private.h"
 
 static ARRAY(const struct fts_backend *) backends;
@@ -90,7 +89,7 @@ int fts_backend_get_last_uid(struct fts_backend *backend, struct mailbox *box,
 {
        struct fts_index_header hdr;
 
-       if (strcmp(box->storage->name, VIRTUAL_STORAGE_NAME) == 0) {
+       if (box->virtual_vfuncs != NULL) {
                /* virtual mailboxes themselves don't have any indexes,
                   so catch this call here */
                if (!fts_index_get_header(box, &hdr))
@@ -228,7 +227,14 @@ int fts_backend_reset_last_uids(struct fts_backend *backend)
 
 int fts_backend_rescan(struct fts_backend *backend)
 {
-       if (strcmp(backend->ns->storage->name, VIRTUAL_STORAGE_NAME) == 0) {
+       struct mailbox *box;
+       bool virtual_storage;
+
+       box = mailbox_alloc(backend->ns->list, "", 0);
+       virtual_storage = box->virtual_vfuncs != NULL;
+       mailbox_free(&box);
+
+       if (virtual_storage) {
                /* just reset the last-uids for a virtual storage. */
                return fts_backend_reset_last_uids(backend);
        }
index ffbf3d4268b617a2a1972430a614dd08e4447496..acdad40dabc8961d1104005aa79136f8cdd8c9ca 100644 (file)
@@ -5,7 +5,6 @@
 #include "str.h"
 #include "seq-range-array.h"
 #include "mail-search.h"
-#include "../virtual/virtual-storage.h"
 #include "fts-api-private.h"
 #include "fts-search-args.h"
 #include "fts-search-serialize.h"
@@ -63,7 +62,7 @@ static int fts_search_lookup_level_single(struct fts_search_context *fctx,
 }
 
 static void
-level_scores_add_vuids(struct virtual_mailbox *vbox,
+level_scores_add_vuids(struct mailbox *box,
                       struct fts_search_level *level, struct fts_result *br)
 {
        const struct fts_score_map *scores;
@@ -78,8 +77,8 @@ level_scores_add_vuids(struct virtual_mailbox *vbox,
        t_array_init(&backend_uids, 64);
        for (i = 0; i < count; i++)
                seq_range_array_add(&backend_uids, scores[i].uid);
-       vbox->vfuncs.get_virtual_uid_map(&vbox->box, br->box,
-                                        &backend_uids, &vuids_arr);
+       box->virtual_vfuncs->get_virtual_uid_map(box, br->box,
+                                                &backend_uids, &vuids_arr);
 
        i_assert(array_count(&vuids_arr) == array_count(&br->scores));
        vuids = array_get(&vuids_arr, &count);
@@ -110,7 +109,6 @@ multi_add_lookup_result(struct fts_search_context *fctx,
                        struct mail_search_arg *args,
                        struct fts_multi_result *result)
 {
-       struct virtual_mailbox *vbox = (struct virtual_mailbox *)fctx->box;
        ARRAY_TYPE(seq_range) vuids;
        size_t orig_size;
        unsigned int i;
@@ -132,21 +130,20 @@ multi_add_lookup_result(struct fts_search_context *fctx,
 
                array_clear(&vuids);
                if (array_is_created(&br->definite_uids)) {
-                       vbox->vfuncs.get_virtual_uids(fctx->box, br->box,
-                                                     &br->definite_uids,
-                                                     &vuids);
+                       fctx->box->virtual_vfuncs->get_virtual_uids(fctx->box,
+                               br->box, &br->definite_uids, &vuids);
                }
                uid_range_to_seqs(fctx, &vuids, &level->definite_seqs);
 
                array_clear(&vuids);
                if (array_is_created(&br->maybe_uids)) {
-                       vbox->vfuncs.get_virtual_uids(fctx->box, br->box,
-                                                     &br->maybe_uids, &vuids);
+                       fctx->box->virtual_vfuncs->get_virtual_uids(fctx->box,
+                               br->box, &br->maybe_uids, &vuids);
                }
                uid_range_to_seqs(fctx, &vuids, &level->maybe_seqs);
 
                if (array_is_created(&br->scores))
-                       level_scores_add_vuids(vbox, level, br);
+                       level_scores_add_vuids(fctx->box, level, br);
        }
        return 0;
 }
@@ -157,7 +154,6 @@ static int fts_search_lookup_level_multi(struct fts_search_context *fctx,
 {
        enum fts_lookup_flags flags = fctx->flags |
                (and_args ? FTS_LOOKUP_FLAG_AND_ARGS : 0);
-       struct virtual_mailbox *vbox = (struct virtual_mailbox *)fctx->box;
        ARRAY_TYPE(mailboxes) mailboxes_arr, tmp_mailboxes;
        struct mailbox *const *mailboxes;
        struct fts_backend *backend;
@@ -166,7 +162,8 @@ static int fts_search_lookup_level_multi(struct fts_search_context *fctx,
        unsigned int i, j, mailbox_count;
 
        p_array_init(&mailboxes_arr, fctx->result_pool, 8);
-       vbox->vfuncs.get_virtual_backend_boxes(fctx->box, &mailboxes_arr, TRUE);
+       fctx->box->virtual_vfuncs->get_virtual_backend_boxes(fctx->box,
+               &mailboxes_arr, TRUE);
        array_sort(&mailboxes_arr, mailbox_cmp_fts_backend);
 
        memset(&result, 0, sizeof(result));
index 4bcccdc84df938cd4e3a50c8de5f10b7260fde39..be86577b9a43bf02f97e18cc853d1b7b31a1fb20 100644 (file)
@@ -9,7 +9,6 @@
 #include "mail-search-build.h"
 #include "mail-storage-private.h"
 #include "mailbox-list-private.h"
-#include "../virtual/virtual-storage.h"
 #include "fts-api-private.h"
 #include "fts-tokenizer.h"
 #include "fts-indexer.h"
@@ -208,8 +207,7 @@ fts_mailbox_search_init(struct mailbox_transaction_context *t,
        fctx->args = args;
        fctx->result_pool = pool_alloconly_create("fts results", 1024*64);
        fctx->orig_matches = buffer_create_dynamic(default_pool, 64);
-       fctx->virtual_mailbox =
-               strcmp(t->box->storage->name, VIRTUAL_STORAGE_NAME) == 0;
+       fctx->virtual_mailbox = t->box->virtual_vfuncs != NULL;
        fctx->enforced =
                mail_user_plugin_getenv_bool(t->box->storage->user,
                                        "fts_enforced");
@@ -534,8 +532,7 @@ void fts_mail_allocated(struct mail *_mail)
        fmail = p_new(mail->pool, struct fts_mail, 1);
        fmail->module_ctx.super = *v;
        mail->vlast = &fmail->module_ctx.super;
-       fmail->virtual_mail =
-               strcmp(_mail->box->storage->name, VIRTUAL_STORAGE_NAME) == 0;
+       fmail->virtual_mail = _mail->box->virtual_vfuncs != NULL;
 
        v->get_special = fts_mail_get_special;
        v->precache = fts_mail_precache;
index 908fe30f81f84d218bda1ede99ed6924ea61e63d..5cb46c7add529664898f31ad20c15c64d7b02c43 100644 (file)
@@ -260,7 +260,7 @@ virtual_mailbox_alloc(struct mail_storage *_storage, struct mailbox_list *list,
        mbox->box.storage = _storage;
        mbox->box.list = list;
        mbox->box.mail_vfuncs = &virtual_mail_vfuncs;
-       mbox->vfuncs = virtual_mailbox_vfuncs;
+       mbox->box.virtual_vfuncs = &virtual_mailbox_vfuncs;
 
        index_storage_mailbox_alloc(&mbox->box, vname, flags, MAIL_INDEX_PREFIX);
 
index 697a64c438eefcd06e4d78cc12abc9fef374ab40..c777091410f9b5b92196a5e63adcbcfc5527e5a9 100644 (file)
@@ -114,24 +114,6 @@ struct virtual_backend_box {
 };
 ARRAY_DEFINE_TYPE(virtual_backend_box, struct virtual_backend_box *);
 
-struct virtual_mailbox_vfuncs {
-       /* convert backend UIDs to virtual UIDs. if some backend UID doesn't
-          exist in mailbox, it's simply ignored */
-       void (*get_virtual_uids)(struct mailbox *box,
-                                struct mailbox *backend_mailbox,
-                                const ARRAY_TYPE(seq_range) *backend_uids,
-                                ARRAY_TYPE(seq_range) *virtual_uids_r);
-       /* like get_virtual_uids(), but if a backend UID doesn't exist,
-          convert it to 0. */
-       void (*get_virtual_uid_map)(struct mailbox *box,
-                                   struct mailbox *backend_mailbox,
-                                   const ARRAY_TYPE(seq_range) *backend_uids,
-                                   ARRAY_TYPE(uint32_t) *virtual_uids_r);
-       void (*get_virtual_backend_boxes)(struct mailbox *box,
-                                         ARRAY_TYPE(mailboxes) *mailboxes,
-                                         bool only_with_msgs);
-};
-
 struct virtual_mailbox {
        struct mailbox box;
        struct virtual_storage *storage;
@@ -161,8 +143,6 @@ struct virtual_mailbox {
        ARRAY_TYPE(mailbox_virtual_patterns) list_include_patterns;
        ARRAY_TYPE(mailbox_virtual_patterns) list_exclude_patterns;
 
-       struct virtual_mailbox_vfuncs vfuncs;
-
        unsigned int uids_mapped:1;
        unsigned int sync_initialized:1;
        unsigned int inconsistent:1;