Mercurial > dovecot > core-2.2
changeset 20272:3d60b96543fd
virtual: Moved virtual_mailbox_vfuncs to lib-storage.
This allows implementing other virtual storage backends.
author | Timo Sirainen <timo.sirainen@dovecot.fi> |
---|---|
date | Mon, 30 May 2016 19:07:16 +0300 |
parents | 55e8d679fa2b |
children | 105e82862423 |
files | 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 |
diffstat | 6 files changed, 43 insertions(+), 43 deletions(-) [+] |
line wrap: on
line diff
--- a/src/lib-storage/mail-storage-private.h Wed Jun 01 12:37:22 2016 +0300 +++ b/src/lib-storage/mail-storage-private.h Mon May 30 19:07:16 2016 +0300 @@ -150,6 +150,24 @@ 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 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 */
--- a/src/plugins/fts/fts-api.c Wed Jun 01 12:37:22 2016 +0300 +++ b/src/plugins/fts/fts-api.c Mon May 30 19:07:16 2016 +0300 @@ -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 @@ { 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_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); }
--- a/src/plugins/fts/fts-search.c Wed Jun 01 12:37:22 2016 +0300 +++ b/src/plugins/fts/fts-search.c Mon May 30 19:07:16 2016 +0300 @@ -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 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 @@ 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 @@ 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 @@ 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 @@ { 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 @@ 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));
--- a/src/plugins/fts/fts-storage.c Wed Jun 01 12:37:22 2016 +0300 +++ b/src/plugins/fts/fts-storage.c Mon May 30 19:07:16 2016 +0300 @@ -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 @@ 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(t->box->storage->user, "fts_enforced") != NULL; @@ -534,8 +532,7 @@ 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;
--- a/src/plugins/virtual/virtual-storage.c Wed Jun 01 12:37:22 2016 +0300 +++ b/src/plugins/virtual/virtual-storage.c Mon May 30 19:07:16 2016 +0300 @@ -260,7 +260,7 @@ 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);
--- a/src/plugins/virtual/virtual-storage.h Wed Jun 01 12:37:22 2016 +0300 +++ b/src/plugins/virtual/virtual-storage.h Mon May 30 19:07:16 2016 +0300 @@ -114,24 +114,6 @@ }; 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 @@ 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;