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;