diff src/plugins/fts-solr/fts-backend-solr.c @ 8500:3efcdc45d111 HEAD

Added alias_for setting for namespaces. Fixes namespace issues with fts.
author Timo Sirainen <tss@iki.fi>
date Sun, 30 Nov 2008 02:09:16 +0200
parents 252b29ac5f43
children 5cc1c4f3d38b
line wrap: on
line diff
--- a/src/plugins/fts-solr/fts-backend-solr.c	Sun Nov 30 01:27:19 2008 +0200
+++ b/src/plugins/fts-solr/fts-backend-solr.c	Sun Nov 30 02:09:16 2008 +0200
@@ -127,6 +127,9 @@
 	struct mail_namespace *ns = box->storage->ns;
 	const char *str;
 
+	while (ns->alias_for != NULL)
+		ns = ns->alias_for;
+
 	if (solr_conn == NULL)
 		solr_conn = solr_connection_init(set->url, set->debug);
 
@@ -143,9 +146,12 @@
 		backend->default_ns =
 			mail_namespace_find_inbox(ns->user->namespaces);
 	}
+	while (backend->default_ns->alias_for != NULL)
+		backend->default_ns = backend->default_ns->alias_for;
+
 	str = solr_escape_id_str(ns->user->username);
 	backend->id_username = i_strdup(str);
-	if (box->storage->ns != backend->default_ns) {
+	if (ns != backend->default_ns) {
 		str = solr_escape_id_str(ns->prefix);
 		backend->id_namespace = i_strdup(str);
 	}
@@ -171,6 +177,9 @@
 {
 	struct solr_fts_backend *backend = (struct solr_fts_backend *)_backend;
 
+	while (ns->alias_for != NULL)
+		ns = ns->alias_for;
+
 	if (ns == backend->default_ns || *ns->prefix == '\0')
 		str_append(str, " -ns:[* TO *]");
 	else {
@@ -268,23 +277,17 @@
 	return 0;
 }
 
-static const char *
-solr_get_vmailbox(struct fts_backend *_backend,
-		  struct mailbox *box, const char *ns_prefix,
-		  const char *mailbox, string_t *dest)
+static struct mail_namespace *
+solr_get_namespaces(struct fts_backend *_backend,
+		    struct mailbox *box, const char *ns_prefix)
 {
 	struct solr_fts_backend *backend = (struct solr_fts_backend *)_backend;
 	struct mail_namespace *namespaces = box->storage->ns->user->namespaces;
-	struct mail_namespace *ns;
 
 	if (ns_prefix == NULL)
-		ns = backend->default_ns;
-	else {
-		ns = mail_namespace_find_prefix(namespaces, ns_prefix);
-		if (ns == NULL)
-			return FALSE;
-	}
-	return mail_namespace_get_vname(ns, dest, mailbox);
+		return backend->default_ns;
+	else
+		return mail_namespace_find_prefix(namespaces, ns_prefix);
 }
 
 static bool
@@ -293,15 +296,17 @@
 {
 	struct fts_backend_solr_get_last_uids_context *ctx = context;
 	struct fts_backend_uid_map *map;
+	struct mail_namespace *ns;
 	const char *vname;
 
-	vname = solr_get_vmailbox(ctx->backend, ctx->box, ns_prefix,
-				  mailbox, ctx->vname);
-
-	map = array_append_space(ctx->last_uids);
-	map->mailbox = p_strdup(ctx->pool, vname);
-	map->uidvalidity = uidvalidity;
-	map->uid = *uid;
+	ns = solr_get_namespaces(ctx->backend, ctx->box, ns_prefix);
+	for (; ns != NULL; ns = ns->alias_chain_next) {
+		vname = mail_namespace_get_vname(ns, ctx->vname, mailbox);
+		map = array_append_space(ctx->last_uids);
+		map->mailbox = p_strdup(ctx->pool, vname);
+		map->uidvalidity = uidvalidity;
+		map->uid = *uid;
+	}
 	return FALSE;
 }
 
@@ -344,6 +349,7 @@
 {
 	struct solr_fts_backend *backend = (struct solr_fts_backend *)_backend;
 	ARRAY_TYPE(mailbox_virtual_patterns) includes_arr, excludes_arr;
+	struct mail_namespace *ns;
 	const struct mailbox_virtual_pattern *includes, *excludes;
 	unsigned int i, inc_count, exc_count, len;
 	string_t *fq;
@@ -386,12 +392,15 @@
 		str_append_c(fq, '(');
 		str_append(fq, "-box:");
 		solr_add_pattern(fq, &excludes[i]);
-		if (excludes[i].ns == backend->default_ns) {
+
+		for (ns = excludes[i].ns; ns->alias_for != NULL; )
+			ns = ns->alias_for;
+		if (ns == backend->default_ns) {
 			str_append(fq, " OR NOT");
-			solr_add_ns_query(fq, _backend, excludes[i].ns);
-		} else if (*excludes[i].ns->prefix != '\0') {
+			solr_add_ns_query(fq, _backend, ns);
+		} else if (*ns->prefix != '\0') {
 			str_append(fq, " OR -ns:");
-			solr_quote(fq, excludes[i].ns->prefix);
+			solr_quote(fq, ns->prefix);
 		}
 		str_append_c(fq, ')');
 	}
@@ -453,21 +462,25 @@
 	struct solr_fts_backend *backend =
 		(struct solr_fts_backend *)ctx->ctx.backend;
 	struct mailbox *box = ctx->ctx.backend->box;
+	struct mail_namespace *ns = box->storage->ns;
 
 	str_printfa(ctx->cmd, "<doc>"
 		    "<field name=\"uid\">%u</field>"
 		    "<field name=\"uidv\">%u</field>",
 		    uid, ctx->uid_validity);
 
-	if (box->storage->ns != backend->default_ns) {
+	while (ns->alias_for != NULL)
+		ns = ns->alias_for;
+
+	if (ns != backend->default_ns) {
 		str_append(ctx->cmd, "<field name=\"ns\">");
-		xml_encode(ctx->cmd, box->storage->ns->prefix);
+		xml_encode(ctx->cmd, ns->prefix);
 		str_append(ctx->cmd, "</field>");
 	}
 	str_append(ctx->cmd, "<field name=\"box\">");
 	xml_encode(ctx->cmd, box->name);
 	str_append(ctx->cmd, "</field><field name=\"user\">");
-	xml_encode(ctx->cmd, box->storage->ns->user->username);
+	xml_encode(ctx->cmd, ns->user->username);
 	str_append(ctx->cmd, "</field>");
 }
 
@@ -629,11 +642,17 @@
 				 void *context)
 {
 	struct solr_virtual_uid_map_context *ctx = context;
+	struct mail_namespace *ns;
 	const char *vname;
 
-	vname = solr_get_vmailbox(ctx->backend, ctx->box, ns_prefix,
-				  mailbox, ctx->vname);
-	return mailbox_get_virtual_uid(ctx->box, vname, uidvalidity, *uid, uid);
+	ns = solr_get_namespaces(ctx->backend, ctx->box, ns_prefix);
+	for (; ns != NULL; ns = ns->alias_chain_next) {
+		vname = mail_namespace_get_vname(ns, ctx->vname, mailbox);
+		if (mailbox_get_virtual_uid(ctx->box, vname, uidvalidity,
+					    *uid, uid))
+			return TRUE;
+	}
+	return FALSE;
 }
 
 static int fts_backend_solr_lookup(struct fts_backend_lookup_context *ctx,