17 #include <libxml/parser.h>
18 #include <libxml/tree.h>
27 int *error_code,
const char **addinfo)
29 if (ptr && ptr->type == XML_ELEMENT_NODE &&
30 !xmlStrcmp(ptr->name, BAD_CAST
"diagnostic"))
32 struct _xmlAttr *attr;
33 const char *code_str = 0;
34 const char *addinfo_str = 0;
35 for (attr = ptr->properties; attr; attr = attr->next)
37 if (!xmlStrcmp(attr->name, BAD_CAST
"code") &&
38 attr->children && attr->children->type == XML_TEXT_NODE)
39 code_str = (
const char *) attr->children->content;
40 else if (!xmlStrcmp(attr->name, BAD_CAST
"addinfo") &&
41 attr->children && attr->children->type == XML_TEXT_NODE)
42 addinfo_str = (
const char *) attr->children->content;
46 *addinfo =
"bad attribute for diagnostic element";
53 *addinfo =
"missing @code for diagnostic element";
56 *error_code = atoi(code_str);
69 const char *setname = 0;
80 xmlNodePtr
node = xmlNewChild(parent, 0, BAD_CAST
"attr", 0);
83 xmlNewProp(
node, BAD_CAST
"set", BAD_CAST setname);
86 xmlNewProp(
node, BAD_CAST
"type", BAD_CAST formstr);
89 xmlNewProp(
node, BAD_CAST
"value", BAD_CAST formstr);
96 xmlNodePtr
node = xmlNewChild(parent, 0, BAD_CAST
"attr", 0);
99 xmlNewProp(
node, BAD_CAST
"set", BAD_CAST setname);
102 xmlNewProp(
node, BAD_CAST
"type", BAD_CAST formstr);
107 xmlNewProp(
node, BAD_CAST
"value", BAD_CAST
115 xmlNewProp(
node, BAD_CAST
"value", BAD_CAST formstr);
125 xmlNodePtr
node = xmlNewChild(parent, 0, BAD_CAST
"term", 0);
127 const char *
type = 0;
138 t = xmlNewText(BAD_CAST formstr);
154 type =
"integerAndUnit";
163 xmlAddChild(
node, t);
165 xmlNewProp(
node, BAD_CAST
"type", BAD_CAST
type);
172 xmlNodePtr
node = xmlNewChild(parent, 0, BAD_CAST
"apt", 0);
175 for (i = 0; i<num_attributes; i++)
185 const char *
type = 0;
203 xmlNewProp(
node, BAD_CAST
"type", BAD_CAST
type);
212 xmlNewProp(
node, BAD_CAST
"exclusion", BAD_CAST
"true");
214 xmlNewProp(
node, BAD_CAST
"exclusion", BAD_CAST
"false");
217 xmlNewProp(
node, BAD_CAST
"distance", BAD_CAST formstr);
220 xmlNewProp(
node, BAD_CAST
"ordered", BAD_CAST
"true");
222 xmlNewProp(
node, BAD_CAST
"ordered", BAD_CAST
"false");
225 xmlNewProp(
node, BAD_CAST
"relationType", BAD_CAST formstr);
231 xmlNewProp(
node, BAD_CAST
"knownProximityUnit",
236 xmlNewProp(
node, BAD_CAST
"privateProximityUnit",
250 xmlNodePtr
node = xmlNewChild(parent, 0, BAD_CAST
"operator", 0);
263 return xmlNewChild(parent, 0, BAD_CAST
"rset",
277 xmlNewProp(parent, BAD_CAST
"set", BAD_CAST setname);
308 xmlNodePtr top_node, q_node = 0, child_node = 0;
313 top_node = xmlNewNode(0, BAD_CAST
"query");
319 q_node = xmlNewChild(top_node, 0, BAD_CAST
"rpn", 0);
323 q_node = xmlNewChild(top_node, 0, BAD_CAST
"ccl", 0);
327 q_node = xmlNewChild(top_node, 0, BAD_CAST
"z39.58", 0);
333 q_node = xmlNewChild(top_node, 0, BAD_CAST
"cql", 0);
337 if (child_node && q_node)
339 *docp = xmlNewDoc(BAD_CAST
"1.0");
340 xmlDocSetRootElement(*docp, top_node);
345 xmlFreeNode(top_node);
351 if (*str ==
'\0' || strchr(
"0fF", *str))
363 int *error_code,
const char **addinfo)
369 *addinfo =
"no operator type";
373 if (!strcmp(
type,
"and"))
378 else if (!strcmp(
type,
"or"))
383 else if (!strcmp(
type,
"not"))
388 else if (!strcmp(
type,
"prox"))
390 struct _xmlAttr *attr;
404 for (attr = ptr->properties; attr; attr = attr->next)
406 const char *value = (
const char *) attr->children->content;
407 if (!xmlStrcmp(attr->name, BAD_CAST
"type"))
409 else if (!xmlStrcmp(attr->name, BAD_CAST
"exclusion"))
411 else if (!xmlStrcmp(attr->name, BAD_CAST
"distance"))
413 else if (!xmlStrcmp(attr->name, BAD_CAST
"ordered"))
415 else if (!xmlStrcmp(attr->name, BAD_CAST
"relationType"))
417 else if (!xmlStrcmp(attr->name, BAD_CAST
"knownProximityUnit"))
422 else if (!xmlStrcmp(attr->name, BAD_CAST
"privateProximityUnit"))
430 *addinfo =
"bad proximity attribute";
438 *addinfo =
"bad operator type";
445 const char **addinfo)
452 struct _xmlAttr *attr;
453 for (attr = ptr->properties; attr; attr = attr->next)
455 if (!xmlStrcmp(attr->name, BAD_CAST
"set") &&
456 attr->children && attr->children->type == XML_TEXT_NODE)
457 set = attr->children->content;
458 else if (!xmlStrcmp(attr->name, BAD_CAST
"type") &&
459 attr->children && attr->children->type == XML_TEXT_NODE)
460 type = attr->children->content;
461 else if (!xmlStrcmp(attr->name, BAD_CAST
"value") &&
462 attr->children && attr->children->type == XML_TEXT_NODE)
464 value = attr->children->content;
470 *addinfo =
"bad attribute for attr content";
477 *addinfo =
"missing type attribute for att content";
483 *addinfo =
"missing value attribute for att content";
494 (*elem)->attributeSet = 0;
498 for (i = 0; value[i] && value[i] >=
'0' && value[i] <=
'9'; i++)
500 if (num_values > 1 || value[i])
503 (*elem)->value.complex =
505 (*elem)->value.complex->num_list = num_values;
511 for (attr = ptr->properties; attr; attr = attr->next)
513 if (!xmlStrcmp(attr->name, BAD_CAST
"value") &&
514 attr->children && attr->children->type == XML_TEXT_NODE)
516 const char *val = (
const char *) attr->children->content;
517 assert (i < num_values);
520 (*elem)->value.complex->list[i]->which =
522 (*elem)->value.complex->list[i]->u.string =
527 (*elem)->value.complex->num_semanticAction = 0;
528 (*elem)->value.complex->semanticAction = 0;
533 (*elem)->value.numeric =
intVal(
odr, (
const char *) value);
543 int *error_code,
const char **addinfo)
546 struct _xmlAttr *attr;
547 char *cdata =
strVal(ptr->children,
odr);
549 for (attr = ptr->properties; attr; attr = attr->next)
551 if (!xmlStrcmp(attr->name, BAD_CAST
"type") &&
552 attr->children && attr->children->type == XML_TEXT_NODE)
553 type = attr->children->content;
557 *addinfo =
"bad attribute for attr content";
563 if (!
type || !xmlStrcmp(
type, BAD_CAST
"general"))
569 else if (!xmlStrcmp(
type, BAD_CAST
"numeric"))
574 else if (!xmlStrcmp(
type, BAD_CAST
"string"))
577 (*term)->u.characterString = cdata;
579 else if (!xmlStrcmp(
type, BAD_CAST
"oid"))
582 *addinfo =
"unhandled term type: oid";
584 else if (!xmlStrcmp(
type, BAD_CAST
"dateTime"))
587 *addinfo =
"unhandled term type: dateTime";
589 else if (!xmlStrcmp(
type, BAD_CAST
"integerAndUnit"))
592 *addinfo =
"unhandled term type: integerAndUnit";
594 else if (!xmlStrcmp(
type, BAD_CAST
"null"))
602 *addinfo =
"unhandled term type";
608 int *error_code,
const char **addinfo)
610 const xmlNode *ptr = ptr_apt->children;
621 for (; ptr; ptr = ptr->next)
622 if (ptr->type == XML_ELEMENT_NODE)
624 if (!xmlStrcmp(ptr->name, BAD_CAST
"attr"))
631 (*zapt)->attributes->num_attributes = num_attr;
636 ptr = ptr_apt->children;
637 for (; ptr; ptr = ptr->next)
638 if (ptr->type == XML_ELEMENT_NODE)
640 if (!xmlStrcmp(ptr->name, BAD_CAST
"attr"))
643 ptr, &(*zapt)->attributes->attributes[i],
odr,
644 error_code, addinfo);
653 if (ptr && ptr->type == XML_ELEMENT_NODE)
655 if (!xmlStrcmp(ptr->name, BAD_CAST
"term"))
663 *addinfo =
"bad element in apt content";
669 *addinfo =
"missing term node in apt content";
674 ODR odr,
int *error_code,
const char **addinfo)
683 *addinfo =
"missing rset content";
689 int *error_code,
const char **addinfo)
691 while (ptr && ptr->type != XML_ELEMENT_NODE)
694 if (!ptr || ptr->type != XML_ELEMENT_NODE)
697 *addinfo =
"missing rpn operator, rset, apt node";
704 if (!xmlStrcmp(ptr->name, BAD_CAST
"operator"))
709 (*zs)->u.complex = zc;
714 while (ptr && ptr->type != XML_ELEMENT_NODE)
719 while (ptr && ptr->type != XML_ELEMENT_NODE)
728 if (!xmlStrcmp(ptr->name, BAD_CAST
"apt"))
732 odr, error_code, addinfo);
734 else if (!xmlStrcmp(ptr->name, BAD_CAST
"rset"))
738 odr, error_code, addinfo);
743 *addinfo =
"bad element: expected binary, apt or rset";
749 int *error_code,
const char **addinfo)
756 (*query)->attributeSetId =
761 (*query)->attributeSetId = 0;
763 odr, error_code, addinfo);
767 int *error_code,
const char **addinfo)
771 if (ptr && ptr->type == XML_ELEMENT_NODE &&
772 !xmlStrcmp(ptr->name, BAD_CAST
"query"))
776 while (ptr && ptr->type != XML_ELEMENT_NODE)
778 if (!ptr || ptr->type != XML_ELEMENT_NODE)
781 *addinfo =
"missing query content";
784 type = (
const char *) ptr->name;
791 error_code, addinfo);
793 else if (!strcmp(
type,
"ccl"))
796 *addinfo =
"ccl not supported yet";
798 else if (!strcmp(
type,
"z39.58"))
801 *addinfo =
"z39.58 not supported yet";
803 else if (!strcmp(
type,
"cql"))
806 *addinfo =
"cql not supported yet";
811 *addinfo =
"unsupported query type";
817 *addinfo =
"missing query element";
822 int *error_code,
const char **addinfo)
static int node(struct cql_node *cn, void(*pr)(const char *buf, void *client_data), void *client_data)
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_bool * odr_booldup(ODR o, Odr_bool v)
char * odr_strdup(ODR o, const char *str)
Odr_int * odr_intdup(ODR o, Odr_int v)
void * odr_malloc(ODR o, size_t size)
Odr_oct * odr_create_Odr_oct(ODR o, const char *buf, int sz)
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)
yaz_oid_db_t yaz_oid_std(void)
returns standard OID database
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 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 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 void yaz_xml2query_rpn(const xmlNode *ptr, Z_RPNQuery **query, ODR odr, int *error_code, const char **addinfo)
static Odr_int * intVal(ODR odr, const char *str)
static void yaz_query2xml_attribute_element(const Z_AttributeElement *element, xmlNodePtr parent)
static bool_t * boolVal(ODR odr, const char *str)
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 char * strVal(const xmlNode *ptr_cdata, ODR odr)
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