From: Stephan Bosch Date: Tue, 8 Oct 2019 16:56:59 +0000 (+0200) Subject: plugins: fts-solr: Move xml_parser field from struct solr_connection to struct solr_r... X-Git-Tag: 2.3.10~151 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=b3fb5ff6e492ca33c0b9f01f3dff7956ab5744f0;p=thirdparty%2Fdovecot%2Fcore.git plugins: fts-solr: Move xml_parser field from struct solr_connection to struct solr_response_parser. --- diff --git a/src/plugins/fts-solr/solr-connection.c b/src/plugins/fts-solr/solr-connection.c index b9d13666b9..23b1757852 100644 --- a/src/plugins/fts-solr/solr-connection.c +++ b/src/plugins/fts-solr/solr-connection.c @@ -14,6 +14,8 @@ #include +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); diff --git a/src/plugins/fts-solr/solr-response.c b/src/plugins/fts-solr/solr-response.c index 10af5108c6..cc3f6b436e 100644 --- a/src/plugins/fts-solr/solr-response.c +++ b/src/plugins/fts-solr/solr-response.c @@ -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;