X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Fxmlquery.c;h=1c739209cfc292697f8ab4668c234830d3a4b174;hb=ae309395bf5f5511c2eee751151a2962726f745a;hp=446dec630d2b83cf389ffe36908b8ce946556695;hpb=6671d1583ced9613ab7f12bfed69fd70fd9e6b15;p=yaz-moved-to-github.git diff --git a/src/xmlquery.c b/src/xmlquery.c index 446dec6..1c73920 100644 --- a/src/xmlquery.c +++ b/src/xmlquery.c @@ -1,37 +1,36 @@ -/* - * Copyright (C) 1995-2005, Index Data ApS - * All rights reserved. - * - * $Id: xmlquery.c,v 1.4 2006-02-19 18:44:23 adam Exp $ +/* This file is part of the YAZ toolkit. + * Copyright (C) 1995-2008 Index Data + * See the file LICENSE for details. */ -/** - * \file querytostr.c - * \brief Query / XML conversions - */ +/** \file xmlquery.c + \brief Query / XML conversions +*/ #include #include #include -#if HAVE_XML2 +#if YAZ_HAVE_XML2 #include #include #include #include +#include +#include void yaz_query2xml_attribute_element(const Z_AttributeElement *element, xmlNodePtr parent) { char formstr[30]; const char *setname = 0; + char oid_name_str[OID_STR_MAX]; if (element->attributeSet) { - oident *attrset; - attrset = oid_getentbyoid (element->attributeSet); - setname = attrset->desc; + setname = yaz_oid_to_string_buf(element->attributeSet, + 0, oid_name_str); } if (element->which == Z_AttributeValue_numeric) @@ -207,7 +206,7 @@ xmlNodePtr yaz_query2xml_rpnstructure(const Z_RPNStructure *zs, { Z_Complex *zc = zs->u.complex; - xmlNodePtr node = xmlNewChild(parent, /* NS */ 0, BAD_CAST "binary", 0); + xmlNodePtr node = xmlNewChild(parent, /* NS */ 0, BAD_CAST "operator", 0); if (zc->roperator) yaz_query2xml_operator(zc->roperator, node); yaz_query2xml_rpnstructure(zc->s1, node); @@ -228,9 +227,14 @@ xmlNodePtr yaz_query2xml_rpnstructure(const Z_RPNStructure *zs, xmlNodePtr yaz_query2xml_rpn(const Z_RPNQuery *rpn, xmlNodePtr parent) { - oident *attrset = oid_getentbyoid (rpn->attributeSetId); - if (attrset && attrset->value) - xmlNewProp(parent, BAD_CAST "set", BAD_CAST attrset->desc); + if (rpn->attributeSetId) + { + char oid_name_str[OID_STR_MAX]; + const char *setname = yaz_oid_to_string_buf(rpn->attributeSetId, + 0, oid_name_str); + if (setname) + xmlNewProp(parent, BAD_CAST "set", BAD_CAST setname); + } return yaz_query2xml_rpnstructure(rpn->RPNStructure, parent); } @@ -249,20 +253,18 @@ xmlNodePtr yaz_query2xml_cql(const char *cql, xmlNodePtr node) return 0; } -void yaz_rpnquery2xml(const Z_RPNQuery *rpn, void *docp_void) +void yaz_rpnquery2xml(const Z_RPNQuery *rpn, xmlDocPtr *docp) { Z_Query query; query.which = Z_Query_type_1; query.u.type_1 = (Z_RPNQuery *) rpn; - yaz_query2xml(&query, docp_void); + yaz_query2xml(&query, docp); } -void yaz_query2xml(const Z_Query *q, void *docp_void) +void yaz_query2xml(const Z_Query *q, xmlDocPtr *docp) { - xmlDocPtr *docp = (xmlDocPtr *) docp_void; - xmlNodePtr top_node, child_node = 0; - const char *type = 0; + xmlNodePtr top_node, q_node = 0, child_node = 0; assert(q); assert(docp); @@ -273,31 +275,28 @@ void yaz_query2xml(const Z_Query *q, void *docp_void) { case Z_Query_type_1: case Z_Query_type_101: - type = "rpn"; - child_node = yaz_query2xml_rpn(q->u.type_1, top_node); + q_node = xmlNewChild(top_node, 0, BAD_CAST "rpn", 0); + child_node = yaz_query2xml_rpn(q->u.type_1, q_node); break; case Z_Query_type_2: - type = "ccl"; - child_node = yaz_query2xml_ccl(q->u.type_2, top_node); + q_node = xmlNewChild(top_node, 0, BAD_CAST "ccl", 0); + child_node = yaz_query2xml_ccl(q->u.type_2, q_node); break; case Z_Query_type_100: - type = "z39.58"; - child_node = yaz_query2xml_z3958(q->u.type_100, top_node); + q_node = xmlNewChild(top_node, 0, BAD_CAST "z39.58", 0); + child_node = yaz_query2xml_z3958(q->u.type_100, q_node); break; case Z_Query_type_104: if (q->u.type_104->which == Z_External_CQL) { - type = "cql"; - child_node = yaz_query2xml_cql(q->u.type_104->u.cql, top_node); + q_node = xmlNewChild(top_node, 0, BAD_CAST "cql", 0); + child_node = yaz_query2xml_cql(q->u.type_104->u.cql, q_node); } } - if (child_node && type) + if (child_node && q_node) { *docp = xmlNewDoc(BAD_CAST "1.0"); xmlDocSetRootElement(*docp, top_node); /* make it top node in doc */ - - /* set type attribute now */ - xmlNewProp(top_node, BAD_CAST "type", BAD_CAST type); } else { @@ -457,8 +456,10 @@ void yaz_xml2query_attribute_element(const xmlNode *ptr, *elem = (Z_AttributeElement *) odr_malloc(odr, sizeof(**elem)); if (set) - (*elem)->attributeSet = yaz_str_to_z3950oid(odr, CLASS_ATTSET, - (const char *)set); + (*elem)->attributeSet = yaz_string_to_oid_odr(yaz_oid_std(), + CLASS_ATTSET, + (const char *) set, + odr); else (*elem)->attributeSet = 0; (*elem)->attributeType = intVal(odr, (const char *) type); @@ -505,19 +506,7 @@ void yaz_xml2query_attribute_element(const xmlNode *ptr, char *strVal(const xmlNode *ptr_cdata, ODR odr) { - char *cdata; - int len = 0; - const xmlNode *ptr; - - for (ptr = ptr_cdata; ptr; ptr = ptr->next) - if (ptr->type == XML_TEXT_NODE) - len += xmlStrlen(ptr->content); - cdata = (char *) odr_malloc(odr, len+1); - *cdata = '\0'; - for (ptr = ptr_cdata; ptr; ptr = ptr->next) - if (ptr->type == XML_TEXT_NODE) - strcat(cdata, (const char *) ptr->content); - return cdata; + return nmem_text_node_cdata(ptr_cdata, odr_getmem(odr)); } void yaz_xml2query_term(const xmlNode *ptr, @@ -672,13 +661,13 @@ void yaz_xml2query_rpnstructure(const xmlNode *ptr, Z_RPNStructure **zs, if (!ptr || ptr->type != XML_ELEMENT_NODE) { *error_code = 1; - *addinfo = "missing rpn structure node"; + *addinfo = "missing rpn operator, rset, apt node"; return; } *zs = (Z_RPNStructure *) odr_malloc(odr, sizeof(Z_RPNStructure)); - if (!xmlStrcmp(ptr->name, BAD_CAST "binary")) + if (!xmlStrcmp(ptr->name, BAD_CAST "operator")) { - Z_Complex *zc = odr_malloc(odr, sizeof(Z_Complex)); + Z_Complex *zc = (Z_Complex *) odr_malloc(odr, sizeof(Z_Complex)); (*zs)->which = Z_RPNStructure_complex; (*zs)->u.complex = zc; @@ -728,7 +717,8 @@ void yaz_xml2query_rpn(const xmlNode *ptr, Z_RPNQuery **query, ODR odr, *query = (Z_RPNQuery*) odr_malloc(odr, sizeof(Z_RPNQuery)); if (set) - (*query)->attributeSetId = yaz_str_to_z3950oid(odr, CLASS_ATTSET, set); + (*query)->attributeSetId = yaz_string_to_oid_odr(yaz_oid_std(), + CLASS_ATTSET, set, odr); else (*query)->attributeSetId = 0; yaz_xml2query_rpnstructure(ptr->children, &(*query)->RPNStructure, @@ -741,8 +731,18 @@ static void yaz_xml2query_(const xmlNode *ptr, Z_Query **query, ODR odr, if (ptr && ptr->type == XML_ELEMENT_NODE && !xmlStrcmp(ptr->name, BAD_CAST "query")) { - const char *type = (const char *) - xmlGetProp((xmlNodePtr) ptr, BAD_CAST "type"); + const char *type; + ptr = ptr->children; + while (ptr && ptr->type != XML_ELEMENT_NODE) + ptr = ptr->next; + if (!ptr || ptr->type != XML_ELEMENT_NODE) + { + *error_code = 1; + *addinfo = "missing query content"; + return; + } + type = (const char *) ptr->name; + *query = (Z_Query*) odr_malloc(odr, sizeof(Z_Query)); if (!type || !strcmp(type, "rpn")) { @@ -778,13 +778,13 @@ static void yaz_xml2query_(const xmlNode *ptr, Z_Query **query, ODR odr, } } -void yaz_xml2query(const void *xmlnodep, Z_Query **query, ODR odr, +void yaz_xml2query(const xmlNode *xmlnodep, Z_Query **query, ODR odr, int *error_code, const char **addinfo) { - return yaz_xml2query_(xmlnodep, query, odr, error_code, addinfo); + yaz_xml2query_(xmlnodep, query, odr, error_code, addinfo); } -/* HAVE_XML2 */ +/* YAZ_HAVE_XML2 */ #endif /*