dovecot-1.1: fts-solr: Added break-imap-search setting to use So...

dovecot at dovecot.org dovecot at dovecot.org
Sun Jul 13 15:37:52 EEST 2008


details:   http://hg.dovecot.org/dovecot-1.1/rev/cad4ad873ff9
changeset: 7751:cad4ad873ff9
user:      Timo Sirainen <tss at iki.fi>
date:      Sun Jul 13 15:15:04 2008 +0300
description:
fts-solr: Added break-imap-search setting to use Solr with SEARCH TEXT/BODY
parameters. This makes the SEARCH non-compliant with standard IMAP protocol,
because TEXT/BODY require support for substring searches and Lucene doesn't
support them.

diffstat:

5 files changed, 45 insertions(+), 27 deletions(-)
src/plugins/fts-solr/fts-backend-solr.c |    7 +++++--
src/plugins/fts-solr/fts-solr-plugin.c  |   29 +++++++++++++++++++++++++++++
src/plugins/fts-solr/fts-solr-plugin.h  |    7 +++++++
src/plugins/fts-solr/solr-connection.c  |   27 +++------------------------
src/plugins/fts-solr/solr-connection.h  |    2 +-

diffs (154 lines):

diff -r a0b9325d4967 -r cad4ad873ff9 src/plugins/fts-solr/fts-backend-solr.c
--- a/src/plugins/fts-solr/fts-backend-solr.c	Sun Jul 13 15:05:52 2008 +0300
+++ b/src/plugins/fts-solr/fts-backend-solr.c	Sun Jul 13 15:15:04 2008 +0300
@@ -7,7 +7,6 @@
 #include "solr-connection.h"
 #include "fts-solr-plugin.h"
 
-#include <stdlib.h>
 #include <curl/curl.h>
 
 #define SOLR_CMDBUF_SIZE (1024*64)
@@ -59,13 +58,17 @@ static struct fts_backend *
 static struct fts_backend *
 fts_backend_solr_init(struct mailbox *box ATTR_UNUSED)
 {
+	const struct fts_solr_settings *set = &fts_solr_settings;
 	struct fts_backend *backend;
 
 	if (solr_conn == NULL)
-		solr_conn = solr_connection_init(getenv("FTS_SOLR"));
+		solr_conn = solr_connection_init(set->url, set->debug);
 
 	backend = i_new(struct fts_backend, 1);
 	*backend = fts_backend_solr;
+
+	if (set->substring_search)
+		backend->flags |= FTS_BACKEND_FLAG_SUBSTRING_LOOKUPS;
 	return backend;
 }
 
diff -r a0b9325d4967 -r cad4ad873ff9 src/plugins/fts-solr/fts-solr-plugin.c
--- a/src/plugins/fts-solr/fts-solr-plugin.c	Sun Jul 13 15:05:52 2008 +0300
+++ b/src/plugins/fts-solr/fts-solr-plugin.c	Sun Jul 13 15:15:04 2008 +0300
@@ -3,14 +3,43 @@
 #include "lib.h"
 #include "fts-solr-plugin.h"
 
+#include <stdlib.h>
+
 const char *fts_solr_plugin_version = PACKAGE_VERSION;
+struct fts_solr_settings fts_solr_settings;
+
+static void fts_solr_plugin_init_settings(const char *str)
+{
+	struct fts_solr_settings *set = &fts_solr_settings;
+	const char *const *tmp;
+
+	if (str == NULL)
+		str = "";
+
+	for (tmp = t_strsplit_spaces(str, " "); *tmp != NULL; tmp++) {
+		if (strncmp(*tmp, "url=", 4) == 0) {
+			i_free(set->url);
+			set->url = i_strdup(*tmp + 4);
+		} else if (strcmp(*tmp, "debug") == 0) {
+			set->debug = TRUE;
+		} else if (strcmp(*tmp, "break-imap-search") == 0) {
+			set->substring_search = TRUE;
+		} else {
+			i_fatal("fts_solr: Invalid setting: %s", *tmp);
+		}
+	}
+	if (set->url == NULL)
+		i_fatal("fts_solr: url setting missing");
+}
 
 void fts_solr_plugin_init(void)
 {
+	fts_solr_plugin_init_settings(getenv("FTS_SOLR"));
 	fts_backend_register(&fts_backend_solr);
 }
 
 void fts_solr_plugin_deinit(void)
 {
+	i_free(fts_solr_settings.url);
 	fts_backend_unregister(fts_backend_solr.name);
 }
diff -r a0b9325d4967 -r cad4ad873ff9 src/plugins/fts-solr/fts-solr-plugin.h
--- a/src/plugins/fts-solr/fts-solr-plugin.h	Sun Jul 13 15:05:52 2008 +0300
+++ b/src/plugins/fts-solr/fts-solr-plugin.h	Sun Jul 13 15:15:04 2008 +0300
@@ -3,6 +3,13 @@
 
 #include "fts-api-private.h"
 
+struct fts_solr_settings {
+	char *url;
+	bool debug;
+	bool substring_search;
+};
+
+extern struct fts_solr_settings fts_solr_settings;
 extern struct fts_backend fts_backend_solr;
 
 void fts_solr_plugin_init(void);
diff -r a0b9325d4967 -r cad4ad873ff9 src/plugins/fts-solr/solr-connection.c
--- a/src/plugins/fts-solr/solr-connection.c	Sun Jul 13 15:05:52 2008 +0300
+++ b/src/plugins/fts-solr/solr-connection.c	Sun Jul 13 15:15:04 2008 +0300
@@ -55,28 +55,6 @@ struct solr_connection {
 	unsigned int posting:1;
 	unsigned int xml_failed:1;
 };
-
-static void
-solr_conn_init_settings(struct solr_connection *conn, const char *str)
-{
-	const char *const *tmp;
-
-	if (str == NULL)
-		str = "";
-
-	for (tmp = t_strsplit_spaces(str, " "); *tmp != NULL; tmp++) {
-		if (strncmp(*tmp, "url=", 4) == 0) {
-			i_free(conn->url);
-			conn->url = i_strdup(*tmp + 4);
-		} else if (strcmp(*tmp, "debug") == 0) {
-			conn->debug = TRUE;
-		} else {
-			i_fatal("fts_solr: Invalid setting: %s", *tmp);
-		}
-	}
-	if (conn->url == NULL)
-		i_fatal("fts_solr: url setting missing");
-}
 
 static size_t
 curl_output_func(void *data, size_t element_size, size_t nmemb, void *context)
@@ -149,12 +127,13 @@ curl_header_func(void *data, size_t elem
 	return size;
 }
 
-struct solr_connection *solr_connection_init(const char *settings)
+struct solr_connection *solr_connection_init(const char *url, bool debug)
 {
 	struct solr_connection *conn;
 
 	conn = i_new(struct solr_connection, 1);
-	solr_conn_init_settings(conn, settings);
+	conn->url = i_strdup(url);
+	conn->debug = debug;
 
 	conn->curlm = curl_multi_init();
 	conn->curl = curl_easy_init();
diff -r a0b9325d4967 -r cad4ad873ff9 src/plugins/fts-solr/solr-connection.h
--- a/src/plugins/fts-solr/solr-connection.h	Sun Jul 13 15:05:52 2008 +0300
+++ b/src/plugins/fts-solr/solr-connection.h	Sun Jul 13 15:15:04 2008 +0300
@@ -3,7 +3,7 @@
 
 #include "seq-range-array.h"
 
-struct solr_connection *solr_connection_init(const char *settings);
+struct solr_connection *solr_connection_init(const char *url, bool debug);
 void solr_connection_deinit(struct solr_connection *conn);
 
 void solr_connection_quote_str(struct solr_connection *conn, string_t *dest,


More information about the dovecot-cvs mailing list