27 #include <libxml/parser.h>
28 #include <libxml/tree.h>
33 for (child =
node->children; child ; child = child->next)
34 if (child->type == XML_TEXT_NODE)
40 const char *node_name,
const char *attribute_name,
const char *value)
42 const char *attribute_value;
43 if (strcmp((
const char*) ptr->name, node_name))
49 if (attribute_value && !strcmp(attribute_value, value))
67 if (
node->type == XML_ELEMENT_NODE)
75 if (
node->type == XML_ELEMENT_NODE)
78 xmlBufferPtr buf = xmlBufferCreate();
79 xmlNode *tmp = xmlCopyNode(
node, 1);
81 xmlNodeDump(buf, tmp->doc, tmp, 0, 0);
89 odr_strdupn(o, (
const char *) buf->content, buf->use);
104 struct _xmlAttr *attr;
105 for (attr = ptr->properties; attr; attr = attr->next)
106 if (attr->children && attr->children->type == XML_TEXT_NODE)
108 if (!strcmp((
const char *) attr->name,
"numFound"))
111 (
const char *) attr->children->content));
113 else if (!strcmp((
const char *) attr->name,
"start"))
115 start =
odr_atoi((
const char *) attr->children->content);
172 for (ptr = root->children; ptr; ptr = ptr->next)
204 if (
node->type == XML_ELEMENT_NODE
205 && !strcmp((
const char*)
node->name,
"lst"))
208 for (child =
node->children; child; child= child->next)
233 if (
node->type == XML_ELEMENT_NODE)
235 const char *misspelled =
254 for (ptr = spellcheckPtr->children; ptr; ptr = ptr->next)
271 if (
node->type == XML_ELEMENT_NODE)
279 if (
node->type == XML_ELEMENT_NODE &&
280 !strcmp((
const char *)
node->name,
"int"))
288 if (
node->type == XML_ELEMENT_NODE &&
289 !strcmp((
const char *)
node->name,
"int"))
301 pos = strchr(val,
'^');
327 for (ptr = ptr->children; ptr; ptr = ptr->next)
328 if (ptr->type == XML_ELEMENT_NODE &&
347 xmlDocPtr doc = xmlParseMemory(content_buf, content_len);
354 xmlNodePtr root = xmlDocGetRootElement(doc);
355 if (root && !strcmp((
const char *) root->name,
"response"))
357 for (ptr = root->children; ptr; ptr = ptr->next)
359 if (!pdu && ptr->type == XML_ELEMENT_NODE &&
366 if (ptr->type == XML_ELEMENT_NODE &&
367 !strcmp((
const char *) ptr->name,
"result"))
373 if (ptr->type == XML_ELEMENT_NODE &&
406 ODR encode,
char **
name,
char **value,
int *i,
423 if (attr_values.
limit > 0)
432 if (attr_values.
start > 1)
453 if (attr_values.
limit > 0)
458 if (attr_values.
start > 1)
473 ODR encode,
char **
name,
char **value,
477 for (index = 0; index < facet_list->
num; index++)
489 ODR encode,
const char *charset)
491 const char *solr_op = 0;
492 char **
name, **value;
506 no_parms +=
request->facetList->num;
511 value = (
char **)
odr_malloc(encode,
sizeof(*value) * no_parms);
516 if (!strcmp(ea->
name,
"defType"))
518 value[i] = ea->
value;
541 "rows",
request->maximumRecords);
572 "terms.fl",
request->scanClause);
574 "terms.lower",
request->scanClause);
596 "terms.sort",
"index");
598 "terms.limit",
request->maximumTerms);
611 strlen(uri_args) + strlen(solr_op) + 5);
613 cp = strchr(hreq->
path,
'#');
616 strcpy(path, hreq->
path);
617 cp = strchr(path,
'?');
618 if (cp && strcmp(solr_op,
"terms"))
620 int last = path[strlen(path)-1];
621 if (last !=
'?' && last !=
'&')
627 cp = strrchr(path,
'/');
630 if (!strcmp(cp,
"/select") || !strcmp(cp,
"/"))
634 strcat(path, solr_op);
637 strcat(path, uri_args);
static int node(struct cql_node *cn, void(*pr)(const char *buf, void *client_data), void *client_data)
#define YAZ_SRW_UNSUPP_PARAMETER_VALUE
Z_FacetField * facet_field_create(ODR odr, Z_AttributeList *attributes, int num_terms)
Z_FacetTerm * facet_term_create_cstr(ODR odr, const char *cstr, Odr_int freq)
Z_FacetList * facet_list_create(ODR odr, int num_facets)
void facet_field_term_set(ODR odr, Z_FacetField *field, Z_FacetTerm *facet_term, int index)
void yaz_facet_attr_init(struct yaz_facet_attr *attr_values)
void facet_list_field_set(ODR odr, Z_FacetList *list, Z_FacetField *field, int index)
void yaz_facet_attr_get_z_attributes(const Z_AttributeList *attributes, struct yaz_facet_attr *av)
Header for the facet utilities.
void z_HTTP_header_add_basic_auth(ODR o, Z_HTTP_Header **hp, const char *username, const char *password)
Header for YAZ iconv interface.
Header for Nibble Memory functions + Libxml2 specific stuff.
char * nmem_text_node_cdata(const xmlNode *ptr_cdata, NMEM nmem)
copies TEXT Libxml2 node data to NMEM
char * odr_strdupn(ODR o, const char *str, size_t n)
Odr_int odr_atoi(const char *s)
char * odr_strdup(ODR o, const char *str)
Odr_int * odr_intdup(ODR o, Odr_int v)
void * odr_malloc(ODR o, size_t size)
Z_AttributeList * zget_AttributeList_use_string(ODR o, const char *name)
creates AttributeList with type=1(use) and string value
Header for Z39.50 Protocol.
static void extract_text_node(xmlNodePtr node, WRBUF wrbuf)
static int yaz_solr_encode_facet_field(ODR encode, char **name, char **value, int *i, Z_FacetField *facet_field)
static void yaz_solr_decode_result_docs(ODR o, xmlNodePtr ptr, Odr_int start, Z_SRW_searchRetrieveResponse *sr)
static void yaz_solr_decode_suggestion_lst(xmlNodePtr lstPtr, WRBUF wrbuf)
int yaz_solr_encode_request(Z_HTTP_Request *hreq, Z_SRW_PDU *srw_pdu, ODR encode, const char *charset)
encode SOLR request (HTTP)
static int match_xml_node_attribute(xmlNodePtr ptr, const char *node_name, const char *attribute_name, const char *value)
static void yaz_solr_decode_suggestion_values(xmlNodePtr listPptr, WRBUF wrbuf)
static const char * get_facet_term_count(ODR o, xmlNodePtr node, Odr_int *freq)
static int yaz_solr_decode_spellcheck(ODR o, xmlNodePtr spellcheckPtr, Z_SRW_searchRetrieveResponse *sr)
static int yaz_solr_decode_facet_counts(ODR o, xmlNodePtr root, Z_SRW_searchRetrieveResponse *sr)
static int yaz_solr_encode_facet_list(ODR encode, char **name, char **value, int *i, Z_FacetList *facet_list)
static int yaz_solr_decode_scan_result(ODR o, xmlNodePtr ptr, Z_SRW_scanResponse *scr)
int yaz_solr_decode_response(ODR o, Z_HTTP_Response *hres, Z_SRW_PDU **pdup)
decode SOLR response (HTTP)
static void yaz_solr_decode_misspelled(xmlNodePtr lstPtr, WRBUF wrbuf)
static int yaz_solr_decode_result(ODR o, xmlNodePtr ptr, Z_SRW_searchRetrieveResponse *sr)
Z_FacetField * yaz_solr_decode_facet_field(ODR o, xmlNodePtr ptr, Z_SRW_searchRetrieveResponse *sr)
static int yaz_solr_decode_error(ODR o, xmlNode *ptr, Z_SRW_searchRetrieveResponse *sr)
void yaz_add_name_value_int(ODR o, char **name, char **value, int *i, char *a_name, Odr_int *val)
const char * yaz_element_attribute_value_get(xmlNodePtr ptr, const char *node_name, const char *attribute_name)
void yaz_add_name_value_str(ODR o, char **name, char **value, int *i, char *a_name, char *val)
#define Z_SRW_recordPacking_XML
#define Z_SRW_searchRetrieve_response
#define Z_SRW_scan_request
#define Z_SRW_sort_type_none
#define Z_SRW_sort_type_sort
#define Z_SRW_scan_response
#define Z_SRW_searchRetrieve_request
Z_SRW_PDU * yaz_srw_get(ODR o, int which)
void yaz_add_srw_diagnostic(ODR o, Z_SRW_diagnostic **d, int *num, int code, const char *addinfo)
Z_AttributeList * attributes
Z_SRW_scanRequest * scan_request
Z_SRW_searchRetrieveResponse * response
Z_SRW_extra_arg * extra_args
Z_SRW_scanResponse * scan_response
Z_SRW_searchRetrieveRequest * request
Odr_int * numberOfRecords
union Z_SRW_searchRetrieveRequest::@29 sort
Odr_int * numberOfRecords
Z_SRW_diagnostic * diagnostics
void yaz_array_to_uri(char **path, ODR o, char **name, char **value)
void wrbuf_destroy(WRBUF b)
destroy WRBUF and its buffer
void wrbuf_rewind(WRBUF b)
empty WRBUF content (length of buffer set to 0)
WRBUF wrbuf_alloc(void)
construct WRBUF
void wrbuf_printf(WRBUF b, const char *fmt,...)
writes printf result to WRBUF
void wrbuf_xmlputs(WRBUF b, const char *cp)
writes C-String to WRBUF and XML encode (as CDATA)
const char * wrbuf_cstr(WRBUF b)
returns WRBUF content as C-string
void wrbuf_puts(WRBUF b, const char *buf)
appends C-string to WRBUF
Header for WRBUF (growing buffer)
Header for YAZ iconv interface.