X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=src%2Fxmlquery.c;h=e4d287e4d424b1c24678e9cdfebcb0b9694ae9c5;hp=994a90e60c722f29763e9487b200de304c7d00f7;hb=b6aa93dcb5c07ed09b664c006b5f33b0135a0854;hpb=7a4064cd15f6c6b34c1180e1bc51f0d0e90da320 diff --git a/src/xmlquery.c b/src/xmlquery.c index 994a90e..e4d287e 100644 --- a/src/xmlquery.c +++ b/src/xmlquery.c @@ -1,8 +1,6 @@ -/* - * Copyright (C) 1995-2007, Index Data ApS - * All rights reserved. - * - * $Id: xmlquery.c,v 1.13 2007-04-12 13:52:57 adam Exp $ +/* This file is part of the YAZ toolkit. + * Copyright (C) 1995-2010 Index Data + * See the file LICENSE for details. */ /** \file xmlquery.c @@ -20,9 +18,49 @@ #include #include #include +#include -void yaz_query2xml_attribute_element(const Z_AttributeElement *element, - xmlNodePtr parent) +static int check_diagnostic(const xmlNode *ptr, ODR odr, + int *error_code, const char **addinfo) +{ + if (ptr && ptr->type == XML_ELEMENT_NODE && + !xmlStrcmp(ptr->name, BAD_CAST "diagnostic")) + { + struct _xmlAttr *attr; + const char *code_str = 0; + const char *addinfo_str = 0; + for (attr = ptr->properties; attr; attr = attr->next) + { + if (!xmlStrcmp(attr->name, BAD_CAST "code") && + attr->children && attr->children->type == XML_TEXT_NODE) + code_str = (const char *) attr->children->content; + else if (!xmlStrcmp(attr->name, BAD_CAST "addinfo") && + attr->children && attr->children->type == XML_TEXT_NODE) + addinfo_str = (const char *) attr->children->content; + else + { + *error_code = 1; + *addinfo = "bad attribute for diagnostic element"; + return 1; + } + } + if (!code_str) + { + *error_code = 1; + *addinfo = "missing @code for diagnostic element"; + return 1; + } + *error_code = atoi(code_str); + if (addinfo_str) + *addinfo = odr_strdup(odr, addinfo_str); + return 1; + } + else + return 0; +} + +static void yaz_query2xml_attribute_element(const Z_AttributeElement *element, + xmlNodePtr parent) { char formstr[30]; const char *setname = 0; @@ -41,10 +79,11 @@ void yaz_query2xml_attribute_element(const Z_AttributeElement *element, if (setname) xmlNewProp(node, BAD_CAST "set", BAD_CAST setname); - sprintf(formstr, "%d", *element->attributeType); + assert(*element->attributeType > 0 && *element->attributeType < 20); + sprintf(formstr, ODR_INT_PRINTF, *element->attributeType); xmlNewProp(node, BAD_CAST "type", BAD_CAST formstr); - sprintf(formstr, "%d", *element->value.numeric); + sprintf(formstr, ODR_INT_PRINTF, *element->value.numeric); xmlNewProp(node, BAD_CAST "value", BAD_CAST formstr); } else if (element->which == Z_AttributeValue_complex) @@ -57,7 +96,7 @@ void yaz_query2xml_attribute_element(const Z_AttributeElement *element, if (setname) xmlNewProp(node, BAD_CAST "set", BAD_CAST setname); - sprintf(formstr, "%d", *element->attributeType); + sprintf(formstr, ODR_INT_PRINTF, *element->attributeType); xmlNewProp(node, BAD_CAST "type", BAD_CAST formstr); if (element->value.complex->list[i]->which == @@ -69,7 +108,7 @@ void yaz_query2xml_attribute_element(const Z_AttributeElement *element, else if (element->value.complex->list[i]->which == Z_StringOrNumeric_numeric) { - sprintf(formstr, "%d", + sprintf(formstr, ODR_INT_PRINTF, *element->value.complex->list[i]->u.numeric); xmlNewProp(node, BAD_CAST "value", BAD_CAST formstr); } @@ -78,8 +117,7 @@ void yaz_query2xml_attribute_element(const Z_AttributeElement *element, } -xmlNodePtr yaz_query2xml_term(const Z_Term *term, - xmlNodePtr parent) +static xmlNodePtr yaz_query2xml_term(const Z_Term *term, xmlNodePtr parent) { xmlNodePtr t = 0; xmlNodePtr node = xmlNewChild(parent, /* NS */ 0, BAD_CAST "term", 0); @@ -94,7 +132,7 @@ xmlNodePtr yaz_query2xml_term(const Z_Term *term, break; case Z_Term_numeric: type = "numeric"; - sprintf(formstr, "%d", *term->u.numeric); + sprintf(formstr, ODR_INT_PRINTF, *term->u.numeric); t = xmlNewText(BAD_CAST formstr); break; case Z_Term_characterString: @@ -126,8 +164,8 @@ xmlNodePtr yaz_query2xml_term(const Z_Term *term, return node; } -xmlNodePtr yaz_query2xml_apt(const Z_AttributesPlusTerm *zapt, - xmlNodePtr parent) +static xmlNodePtr yaz_query2xml_apt(const Z_AttributesPlusTerm *zapt, + xmlNodePtr parent) { xmlNodePtr node = xmlNewChild(parent, /* NS */ 0, BAD_CAST "apt", 0); int num_attributes = zapt->attributes->num_attributes; @@ -140,7 +178,7 @@ xmlNodePtr yaz_query2xml_apt(const Z_AttributesPlusTerm *zapt, } -void yaz_query2xml_operator(Z_Operator *op, xmlNodePtr node) +static void yaz_query2xml_operator(Z_Operator *op, xmlNodePtr node) { const char *type = 0; switch(op->which) @@ -173,7 +211,7 @@ void yaz_query2xml_operator(Z_Operator *op, xmlNodePtr node) else xmlNewProp(node, BAD_CAST "exclusion", BAD_CAST "false"); } - sprintf(formstr, "%d", *op->u.prox->distance); + sprintf(formstr, ODR_INT_PRINTF, *op->u.prox->distance); xmlNewProp(node, BAD_CAST "distance", BAD_CAST formstr); if (*op->u.prox->ordered) @@ -181,13 +219,13 @@ void yaz_query2xml_operator(Z_Operator *op, xmlNodePtr node) else xmlNewProp(node, BAD_CAST "ordered", BAD_CAST "false"); - sprintf(formstr, "%d", *op->u.prox->relationType); + sprintf(formstr, ODR_INT_PRINTF, *op->u.prox->relationType); xmlNewProp(node, BAD_CAST "relationType", BAD_CAST formstr); switch(op->u.prox->which) { case Z_ProximityOperator_known: - sprintf(formstr, "%d", *op->u.prox->u.known); + sprintf(formstr, ODR_INT_PRINTF, *op->u.prox->u.known); xmlNewProp(node, BAD_CAST "knownProximityUnit", BAD_CAST formstr); break; @@ -200,8 +238,8 @@ void yaz_query2xml_operator(Z_Operator *op, xmlNodePtr node) } } -xmlNodePtr yaz_query2xml_rpnstructure(const Z_RPNStructure *zs, - xmlNodePtr parent) +static xmlNodePtr yaz_query2xml_rpnstructure(const Z_RPNStructure *zs, + xmlNodePtr parent) { if (zs->which == Z_RPNStructure_complex) { @@ -226,7 +264,7 @@ xmlNodePtr yaz_query2xml_rpnstructure(const Z_RPNStructure *zs, return 0; } -xmlNodePtr yaz_query2xml_rpn(const Z_RPNQuery *rpn, xmlNodePtr parent) +static xmlNodePtr yaz_query2xml_rpn(const Z_RPNQuery *rpn, xmlNodePtr parent) { if (rpn->attributeSetId) { @@ -239,17 +277,17 @@ xmlNodePtr yaz_query2xml_rpn(const Z_RPNQuery *rpn, xmlNodePtr parent) return yaz_query2xml_rpnstructure(rpn->RPNStructure, parent); } -xmlNodePtr yaz_query2xml_ccl(const Odr_oct *ccl, xmlNodePtr node) +static xmlNodePtr yaz_query2xml_ccl(const Odr_oct *ccl, xmlNodePtr node) { return 0; } -xmlNodePtr yaz_query2xml_z3958(const Odr_oct *ccl, xmlNodePtr node) +static xmlNodePtr yaz_query2xml_z3958(const Odr_oct *ccl, xmlNodePtr node) { return 0; } -xmlNodePtr yaz_query2xml_cql(const char *cql, xmlNodePtr node) +static xmlNodePtr yaz_query2xml_cql(const char *cql, xmlNodePtr node) { return 0; } @@ -306,23 +344,23 @@ void yaz_query2xml(const Z_Query *q, xmlDocPtr *docp) } } -bool_t *boolVal(ODR odr, const char *str) +static bool_t *boolVal(ODR odr, const char *str) { if (*str == '\0' || strchr("0fF", *str)) - return odr_intdup(odr, 0); - return odr_intdup(odr, 1); + return odr_booldup(odr, 0); + return odr_booldup(odr, 1); } -int *intVal(ODR odr, const char *str) +static Odr_int *intVal(ODR odr, const char *str) { return odr_intdup(odr, atoi(str)); } -void yaz_xml2query_operator(const xmlNode *ptr, Z_Operator **op, - ODR odr, int *error_code, const char **addinfo) +static void yaz_xml2query_operator(const xmlNode *ptr, Z_Operator **op, + ODR odr, + int *error_code, const char **addinfo) { - const char *type = (const char *) - xmlGetProp((xmlNodePtr) ptr, BAD_CAST "type"); + xmlChar *type = xmlGetProp((xmlNodePtr) ptr, BAD_CAST "type"); if (!type) { *error_code = 1; @@ -330,78 +368,66 @@ void yaz_xml2query_operator(const xmlNode *ptr, Z_Operator **op, return; } *op = (Z_Operator*) odr_malloc(odr, sizeof(Z_Operator)); - if (!strcmp(type, "and")) + if (!xmlStrcmp(type, BAD_CAST "and")) { (*op)->which = Z_Operator_and; (*op)->u.op_and = odr_nullval(); } - else if (!strcmp(type, "or")) + else if (!xmlStrcmp(type, BAD_CAST "or")) { (*op)->which = Z_Operator_or; (*op)->u.op_or = odr_nullval(); } - else if (!strcmp(type, "not")) + else if (!xmlStrcmp(type, BAD_CAST "not")) { (*op)->which = Z_Operator_and_not; (*op)->u.and_not = odr_nullval(); } - else if (!strcmp(type, "prox")) + else if (!xmlStrcmp(type, BAD_CAST "prox")) { - const char *atval; - Z_ProximityOperator *pop = (Z_ProximityOperator *) - odr_malloc(odr, sizeof(Z_ProximityOperator)); - + struct _xmlAttr *attr; + Z_ProximityOperator *pop = (Z_ProximityOperator *) + odr_malloc(odr, sizeof(*pop)); (*op)->which = Z_Operator_prox; (*op)->u.prox = pop; + /* default values */ + pop->exclusion = 0; + pop->ordered = odr_booldup(odr, 1); + pop->relationType = + odr_intdup(odr, Z_ProximityOperator_Prox_lessThanOrEqual); + pop->which = Z_ProximityOperator_known; + pop->u.known = odr_intdup(odr, Z_ProxUnit_word); + pop->distance = odr_intdup(odr, 1); - atval = (const char *) xmlGetProp((xmlNodePtr) ptr, - BAD_CAST "exclusion"); - if (atval) - pop->exclusion = boolVal(odr, atval); - else - pop->exclusion = 0; - - atval = (const char *) xmlGetProp((xmlNodePtr) ptr, - BAD_CAST "distance"); - if (atval) - pop->distance = intVal(odr, atval); - else - pop->distance = odr_intdup(odr, 1); - - atval = (const char *) xmlGetProp((xmlNodePtr) ptr, - BAD_CAST "ordered"); - if (atval) - pop->ordered = boolVal(odr, atval); - else - pop->ordered = odr_intdup(odr, 1); - - atval = (const char *) xmlGetProp((xmlNodePtr) ptr, - BAD_CAST "relationType"); - if (atval) - pop->relationType = intVal(odr, atval); - else - pop->relationType = - odr_intdup(odr, Z_ProximityOperator_Prox_lessThanOrEqual); - - atval = (const char *) xmlGetProp((xmlNodePtr) ptr, - BAD_CAST "knownProximityUnit"); - if (atval) - { - pop->which = Z_ProximityOperator_known; - pop->u.known = intVal(odr, atval); - } - else - { - pop->which = Z_ProximityOperator_known; - pop->u.known = odr_intdup(odr, Z_ProxUnit_word); - } - - atval = (const char *) xmlGetProp((xmlNodePtr) ptr, - BAD_CAST "privateProximityUnit"); - if (atval) + for (attr = ptr->properties; attr; attr = attr->next) { - pop->which = Z_ProximityOperator_private; - pop->u.zprivate = intVal(odr, atval); + const char *value = (const char *) attr->children->content; + if (!xmlStrcmp(attr->name, BAD_CAST "type")) + ; + else if (!xmlStrcmp(attr->name, BAD_CAST "exclusion")) + pop->exclusion = boolVal(odr, value); + else if (!xmlStrcmp(attr->name, BAD_CAST "distance")) + pop->distance = intVal(odr, value); + else if (!xmlStrcmp(attr->name, BAD_CAST "ordered")) + pop->ordered = boolVal(odr, value); + else if (!xmlStrcmp(attr->name, BAD_CAST "relationType")) + pop->relationType = intVal(odr, value); + else if (!xmlStrcmp(attr->name, BAD_CAST "knownProximityUnit")) + { + pop->which = Z_ProximityOperator_known; + pop->u.known = intVal(odr, value); + } + else if (!xmlStrcmp(attr->name, BAD_CAST "privateProximityUnit")) + { + pop->which = Z_ProximityOperator_private; + pop->u.known = intVal(odr, value); + } + else + { + *error_code = 1; + *addinfo = "bad proximity attribute"; + break; + } } } else @@ -409,11 +435,13 @@ void yaz_xml2query_operator(const xmlNode *ptr, Z_Operator **op, *error_code = 1; *addinfo = "bad operator type"; } + xmlFree(type); } -void yaz_xml2query_attribute_element(const xmlNode *ptr, - Z_AttributeElement **elem, ODR odr, - int *error_code, const char **addinfo) +static void yaz_xml2query_attribute_element(const xmlNode *ptr, + Z_AttributeElement **elem, ODR odr, + int *error_code, + const char **addinfo) { int i; xmlChar *set = 0; @@ -505,14 +533,13 @@ void yaz_xml2query_attribute_element(const xmlNode *ptr, } } -char *strVal(const xmlNode *ptr_cdata, ODR odr) +static char *strVal(const xmlNode *ptr_cdata, ODR odr) { return nmem_text_node_cdata(ptr_cdata, odr_getmem(odr)); } -void yaz_xml2query_term(const xmlNode *ptr, - Z_Term **term, ODR odr, - int *error_code, const char **addinfo) +static void yaz_xml2query_term(const xmlNode *ptr, Z_Term **term, ODR odr, + int *error_code, const char **addinfo) { xmlChar *type = 0; struct _xmlAttr *attr; @@ -575,9 +602,9 @@ void yaz_xml2query_term(const xmlNode *ptr, } } -void yaz_xml2query_apt(const xmlNode *ptr_apt, - Z_AttributesPlusTerm **zapt, ODR odr, - int *error_code, const char **addinfo) +static void yaz_xml2query_apt(const xmlNode *ptr_apt, + Z_AttributesPlusTerm **zapt, ODR odr, + int *error_code, const char **addinfo) { const xmlNode *ptr = ptr_apt->children; int i, num_attr = 0; @@ -619,6 +646,9 @@ void yaz_xml2query_apt(const xmlNode *ptr_apt, else break; } + if (check_diagnostic(ptr, odr, error_code, addinfo)) + return; + if (ptr && ptr->type == XML_ELEMENT_NODE) { if (!xmlStrcmp(ptr->name, BAD_CAST "term")) @@ -639,8 +669,8 @@ void yaz_xml2query_apt(const xmlNode *ptr_apt, } } -void yaz_xml2query_rset(const xmlNode *ptr, Z_ResultSetId **rset, - ODR odr, int *error_code, const char **addinfo) +static void yaz_xml2query_rset(const xmlNode *ptr, Z_ResultSetId **rset, + ODR odr, int *error_code, const char **addinfo) { if (ptr->children) { @@ -653,8 +683,9 @@ void yaz_xml2query_rset(const xmlNode *ptr, Z_ResultSetId **rset, } } -void yaz_xml2query_rpnstructure(const xmlNode *ptr, Z_RPNStructure **zs, - ODR odr, int *error_code, const char **addinfo) +static void yaz_xml2query_rpnstructure(const xmlNode *ptr, Z_RPNStructure **zs, + ODR odr, + int *error_code, const char **addinfo) { while (ptr && ptr->type != XML_ELEMENT_NODE) ptr = ptr->next; @@ -665,10 +696,13 @@ void yaz_xml2query_rpnstructure(const xmlNode *ptr, Z_RPNStructure **zs, *addinfo = "missing rpn operator, rset, apt node"; return; } + if (check_diagnostic(ptr, odr, error_code, addinfo)) + return; + *zs = (Z_RPNStructure *) odr_malloc(odr, sizeof(Z_RPNStructure)); 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; @@ -710,16 +744,19 @@ void yaz_xml2query_rpnstructure(const xmlNode *ptr, Z_RPNStructure **zs, } } -void yaz_xml2query_rpn(const xmlNode *ptr, Z_RPNQuery **query, ODR odr, - int *error_code, const char **addinfo) +static void yaz_xml2query_rpn(const xmlNode *ptr, Z_RPNQuery **query, ODR odr, + int *error_code, const char **addinfo) { - const char *set = (const char *) - xmlGetProp((xmlNodePtr) ptr, BAD_CAST "set"); + xmlChar *set = xmlGetProp((xmlNodePtr) ptr, BAD_CAST "set"); *query = (Z_RPNQuery*) odr_malloc(odr, sizeof(Z_RPNQuery)); if (set) - (*query)->attributeSetId = yaz_string_to_oid_odr(yaz_oid_std(), - CLASS_ATTSET, set, odr); + { + (*query)->attributeSetId = + yaz_string_to_oid_odr(yaz_oid_std(), + CLASS_ATTSET, (const char *) set, odr); + xmlFree(set); + } else (*query)->attributeSetId = 0; yaz_xml2query_rpnstructure(ptr->children, &(*query)->RPNStructure, @@ -729,6 +766,8 @@ void yaz_xml2query_rpn(const xmlNode *ptr, Z_RPNQuery **query, ODR odr, static void yaz_xml2query_(const xmlNode *ptr, Z_Query **query, ODR odr, int *error_code, const char **addinfo) { + if (check_diagnostic(ptr, odr, error_code, addinfo)) + return; if (ptr && ptr->type == XML_ELEMENT_NODE && !xmlStrcmp(ptr->name, BAD_CAST "query")) { @@ -779,7 +818,7 @@ 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) { yaz_xml2query_(xmlnodep, query, odr, error_code, addinfo); @@ -791,7 +830,9 @@ void yaz_xml2query(const void *xmlnodep, Z_Query **query, ODR odr, /* * Local variables: * c-basic-offset: 4 + * c-file-style: "Stroustrup" * indent-tabs-mode: nil * End: * vim: shiftwidth=4 tabstop=8 expandtab */ +