18#include <libxml/parser.h>
19#include <libxml/tree.h>
28 int *error_code,
const char **addinfo)
30 if (ptr && ptr->type == XML_ELEMENT_NODE &&
31 !xmlStrcmp(ptr->name, BAD_CAST
"diagnostic"))
33 struct _xmlAttr *attr;
34 const char *code_str = 0;
35 const char *addinfo_str = 0;
36 for (attr = ptr->properties; attr; attr = attr->next)
38 if (!xmlStrcmp(attr->name, BAD_CAST
"code") &&
39 attr->children && attr->children->type == XML_TEXT_NODE)
40 code_str = (
const char *) attr->children->content;
41 else if (!xmlStrcmp(attr->name, BAD_CAST
"addinfo") &&
42 attr->children && attr->children->type == XML_TEXT_NODE)
43 addinfo_str = (
const char *) attr->children->content;
47 *addinfo =
"bad attribute for diagnostic element";
54 *addinfo =
"missing @code for diagnostic element";
57 *error_code = atoi(code_str);
70 const char *setname = 0;
81 xmlNodePtr node = xmlNewChild(parent, 0, BAD_CAST
"attr", 0);
84 xmlNewProp(node, BAD_CAST
"set", BAD_CAST setname);
87 xmlNewProp(node, BAD_CAST
"type", BAD_CAST formstr);
90 xmlNewProp(node, BAD_CAST
"value", BAD_CAST formstr);
97 xmlNodePtr node = xmlNewChild(parent, 0, BAD_CAST
"attr", 0);
100 xmlNewProp(node, BAD_CAST
"set", BAD_CAST setname);
103 xmlNewProp(node, BAD_CAST
"type", BAD_CAST formstr);
108 xmlNewProp(node, BAD_CAST
"value", BAD_CAST
116 xmlNewProp(node, BAD_CAST
"value", BAD_CAST formstr);
126 xmlNodePtr node = xmlNewChild(parent, 0, BAD_CAST
"term", 0);
128 const char *
type = 0;
139 t = xmlNewText(BAD_CAST formstr);
155 type =
"integerAndUnit";
164 xmlAddChild(node, t);
166 xmlNewProp(node, BAD_CAST
"type", BAD_CAST
type);
173 xmlNodePtr node = xmlNewChild(parent, 0, BAD_CAST
"apt", 0);
176 for (i = 0; i<num_attributes; i++)
186 const char *
type = 0;
204 xmlNewProp(node, BAD_CAST
"type", BAD_CAST
type);
213 xmlNewProp(node, BAD_CAST
"exclusion", BAD_CAST
"true");
215 xmlNewProp(node, BAD_CAST
"exclusion", BAD_CAST
"false");
218 xmlNewProp(node, BAD_CAST
"distance", BAD_CAST formstr);
221 xmlNewProp(node, BAD_CAST
"ordered", BAD_CAST
"true");
223 xmlNewProp(node, BAD_CAST
"ordered", BAD_CAST
"false");
226 xmlNewProp(node, BAD_CAST
"relationType", BAD_CAST formstr);
232 xmlNewProp(node, BAD_CAST
"knownProximityUnit",
237 xmlNewProp(node, BAD_CAST
"privateProximityUnit",
251 xmlNodePtr node = xmlNewChild(parent, 0, BAD_CAST
"operator", 0);
264 return xmlNewChild(parent, 0, BAD_CAST
"rset",
278 xmlNewProp(parent, BAD_CAST
"set", BAD_CAST setname);
309 xmlNodePtr top_node, q_node = 0, child_node = 0;
314 top_node = xmlNewNode(0, BAD_CAST
"query");
320 q_node = xmlNewChild(top_node, 0, BAD_CAST
"rpn", 0);
324 q_node = xmlNewChild(top_node, 0, BAD_CAST
"ccl", 0);
328 q_node = xmlNewChild(top_node, 0, BAD_CAST
"z39.58", 0);
334 q_node = xmlNewChild(top_node, 0, BAD_CAST
"cql", 0);
338 if (child_node && q_node)
340 *docp = xmlNewDoc(BAD_CAST
"1.0");
341 xmlDocSetRootElement(*docp, top_node);
346 xmlFreeNode(top_node);
352 if (*str ==
'\0' || strchr(
"0fF", *str))
364 int *error_code,
const char **addinfo)
370 *addinfo =
"no operator type";
374 if (!strcmp(
type,
"and"))
379 else if (!strcmp(
type,
"or"))
384 else if (!strcmp(
type,
"not"))
389 else if (!strcmp(
type,
"prox"))
391 struct _xmlAttr *attr;
405 for (attr = ptr->properties; attr; attr = attr->next)
407 const char *value = (
const char *) attr->children->content;
408 if (!xmlStrcmp(attr->name, BAD_CAST
"type"))
410 else if (!xmlStrcmp(attr->name, BAD_CAST
"exclusion"))
412 else if (!xmlStrcmp(attr->name, BAD_CAST
"distance"))
414 else if (!xmlStrcmp(attr->name, BAD_CAST
"ordered"))
416 else if (!xmlStrcmp(attr->name, BAD_CAST
"relationType"))
418 else if (!xmlStrcmp(attr->name, BAD_CAST
"knownProximityUnit"))
423 else if (!xmlStrcmp(attr->name, BAD_CAST
"privateProximityUnit"))
431 *addinfo =
"bad proximity attribute";
439 *addinfo =
"bad operator type";
446 const char **addinfo)
453 struct _xmlAttr *attr;
454 for (attr = ptr->properties; attr; attr = attr->next)
456 if (!xmlStrcmp(attr->name, BAD_CAST
"set") &&
457 attr->children && attr->children->type == XML_TEXT_NODE)
458 set = attr->children->content;
459 else if (!xmlStrcmp(attr->name, BAD_CAST
"type") &&
460 attr->children && attr->children->type == XML_TEXT_NODE)
461 type = attr->children->content;
462 else if (!xmlStrcmp(attr->name, BAD_CAST
"value") &&
463 attr->children && attr->children->type == XML_TEXT_NODE)
465 value = attr->children->content;
471 *addinfo =
"bad attribute for attr content";
478 *addinfo =
"missing type attribute for att content";
484 *addinfo =
"missing value attribute for att content";
495 (*elem)->attributeSet = 0;
499 for (i = 0; value[i] && value[i] >=
'0' && value[i] <=
'9'; i++)
501 if (num_values > 1 || value[i])
504 (*elem)->value.complex =
506 (*elem)->value.complex->num_list = num_values;
512 for (attr = ptr->properties; attr; attr = attr->next)
514 if (!xmlStrcmp(attr->name, BAD_CAST
"value") &&
515 attr->children && attr->children->type == XML_TEXT_NODE)
517 const char *val = (
const char *) attr->children->content;
518 assert (i < num_values);
521 (*elem)->value.complex->list[i]->which =
523 (*elem)->value.complex->list[i]->u.string =
528 (*elem)->value.complex->num_semanticAction = 0;
529 (*elem)->value.complex->semanticAction = 0;
534 (*elem)->value.numeric =
intVal(
odr, (
const char *) value);
544 int *error_code,
const char **addinfo)
547 struct _xmlAttr *attr;
548 char *cdata =
strVal(ptr->children,
odr);
550 for (attr = ptr->properties; attr; attr = attr->next)
552 if (!xmlStrcmp(attr->name, BAD_CAST
"type") &&
553 attr->children && attr->children->type == XML_TEXT_NODE)
554 type = attr->children->content;
558 *addinfo =
"bad attribute for attr content";
564 if (!
type || !xmlStrcmp(
type, BAD_CAST
"general"))
570 else if (!xmlStrcmp(
type, BAD_CAST
"numeric"))
575 else if (!xmlStrcmp(
type, BAD_CAST
"string"))
578 (*term)->u.characterString = cdata;
580 else if (!xmlStrcmp(
type, BAD_CAST
"oid"))
583 *addinfo =
"unhandled term type: oid";
585 else if (!xmlStrcmp(
type, BAD_CAST
"dateTime"))
588 *addinfo =
"unhandled term type: dateTime";
590 else if (!xmlStrcmp(
type, BAD_CAST
"integerAndUnit"))
593 *addinfo =
"unhandled term type: integerAndUnit";
595 else if (!xmlStrcmp(
type, BAD_CAST
"null"))
603 *addinfo =
"unhandled term type";
609 int *error_code,
const char **addinfo)
611 const xmlNode *ptr = ptr_apt->children;
622 for (; ptr; ptr = ptr->next)
623 if (ptr->type == XML_ELEMENT_NODE)
625 if (!xmlStrcmp(ptr->name, BAD_CAST
"attr"))
632 (*zapt)->
attributes->num_attributes = num_attr;
637 ptr = ptr_apt->children;
638 for (; ptr; ptr = ptr->next)
639 if (ptr->type == XML_ELEMENT_NODE)
641 if (!xmlStrcmp(ptr->name, BAD_CAST
"attr"))
644 ptr, &(*zapt)->attributes->attributes[i],
odr,
645 error_code, addinfo);
654 if (ptr && ptr->type == XML_ELEMENT_NODE)
656 if (!xmlStrcmp(ptr->name, BAD_CAST
"term"))
664 *addinfo =
"bad element in apt content";
670 *addinfo =
"missing term node in apt content";
675 ODR odr,
int *error_code,
const char **addinfo)
684 *addinfo =
"missing rset content";
690 int *error_code,
const char **addinfo)
692 while (ptr && ptr->type != XML_ELEMENT_NODE)
695 if (!ptr || ptr->type != XML_ELEMENT_NODE)
698 *addinfo =
"missing rpn operator, rset, apt node";
705 if (!xmlStrcmp(ptr->name, BAD_CAST
"operator"))
710 (*zs)->u.complex = zc;
715 while (ptr && ptr->type != XML_ELEMENT_NODE)
720 while (ptr && ptr->type != XML_ELEMENT_NODE)
729 if (!xmlStrcmp(ptr->name, BAD_CAST
"apt"))
733 odr, error_code, addinfo);
735 else if (!xmlStrcmp(ptr->name, BAD_CAST
"rset"))
739 odr, error_code, addinfo);
744 *addinfo =
"bad element: expected binary, apt or rset";
750 int *error_code,
const char **addinfo)
762 (*query)->attributeSetId = 0;
764 odr, error_code, addinfo);
768 int *error_code,
const char **addinfo)
772 if (ptr && ptr->type == XML_ELEMENT_NODE &&
773 !xmlStrcmp(ptr->name, BAD_CAST
"query"))
777 while (ptr && ptr->type != XML_ELEMENT_NODE)
779 if (!ptr || ptr->type != XML_ELEMENT_NODE)
782 *addinfo =
"missing query content";
785 type = (
const char *) ptr->name;
792 error_code, addinfo);
794 else if (!strcmp(
type,
"ccl"))
797 *addinfo =
"ccl not supported yet";
799 else if (!strcmp(
type,
"z39.58"))
802 *addinfo =
"z39.58 not supported yet";
804 else if (!strcmp(
type,
"cql"))
807 *addinfo =
"cql not supported yet";
812 *addinfo =
"unsupported query type";
818 *addinfo =
"missing query element";
823 int *error_code,
const char **addinfo)
Header for Z39.50 Query Printing.
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
Odr_null * odr_nullval(void)
Odr_oct * odr_create_Odr_oct(ODR o, const char *buf, int sz)
Odr_int * odr_intdup(ODR o, Odr_int v)
void * odr_malloc(ODR o, size_t size)
Odr_bool * odr_booldup(ODR o, Odr_bool v)
char * odr_strdup(ODR o, const char *str)
yaz_oid_db_t yaz_oid_std(void)
returns standard OID database
const char * yaz_oid_to_string_buf(const Odr_oid *oid, oid_class *oclass, char *buf)
maps any OID to string (named or dot-notation)
Odr_oid * yaz_string_to_oid_odr(yaz_oid_db_t oid_list, oid_class oclass, const char *name, ODR o)
creates ODR malloc'ed OID from string
union Z_AttributeElement::@50 value
Z_ComplexAttribute * complex
Z_AttributeSetId * attributeSet
Z_AttributeElement ** attributes
Z_AttributeList * attributes
Z_StringOrNumeric ** list
Z_InternationalString * cql
Z_ResultSetId * resultSetId
Z_AttributesPlusTerm * attributesPlusTerm
Z_ProximityOperator * prox
union Z_ProximityOperator::@51 u
Z_AttributeSetId * attributeSetId
Z_RPNStructure * RPNStructure
union Z_RPNStructure::@46 u
union Z_StringOrNumeric::@72 u
Z_InternationalString * string
Z_InternationalString * characterString
const char * yaz_xml_get_prop(const xmlNode *n, const char *fmt,...)
XML node getter/creation utilities.
static bool_t * boolVal(ODR odr, const char *str)
static void yaz_xml2query_attribute_element(const xmlNode *ptr, Z_AttributeElement **elem, ODR odr, int *error_code, const char **addinfo)
static int check_diagnostic(const xmlNode *ptr, ODR odr, int *error_code, const char **addinfo)
void yaz_query2xml(const Z_Query *q, xmlDocPtr *docp)
static void yaz_xml2query_rset(const xmlNode *ptr, Z_ResultSetId **rset, ODR odr, int *error_code, const char **addinfo)
static Odr_int * intVal(ODR odr, const char *str)
static xmlNodePtr yaz_query2xml_ccl(const Odr_oct *ccl, xmlNodePtr node)
static void yaz_xml2query_rpnstructure(const xmlNode *ptr, Z_RPNStructure **zs, ODR odr, int *error_code, const char **addinfo)
static void yaz_xml2query_(const xmlNode *ptr, Z_Query **query, ODR odr, int *error_code, const char **addinfo)
void yaz_rpnquery2xml(const Z_RPNQuery *rpn, xmlDocPtr *docp)
static char * strVal(const xmlNode *ptr_cdata, ODR odr)
static void yaz_xml2query_rpn(const xmlNode *ptr, Z_RPNQuery **query, ODR odr, int *error_code, const char **addinfo)
static void yaz_query2xml_attribute_element(const Z_AttributeElement *element, xmlNodePtr parent)
static xmlNodePtr yaz_query2xml_term(const Z_Term *term, xmlNodePtr parent)
static void yaz_query2xml_operator(Z_Operator *op, xmlNodePtr node)
static xmlNodePtr yaz_query2xml_cql(const char *cql, xmlNodePtr node)
static xmlNodePtr yaz_query2xml_z3958(const Odr_oct *ccl, xmlNodePtr node)
static void yaz_xml2query_term(const xmlNode *ptr, Z_Term **term, ODR odr, int *error_code, const char **addinfo)
static xmlNodePtr yaz_query2xml_rpnstructure(const Z_RPNStructure *zs, xmlNodePtr parent)
static xmlNodePtr yaz_query2xml_rpn(const Z_RPNQuery *rpn, xmlNodePtr parent)
static xmlNodePtr yaz_query2xml_apt(const Z_AttributesPlusTerm *zapt, xmlNodePtr parent)
void yaz_xml2query(const xmlNode *xmlnodep, Z_Query **query, 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)
static void yaz_xml2query_operator(const xmlNode *ptr, Z_Operator **op, ODR odr, int *error_code, const char **addinfo)
#define Z_AttributeValue_numeric
#define Z_Operator_and_not
#define Z_Term_characterString
#define Z_ProximityOperator_Prox_lessThanOrEqual
#define Z_ProximityOperator_private
#define Z_StringOrNumeric_numeric
#define Z_ProximityOperator_known
#define Z_AttributeValue_complex
#define Z_StringOrNumeric_string
#define Z_Operand_resultSetId
#define Z_RPNStructure_complex
Z_InternationalString Z_ResultSetId
#define Z_RPNStructure_simple
#define Z_Term_integerAndUnit