]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
fts-solr: Added break-imap-search setting to use Solr with SEARCH TEXT/BODY
authorTimo Sirainen <tss@iki.fi>
Sun, 13 Jul 2008 12:15:04 +0000 (15:15 +0300)
committerTimo Sirainen <tss@iki.fi>
Sun, 13 Jul 2008 12:15:04 +0000 (15:15 +0300)
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.

--HG--
branch : HEAD

src/plugins/fts-solr/fts-backend-solr.c
src/plugins/fts-solr/fts-solr-plugin.c
src/plugins/fts-solr/fts-solr-plugin.h
src/plugins/fts-solr/solr-connection.c
src/plugins/fts-solr/solr-connection.h

index a3872e730fe5675499aee612a9749d39d59235a1..d3d8e28f6fcacb02a2a4587dbef5c8e5208cc2f9 100644 (file)
@@ -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 void xml_encode(string_t *dest, const char *str)
 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;
 }
 
index 4544adba44ef1b117e9a5268ad00319c47735063..d0d2409c28992ed2e8fdea1a18382b8c169e428d 100644 (file)
@@ -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);
 }
index bd9465ffa2c5919542d2e7aaa39394abbc8a36f4..ee8c1850a937fe9fb2a8905bff3e7b44816cede8 100644 (file)
@@ -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);
index f27e27172c737f7ea720a229c12d0c248be222e1..5f452c7d6a37ded2a7f3700bfa19608864a06041 100644 (file)
@@ -56,28 +56,6 @@ struct solr_connection {
        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 element_size, size_t nmemb, void *context)
        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();
index 049fbb98835a5059679bc971a4be46e0540abacb..f86449bcf44868700d51c34375f9e7982191eeb4 100644 (file)
@@ -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,