/* This file is part of the YAZ toolkit.
- * Copyright (C) 1995-2009 Index Data
+ * Copyright (C) 1995-2010 Index Data
* See the file LICENSE for details.
*/
#include <yaz/nmem_xml.h>
#include <yaz/oid_db.h>
-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;
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)
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 ==
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);
}
}
-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);
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:
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;
}
-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)
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)
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;
}
}
-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)
{
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)
{
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;
}
}
}
-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;
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
*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;
}
}
-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;
}
}
-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;
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"))
}
}
-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)
{
}
}
-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;
*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"))
{
}
}
-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,
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"))
{