]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
plugins: fts-solr: Move xml_parser field from struct solr_connection to struct solr_r...
authorStephan Bosch <stephan.bosch@open-xchange.com>
Tue, 8 Oct 2019 16:56:59 +0000 (18:56 +0200)
committeraki.tuomi <aki.tuomi@open-xchange.com>
Thu, 9 Jan 2020 12:52:43 +0000 (12:52 +0000)
src/plugins/fts-solr/solr-connection.c
src/plugins/fts-solr/solr-response.c

index b9d13666b94758c94e91f4ff7c182d3de27234e5..23b1757852c30f45192a6e4e8f9dab9d17bc3aaf 100644 (file)
@@ -14,6 +14,8 @@
 
 #include <expat.h>
 
+struct solr_response_parser;
+
 struct solr_lookup_context {
        struct solr_connection *conn;
 
@@ -21,6 +23,8 @@ struct solr_lookup_context {
        struct io *io;
 
        int request_status;
+
+       struct solr_response_parser *parser;
 };
 
 struct solr_connection_post {
@@ -33,8 +37,6 @@ struct solr_connection_post {
 };
 
 struct solr_connection {
-       XML_Parser xml_parser;
-
        char *http_host;
        in_port_t http_port;
        char *http_base_url;
@@ -44,7 +46,6 @@ struct solr_connection {
 
        bool debug:1;
        bool posting:1;
-       bool xml_failed:1;
        bool http_ssl:1;
 };
 
@@ -109,11 +110,6 @@ int solr_connection_init(const struct fts_solr_settings *solr_set,
                solr_http_client = http_client_init(&http_set);
        }
 
-       conn->xml_parser = XML_ParserCreate("UTF-8");
-       if (conn->xml_parser == NULL) {
-               i_fatal_status(FATAL_OUTOFMEM,
-                              "fts_solr: Failed to allocate XML parser");
-       }
        *conn_r = conn;
        return 0;
 }
@@ -123,7 +119,6 @@ void solr_connection_deinit(struct solr_connection **_conn)
        struct solr_connection *conn = *_conn;
 
        *_conn = NULL;
-       XML_ParserFree(conn->xml_parser);
        i_free(conn->http_host);
        i_free(conn->http_base_url);
        i_free(conn->http_user);
@@ -139,7 +134,7 @@ static void solr_connection_payload_input(struct solr_lookup_context *lctx)
 
        /* read payload */
        while ((ret = i_stream_read_more(lctx->payload, &data, &size)) > 0) {
-               (void)solr_xml_parse(lctx->conn, data, size, FALSE);
+               (void)solr_xml_parse(lctx->parser, data, size, FALSE);
                i_stream_skip(lctx->payload, size);
        }
 
@@ -194,17 +189,25 @@ int solr_connection_select(struct solr_connection *conn, const char *query,
 
        i_zero(&parser);
        parser.result_pool = pool;
+       lctx.parser = &parser;
+
+       parser.xml_parser = XML_ParserCreate("UTF-8");
+       if (parser.xml_parser == NULL) {
+               i_fatal_status(FATAL_OUTOFMEM,
+                              "fts_solr: Failed to allocate XML parser");
+       }
+
        hash_table_create(&parser.mailboxes, default_pool, 0,
                          str_hash, strcmp);
        p_array_init(&parser.results, pool, 32);
 
        i_free_and_null(conn->http_failure);
-       conn->xml_failed = FALSE;
-       XML_ParserReset(conn->xml_parser, "UTF-8");
-       XML_SetElementHandler(conn->xml_parser,
+       parser.xml_failed = FALSE;
+       XML_ParserReset(parser.xml_parser, "UTF-8");
+       XML_SetElementHandler(parser.xml_parser,
                              solr_lookup_xml_start, solr_lookup_xml_end);
-       XML_SetCharacterDataHandler(conn->xml_parser, solr_lookup_xml_data);
-       XML_SetUserData(conn->xml_parser, &parser);
+       XML_SetCharacterDataHandler(parser.xml_parser, solr_lookup_xml_data);
+       XML_SetUserData(parser.xml_parser, &parser);
 
        url = t_strconcat(conn->http_base_url, "select?", query, NULL);
 
@@ -227,8 +230,9 @@ int solr_connection_select(struct solr_connection *conn, const char *query,
            parser.content_state == SOLR_XML_CONTENT_STATE_ERROR)
                return -1;
 
-       parse_ret = solr_xml_parse(conn, "", 0, TRUE);
+       parse_ret = solr_xml_parse(&parser, "", 0, TRUE);
        hash_table_destroy(&parser.mailboxes);
+       XML_ParserFree(parser.xml_parser);
 
        array_append_zero(&parser.results);
        *box_results_r = array_front_modifiable(&parser.results);
index 10af5108c6bf20e797520b0b79b504bac1078968..cc3f6b436ed0926be2bceed3f344c40c630faf2e 100644 (file)
@@ -24,6 +24,8 @@ enum solr_xml_content_state {
 };
 
 struct solr_response_parser {
+       XML_Parser xml_parser;
+
        enum solr_xml_response_state state;
        enum solr_xml_content_state content_state;
        int depth;
@@ -36,29 +38,31 @@ struct solr_response_parser {
        /* box_id -> solr_result */
        HASH_TABLE(char *, struct solr_result *) mailboxes;
        ARRAY(struct solr_result *) results;
+
+       bool xml_failed:1;
 };
 
 static int
-solr_xml_parse(struct solr_connection *conn,
+solr_xml_parse(struct solr_response_parser *parser,
               const void *data, size_t size, bool done)
 {
        enum XML_Error err;
        int line, col;
 
-       if (conn->xml_failed)
+       if (parser->xml_failed)
                return -1;
 
-       if (XML_Parse(conn->xml_parser, data, size, done ? 1 : 0) != 0)
+       if (XML_Parse(parser->xml_parser, data, size, done ? 1 : 0) != 0)
                return 0;
 
-       err = XML_GetErrorCode(conn->xml_parser);
+       err = XML_GetErrorCode(parser->xml_parser);
        if (err != XML_ERROR_FINISHED) {
-               line = XML_GetCurrentLineNumber(conn->xml_parser);
-               col = XML_GetCurrentColumnNumber(conn->xml_parser);
+               line = XML_GetCurrentLineNumber(parser->xml_parser);
+               col = XML_GetCurrentColumnNumber(parser->xml_parser);
                i_error("fts_solr: Invalid XML input at %d:%d: %s "
                        "(near: %.*s)", line, col, XML_ErrorString(err),
                        (int)I_MIN(size, 128), (const char *)data);
-               conn->xml_failed = TRUE;
+               parser->xml_failed = TRUE;
                return -1;
        }
        return 0;