From: Timo Sirainen Date: Sun, 13 Jul 2008 12:15:04 +0000 (+0300) Subject: fts-solr: Added break-imap-search setting to use Solr with SEARCH TEXT/BODY X-Git-Tag: 1.2.alpha1~159 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=53ec1ff2231d477db3103c51987fa9cb6033bc16;p=thirdparty%2Fdovecot%2Fcore.git 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. --HG-- branch : HEAD --- diff --git a/src/plugins/fts-solr/fts-backend-solr.c b/src/plugins/fts-solr/fts-backend-solr.c index a3872e730f..d3d8e28f6f 100644 --- a/src/plugins/fts-solr/fts-backend-solr.c +++ b/src/plugins/fts-solr/fts-backend-solr.c @@ -7,7 +7,6 @@ #include "solr-connection.h" #include "fts-solr-plugin.h" -#include #include #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; } diff --git a/src/plugins/fts-solr/fts-solr-plugin.c b/src/plugins/fts-solr/fts-solr-plugin.c index 4544adba44..d0d2409c28 100644 --- a/src/plugins/fts-solr/fts-solr-plugin.c +++ b/src/plugins/fts-solr/fts-solr-plugin.c @@ -3,14 +3,43 @@ #include "lib.h" #include "fts-solr-plugin.h" +#include + 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 --git a/src/plugins/fts-solr/fts-solr-plugin.h b/src/plugins/fts-solr/fts-solr-plugin.h index bd9465ffa2..ee8c1850a9 100644 --- a/src/plugins/fts-solr/fts-solr-plugin.h +++ b/src/plugins/fts-solr/fts-solr-plugin.h @@ -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 --git a/src/plugins/fts-solr/solr-connection.c b/src/plugins/fts-solr/solr-connection.c index f27e27172c..5f452c7d6a 100644 --- a/src/plugins/fts-solr/solr-connection.c +++ b/src/plugins/fts-solr/solr-connection.c @@ -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(); diff --git a/src/plugins/fts-solr/solr-connection.h b/src/plugins/fts-solr/solr-connection.h index 049fbb9883..f86449bcf4 100644 --- a/src/plugins/fts-solr/solr-connection.h +++ b/src/plugins/fts-solr/solr-connection.h @@ -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,