#include <libxml/parser.h>
#include <libxml/tree.h>
-const char *xml_node_attribute_value_get(xmlNodePtr ptr, const char *node_name, const char *attribute_name) {
-
- struct _xmlAttr *attr;
- // check if the node name matches
- if (strcmp((const char*) ptr->name, node_name))
- return 0;
- // check if the attribute name and return the value
- for (attr = ptr->properties; attr; attr = attr->next)
- if (attr->children && attr->children->type == XML_TEXT_NODE) {
- if (!strcmp((const char *) attr->name, attribute_name))
- return (const char *) attr->children->content;
- }
- return 0;
-}
-
-
static int match_xml_node_attribute(xmlNodePtr ptr, const char *node_name, const char *attribute_name, const char *value)
{
const char *attribute_value;
// check if the node name matches
if (strcmp((const char*) ptr->name, node_name))
return 0;
- attribute_value = xml_node_attribute_value_get(ptr, node_name, attribute_name);
- if (attribute_value && !strcmp(attribute_value, value))
+ if (attribute_name) {
+ attribute_value = yaz_element_attribute_value_get(ptr, node_name, attribute_name);
+ if (attribute_value && !strcmp(attribute_value, value))
+ return 1;
+ }
+ else /* No attribute to check */
return 1;
return 0;
}
return -1;
}
-static Z_AttributeList *yaz_solr_use_atttribute_create(ODR o, const char *name) {
- Z_AttributeList *attributes= (Z_AttributeList *) odr_malloc(o, sizeof(*attributes));
- Z_AttributeElement ** elements;
- attributes->num_attributes = 1;
- /* TODO check on name instead
- if (!attributes->num_attributes) {
- attributes->attributes = (Z_AttributeElement**)odr_nullval();
- return attributes;
- }
- */
- elements = (Z_AttributeElement**) odr_malloc (o, attributes->num_attributes * sizeof(*elements));
- elements[0] = (Z_AttributeElement*)odr_malloc(o,sizeof(**elements));
- elements[0]->attributeType = odr_malloc(o, sizeof(*elements[0]->attributeType));
- *elements[0]->attributeType = 1;
- elements[0]->attributeSet = odr_nullval();
- elements[0]->which = Z_AttributeValue_complex;
- elements[0]->value.complex = (Z_ComplexAttribute *) odr_malloc(o, sizeof(Z_ComplexAttribute));
- elements[0]->value.complex->num_list = 1;
- elements[0]->value.complex->list = (Z_StringOrNumeric **) odr_malloc(o, 1 * sizeof(Z_StringOrNumeric *));
- elements[0]->value.complex->list[0] = (Z_StringOrNumeric *) odr_malloc(o, sizeof(Z_StringOrNumeric));
- elements[0]->value.complex->list[0]->which = Z_StringOrNumeric_string;
- elements[0]->value.complex->list[0]->u.string = (Z_InternationalString *) odr_strdup(o, name);
- elements[0]->value.complex->semanticAction = 0;
- elements[0]->value.complex->num_semanticAction = 0;
- attributes->attributes = elements;
- return attributes;
-}
-
-
static const char *get_facet_term_count(xmlNodePtr node, int *freq) {
- const char *term = xml_node_attribute_value_get(node, "int", "name");
+ const char *term = yaz_element_attribute_value_get(node, "int", "name");
xmlNodePtr child;
WRBUF wrbuf = wrbuf_alloc();
if (!term)
int index = 0;
xmlNodePtr node;
// USE attribute
- const char* name = xml_node_attribute_value_get(ptr, "lst", "name");
+ const char* name = yaz_element_attribute_value_get(ptr, "lst", "name");
char *pos = strstr(name, "_exact");
/* HACK */
if (pos) {
pos[0] = 0;
}
- list = yaz_solr_use_atttribute_create(o, name);
+ list = yaz_use_atttribute_create(o, name);
for (node = ptr->children; node; node = node->next) {
num_terms++;
}
void yaz_add_name_value_int(ODR o, char **name, char **value, int *i,
char *a_name, Odr_int *val);
+
+Z_AttributeList *yaz_use_atttribute_create(ODR o, const char *name);
+
+#if YAZ_HAVE_XML2
+#include <libxml/parser.h>
+#include <libxml/tree.h>
+const char *yaz_element_attribute_value_get(xmlNodePtr ptr, const char *node_name, const char *attribute_name);
+#endif
+
/*
* Local variables:
* c-basic-offset: 4
#include <config.h>
#endif
+#include <stdlib.h>
+
#include <yaz/srw.h>
+#include <yaz/wrbuf.h>
#if YAZ_HAVE_XML2
#include <libxml/parser.h>
#include <libxml/tree.h>
#include <assert.h>
+#include "sru-p.h"
+
static void add_XML_n(xmlNodePtr ptr, const char *elem, char *val, int len,
xmlNsPtr ns_ptr)
{
return 0;
}
+Z_FacetTerm *yaz_sru_proxy_get_facet_term_count(ODR odr, xmlNodePtr node) {
+
+ int freq;
+ xmlNodePtr child;
+ WRBUF wrbuf = wrbuf_alloc();
+ const char *freq_string = yaz_element_attribute_value_get(node, "facetvalue", "est_representation");
+ Z_Term *term;
+ if (freq_string)
+ freq = atoi(freq_string);
+ else
+ freq = -1;
+
+ for (child = node->children; child ; child = child->next) {
+ if (child->type == XML_TEXT_NODE)
+ wrbuf_puts(wrbuf, (const char *) child->content);
+ }
+ term = term_create(odr, wrbuf_cstr(wrbuf));
+ yaz_log(YLOG_DEBUG, "sru-proxy facet: %s %d", wrbuf_cstr(wrbuf), freq);
+ wrbuf_destroy(wrbuf);
+ return facet_term_create(odr, term, freq);
+};
+
+static Z_FacetField *yaz_sru_proxy_decode_facet_field(ODR odr, xmlNodePtr ptr) {
+ Z_AttributeList *list;
+ Z_FacetField *facet_field;
+ int num_terms = 0;
+ int index = 0;
+ xmlNodePtr node;
+ // USE attribute
+ const char* name = yaz_element_attribute_value_get(ptr, "facet", "code");
+ yaz_log(YLOG_DEBUG, "sru-proxy facet type: %s", name);
+
+ list = yaz_use_atttribute_create(odr, name);
+ for (node = ptr->children; node; node = node->next) {
+ if (match_element(node, "facetvalue"))
+ num_terms++;
+ }
+ facet_field = facet_field_create(odr, list, num_terms);
+ index = 0;
+ for (node = ptr->children; node; node = node->next) {
+ if (match_element(node, "facetvalue")) {
+ facet_field_term_set(odr, facet_field, yaz_sru_proxy_get_facet_term_count(odr, node), index);
+ index++;
+ }
+ }
+ return facet_field;
+}
+
+static int yaz_sru_proxy_decode_facets(ODR o, xmlNodePtr root, Z_FacetList **facetList)
+{
+ xmlNodePtr ptr;
+
+ for (ptr = root->children; ptr; ptr = ptr->next)
+ {
+ if (match_element(ptr, "facets"))
+ {
+ xmlNodePtr node;
+ Z_FacetList *facet_list;
+ int num_facets = 0;
+ for (node = ptr->children; node; node= node->next)
+ {
+ if (node->type == XML_ELEMENT_NODE)
+ num_facets++;
+ }
+ facet_list = facet_list_create(o, num_facets);
+ num_facets = 0;
+ for (node = ptr->children; node; node= node->next)
+ {
+ if (match_element(node, "facet")) {
+ facet_list_field_set(o, facet_list, yaz_sru_proxy_decode_facet_field(o, node), num_facets);
+ num_facets++;
+ }
+ }
+ *facetList = facet_list;
+ break;
+ }
+ }
+ return 0;
+}
+
+
static int yaz_srw_decode_diagnostics(ODR o, xmlNodePtr pptr,
Z_SRW_diagnostic **recs, int *num,
void *client_data, const char *ns)
-
{
int i;
xmlNodePtr ptr;
yaz_srw_diagnostics(o, ptr, &res->diagnostics,
&res->num_diagnostics,
client_data, ns);
+ else if (match_element(ptr, "facet_analysis"))
+ yaz_sru_proxy_decode_facets(o, ptr, &res->facetList);
}
}
else if (!xmlStrcmp(method->name, BAD_CAST "explainRequest"))
return dst;
}
+Z_AttributeList *yaz_use_atttribute_create(ODR o, const char *name) {
+ Z_AttributeList *attributes= (Z_AttributeList *) odr_malloc(o, sizeof(*attributes));
+ Z_AttributeElement ** elements;
+ attributes->num_attributes = 1;
+ /* TODO check on name instead
+ if (!attributes->num_attributes) {
+ attributes->attributes = (Z_AttributeElement**)odr_nullval();
+ return attributes;
+ }
+ */
+ elements = (Z_AttributeElement**) odr_malloc (o, attributes->num_attributes * sizeof(*elements));
+ elements[0] = (Z_AttributeElement*)odr_malloc(o,sizeof(**elements));
+ elements[0]->attributeType = odr_malloc(o, sizeof(*elements[0]->attributeType));
+ *elements[0]->attributeType = 1;
+ elements[0]->attributeSet = odr_nullval();
+ elements[0]->which = Z_AttributeValue_complex;
+ elements[0]->value.complex = (Z_ComplexAttribute *) odr_malloc(o, sizeof(Z_ComplexAttribute));
+ elements[0]->value.complex->num_list = 1;
+ elements[0]->value.complex->list = (Z_StringOrNumeric **) odr_malloc(o, 1 * sizeof(Z_StringOrNumeric *));
+ elements[0]->value.complex->list[0] = (Z_StringOrNumeric *) odr_malloc(o, sizeof(Z_StringOrNumeric));
+ elements[0]->value.complex->list[0]->which = Z_StringOrNumeric_string;
+ elements[0]->value.complex->list[0]->u.string = (Z_InternationalString *) odr_strdup(o, name);
+ elements[0]->value.complex->semanticAction = 0;
+ elements[0]->value.complex->num_semanticAction = 0;
+ attributes->attributes = elements;
+ return attributes;
+}
+
#if YAZ_HAVE_XML2
+const char *yaz_element_attribute_value_get(xmlNodePtr ptr, const char *node_name, const char *attribute_name) {
+
+ struct _xmlAttr *attr;
+ // check if the node name matches
+ if (strcmp((const char*) ptr->name, node_name))
+ return 0;
+ // check if the attribute name and return the value
+ for (attr = ptr->properties; attr; attr = attr->next)
+ if (attr->children && attr->children->type == XML_TEXT_NODE) {
+ if (!strcmp((const char *) attr->name, attribute_name))
+ return (const char *) attr->children->content;
+ }
+ return 0;
+}
+
+
static int yaz_base64decode(const char *in, char *out)
{
const char *map = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
odr_malloc(encode, strlen(hreq->path) + strlen(uri_args) + 4);
sprintf(path, "%s?%s", hreq->path, uri_args);
+ yaz_log(YLOG_DEBUG, "SRU HTTP Get Request %s", path);
hreq->path = path;
z_HTTP_header_add_content_type(encode, &hreq->headers,