Simplify in a lot of places using odr_strdupn
[yaz-moved-to-github.git] / src / srw.c
index 386100c..17b7c39 100644 (file)
--- a/src/srw.c
+++ b/src/srw.c
 #include <yaz/facet.h>
 #include "sru-p.h"
 
-static void add_XML_n(xmlNodePtr ptr, const char *elem, char *val, int len,
-                      xmlNsPtr ns_ptr)
-{
-    if (val)
-    {
-        xmlDocPtr doc = xmlParseMemory(val,len);
-        if (doc)
-        {
-            xmlNodePtr c = xmlNewChild(ptr, ns_ptr, BAD_CAST elem, 0);
-            xmlNodePtr t = xmlDocGetRootElement(doc);
-            xmlAddChild(c, xmlCopyNode(t,1));
-            xmlFreeDoc(doc);
-        }
-    }
-}
-
-xmlNodePtr add_xsd_string_n(xmlNodePtr ptr, const char *elem, const char *val,
-                            int len)
-{
-    if (val)
-    {
-        xmlNodePtr c = xmlNewChild(ptr, 0, BAD_CAST elem, 0);
-        xmlNodePtr t = xmlNewTextLen(BAD_CAST val, len);
-        xmlAddChild(c, t);
-        return t;
-    }
-    return 0;
-}
-
-xmlNodePtr add_xsd_string_ns(xmlNodePtr ptr, const char *elem, const char *val,
-                             xmlNsPtr ns_ptr)
-{
-    if (val)
-    {
-        xmlNodePtr c = xmlNewChild(ptr, ns_ptr, BAD_CAST elem, 0);
-        xmlNodePtr t = xmlNewText(BAD_CAST val);
-        xmlAddChild(c, t);
-        return t;
-    }
-    return 0;
-}
-
-xmlNodePtr add_xsd_string(xmlNodePtr ptr, const char *elem, const char *val)
-{
-    return add_xsd_string_ns(ptr, elem, val, 0);
-}
-
-void add_xsd_integer(xmlNodePtr ptr, const char *elem,
-                            const Odr_int *val)
-{
-    if (val)
-    {
-        char str[40];
-        sprintf(str, ODR_INT_PRINTF, *val);
-        xmlNewTextChild(ptr, 0, BAD_CAST elem, BAD_CAST str);
-    }
-}
-
 char *yaz_negotiate_sru_version(char *input_ver)
 {
     if (!input_ver)
@@ -626,6 +568,8 @@ int yaz_srw_codec(ODR o, void * vptr, Z_SRW_PDU **handler_data,
             char *recordPacking = 0;
             char *recordXMLEscaping = 0;
             const char *facetLimit = 0;
+            const char *facetStart = 0;
+            const char *facetSort = 0;
 
             (*p)->which = Z_SRW_searchRetrieve_request;
             req = (*p)->u.request = (Z_SRW_searchRetrieveRequest *)
@@ -688,10 +632,17 @@ int yaz_srw_codec(ODR o, void * vptr, Z_SRW_PDU **handler_data,
                 else if (yaz_match_xsd_string(ptr, "stylesheet", o,
                                           &req->stylesheet))
                     ;
-                else if (yaz_match_xsd_string(ptr, "database", o, &req->database))
+                else if (yaz_match_xsd_string(ptr, "database", o,
+                                              &req->database))
                     ;
                 else if (yaz_match_xsd_string(ptr, "facetLimit", o,
-                                          (char**) &facetLimit))
+                                              (char**) &facetLimit))
+                    ;
+                else if (yaz_match_xsd_string(ptr, "facetStart", o,
+                                              (char**) &facetStart))
+                    ;
+                else if (yaz_match_xsd_string(ptr, "facetSort", o,
+                                              (char**) &facetSort))
                     ;
             }
             if (!req->query)
@@ -708,7 +659,8 @@ int yaz_srw_codec(ODR o, void * vptr, Z_SRW_PDU **handler_data,
             {
                 req->recordPacking = recordPacking;
             }
-            yaz_sru_facet_request(o, &req->facetList, &facetLimit);
+            yaz_sru_facet_request(o, &req->facetList, &facetLimit, &facetStart,
+                                  &facetSort);
         }
         else if (!xmlStrcmp(method->name, BAD_CAST "searchRetrieveResponse"))
         {
@@ -983,8 +935,13 @@ int yaz_srw_codec(ODR o, void * vptr, Z_SRW_PDU **handler_data,
             add_xsd_string(ptr, "database", req->database);
             {
                 const char *limit = 0;
-                yaz_sru_facet_request(o, &req->facetList, &limit);
+                const char *start = 0;
+                const char *sort = 0;
+                yaz_sru_facet_request(o, &req->facetList, &limit, &start,
+                                      &sort);
                 add_xsd_string(ptr, "facetLimit", limit);
+                add_xsd_string(ptr, "facetStart", start);
+                add_xsd_string(ptr, "facetSort", sort);
             }
         }
         else if ((*p)->which == Z_SRW_searchRetrieve_response)