Update source headers for 2008. Omit CVS ID keyword subst.
[yaz-moved-to-github.git] / src / xmlquery.c
index 446dec6..1c73920 100644 (file)
@@ -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 <stdio.h>
 #include <string.h>
 #include <assert.h>
 
-#if HAVE_XML2
+#if YAZ_HAVE_XML2
 #include <libxml/parser.h>
 #include <libxml/tree.h>
 
 #include <yaz/logrpn.h>
 #include <yaz/xmlquery.h>
+#include <yaz/nmem_xml.h>
+#include <yaz/oid_db.h>
 
 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
 
 /*