#include <expat.h>
+struct solr_response_parser;
+
struct solr_lookup_context {
struct solr_connection *conn;
struct io *io;
int request_status;
+
+ struct solr_response_parser *parser;
};
struct solr_connection_post {
};
struct solr_connection {
- XML_Parser xml_parser;
-
char *http_host;
in_port_t http_port;
char *http_base_url;
bool debug:1;
bool posting:1;
- bool xml_failed:1;
bool http_ssl:1;
};
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;
}
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);
/* 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);
}
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);
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);
};
struct solr_response_parser {
+ XML_Parser xml_parser;
+
enum solr_xml_response_state state;
enum solr_xml_content_state content_state;
int depth;
/* 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;