# HG changeset patch # User Timo Sirainen # Date 1215951304 -10800 # Node ID e814614ffb65552cd685faa75d9d10e7af125d4d # Parent 3fbfdda3e5d3043711d3f596320b6f4df99a9248 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. diff -r 3fbfdda3e5d3 -r e814614ffb65 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 #include #define SOLR_CMDBUF_SIZE (1024*64) @@ -59,13 +58,17 @@ 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 3fbfdda3e5d3 -r e814614ffb65 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 + 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 3fbfdda3e5d3 -r e814614ffb65 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 3fbfdda3e5d3 -r e814614ffb65 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 @@ -56,28 +56,6 @@ 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 @@ 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 3fbfdda3e5d3 -r e814614ffb65 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,