Rename internal func yaz_use_attribute_create
[yaz-moved-to-github.git] / src / srwutil.c
index 36d88b6..f6dfdc4 100644 (file)
@@ -1,17 +1,21 @@
 /* This file is part of the YAZ toolkit.
- * Copyright (C) 1995-2010 Index Data
+ * Copyright (C) 1995-2011 Index Data
  * See the file LICENSE for details.
  */
 /**
  * \file srwutil.c
  * \brief Implements SRW/SRU utilities.
  */
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
 
 #include <stdlib.h>
 #include <assert.h>
 #include <yaz/srw.h>
 #include <yaz/matchstr.h>
 #include <yaz/yaz-iconv.h>
+#include "sru-p.h"
 
 static char *yaz_decode_sru_dbpath_odr(ODR n, const char *uri, size_t len)
 {
@@ -32,7 +36,51 @@ char *yaz_encode_sru_dbpath_odr(ODR out, const char *db)
     return dst;
 }
 
+Z_AttributeList *yaz_use_attribute_create(ODR o, const char *name) {
+    Z_AttributeList *attributes= (Z_AttributeList *) odr_malloc(o, sizeof(*attributes));
+    Z_AttributeElement ** elements;
+    attributes->num_attributes = 1;
+    /* TODO check on name instead
+    if (!attributes->num_attributes) {
+        attributes->attributes = (Z_AttributeElement**)odr_nullval();
+        return attributes;
+    }
+    */
+    elements = (Z_AttributeElement**) odr_malloc (o, attributes->num_attributes * sizeof(*elements));
+    elements[0] = (Z_AttributeElement*)odr_malloc(o,sizeof(**elements));
+    elements[0]->attributeType = odr_malloc(o, sizeof(*elements[0]->attributeType));
+   *elements[0]->attributeType = 1;
+    elements[0]->attributeSet = odr_nullval();
+    elements[0]->which = Z_AttributeValue_complex;
+    elements[0]->value.complex = (Z_ComplexAttribute *) odr_malloc(o, sizeof(Z_ComplexAttribute));
+    elements[0]->value.complex->num_list = 1;
+    elements[0]->value.complex->list = (Z_StringOrNumeric **) odr_malloc(o, 1 * sizeof(Z_StringOrNumeric *));
+    elements[0]->value.complex->list[0] = (Z_StringOrNumeric *) odr_malloc(o, sizeof(Z_StringOrNumeric));
+    elements[0]->value.complex->list[0]->which = Z_StringOrNumeric_string;
+    elements[0]->value.complex->list[0]->u.string = (Z_InternationalString *) odr_strdup(o, name);
+    elements[0]->value.complex->semanticAction = 0;
+    elements[0]->value.complex->num_semanticAction = 0;
+    attributes->attributes = elements;
+    return attributes;
+}
+
 #if YAZ_HAVE_XML2
+const char *yaz_element_attribute_value_get(xmlNodePtr ptr, const char *node_name, const char *attribute_name) {
+
+    struct _xmlAttr *attr;
+    // check if the node name matches
+    if (strcmp((const char*) ptr->name, node_name))
+        return 0;
+    // check if the attribute name and return the value
+    for (attr = ptr->properties; attr; attr = attr->next)
+        if (attr->children && attr->children->type == XML_TEXT_NODE) {
+            if (!strcmp((const char *) attr->name, attribute_name))
+                return (const char *) attr->children->content;
+        }
+    return 0;
+}
+
+
 static int yaz_base64decode(const char *in, char *out)
 {
     const char *map = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
@@ -287,6 +335,7 @@ int yaz_srw_decode(Z_HTTP_Request *hreq, Z_SRW_PDU **srw_pdu,
             if (ret == 0 && (*soap_package)->which == Z_SOAP_generic)
             {
                 *srw_pdu = (Z_SRW_PDU*) (*soap_package)->u.generic->p;
+                yaz_srw_decodeauth(*srw_pdu, hreq, 0, 0, decode);
                 
                 if ((*srw_pdu)->which == Z_SRW_searchRetrieve_request &&
                     (*srw_pdu)->u.request->database == 0)
@@ -339,7 +388,7 @@ static int yaz_sru_decode_integer(ODR odr, const char *pname,
 #endif
 
 /**
-  http://www.loc.gov/z3950/agency/zing/srw/service.html
+   http://www.loc.gov/z3950/agency/zing/srw/service.html
 */ 
 int yaz_sru_decode(Z_HTTP_Request *hreq, Z_SRW_PDU **srw_pdu,
                    Z_SOAP **soap_package, ODR decode, char **charset,
@@ -352,7 +401,7 @@ int yaz_sru_decode(Z_HTTP_Request *hreq, Z_SRW_PDU **srw_pdu,
     };
 #endif
     const char *content_type = z_HTTP_header_lookup(hreq->headers,
-                                            "Content-Type");
+                                                    "Content-Type");
 
     /*
       SRU GET: ignore content type.
@@ -361,9 +410,9 @@ int yaz_sru_decode(Z_HTTP_Request *hreq, Z_SRW_PDU **srw_pdu,
     */
     if (!strcmp(hreq->method, "GET")
         || 
-             (!strcmp(hreq->method, "POST") && content_type &&
-              !yaz_strcmp_del("application/x-www-form-urlencoded",
-                              content_type, "; ")))
+        (!strcmp(hreq->method, "POST") && content_type &&
+         !yaz_strcmp_del("application/x-www-form-urlencoded",
+                         content_type, "; ")))
     {
         char *db = "Default";
         const char *p0 = hreq->path, *p1;
@@ -746,6 +795,7 @@ Z_SRW_PDU *yaz_srw_get_pdu(ODR o, int which, const char *version)
         sr->u.request->database = 0;
         sr->u.request->resultSetTTL = 0;
         sr->u.request->stylesheet = 0;
+        sr->u.request->facetList = 0;
         break;
     case Z_SRW_searchRetrieve_response:
         sr->u.response = (Z_SRW_searchRetrieveResponse *)
@@ -759,6 +809,7 @@ Z_SRW_PDU *yaz_srw_get_pdu(ODR o, int which, const char *version)
         sr->u.response->num_diagnostics = 0;
         sr->u.response->nextRecordPosition = 0;
         sr->u.response->extra_records = 0;
+        sr->u.response->facetList = 0;
         break;
     case Z_SRW_explain_request:
         sr->u.explain_request = (Z_SRW_explainRequest *)
@@ -1045,8 +1096,8 @@ int yaz_diag_srw_to_bib1(int code)
     return 1;
 }
 
-static void add_val_int(ODR o, char **name, char **value,  int *i,
-                        char *a_name, Odr_int *val)
+void yaz_add_name_value_int(ODR o, char **name, char **value, int *i,
+                            char *a_name, Odr_int *val)
 {
     if (val)
     {
@@ -1057,8 +1108,8 @@ static void add_val_int(ODR o, char **name, char **value,  int *i,
     }
 }
 
-static void add_val_str(ODR o, char **name, char **value,  int *i,
-                        char *a_name, char *val)
+void yaz_add_name_value_str(ODR o, char **name, char **value,  int *i,
+                            char *a_name, char *val)
 {
     if (val)
     {
@@ -1072,7 +1123,7 @@ static int yaz_get_sru_parms(const Z_SRW_PDU *srw_pdu, ODR encode,
                              char **name, char **value, int max_names)
 {
     int i = 0;
-    add_val_str(encode, name, value, &i, "version", srw_pdu->srw_version);
+    yaz_add_name_value_str(encode, name, value, &i, "version", srw_pdu->srw_version);
     name[i] = "operation";
     switch(srw_pdu->which)
     {
@@ -1081,16 +1132,16 @@ static int yaz_get_sru_parms(const Z_SRW_PDU *srw_pdu, ODR encode,
         switch(srw_pdu->u.request->query_type)
         {
         case Z_SRW_query_type_cql:
-            add_val_str(encode, name, value, &i, "query",
-                        srw_pdu->u.request->query.cql);
+            yaz_add_name_value_str(encode, name, value, &i, "query",
+                                   srw_pdu->u.request->query.cql);
             break;
         case Z_SRW_query_type_pqf:
-            add_val_str(encode, name, value, &i, "x-pquery",
-                        srw_pdu->u.request->query.pqf);
+            yaz_add_name_value_str(encode, name, value, &i, "x-pquery",
+                                   srw_pdu->u.request->query.pqf);
             break;
         case Z_SRW_query_type_xcql:
-            add_val_str(encode, name, value, &i, "x-cql",
-                        srw_pdu->u.request->query.xcql);
+            yaz_add_name_value_str(encode, name, value, &i, "x-cql",
+                                   srw_pdu->u.request->query.xcql);
             break;
         }
         switch(srw_pdu->u.request->sort_type)
@@ -1098,29 +1149,29 @@ static int yaz_get_sru_parms(const Z_SRW_PDU *srw_pdu, ODR encode,
         case Z_SRW_sort_type_none:
             break;
         case Z_SRW_sort_type_sort:            
-            add_val_str(encode, name, value, &i, "sortKeys",
-                        srw_pdu->u.request->sort.sortKeys);
+            yaz_add_name_value_str(encode, name, value, &i, "sortKeys",
+                                   srw_pdu->u.request->sort.sortKeys);
             break;
         }
-        add_val_int(encode, name, value, &i, "startRecord", 
-                    srw_pdu->u.request->startRecord);
-        add_val_int(encode, name, value, &i, "maximumRecords", 
-                    srw_pdu->u.request->maximumRecords);
-        add_val_str(encode, name, value, &i, "recordSchema",
-                    srw_pdu->u.request->recordSchema);
-        add_val_str(encode, name, value, &i, "recordPacking",
-                    srw_pdu->u.request->recordPacking);
-        add_val_str(encode, name, value, &i, "recordXPath",
-                    srw_pdu->u.request->recordXPath);
-        add_val_str(encode, name, value, &i, "stylesheet",
-                    srw_pdu->u.request->stylesheet);
-        add_val_int(encode, name, value, &i, "resultSetTTL", 
-                    srw_pdu->u.request->resultSetTTL);
+        yaz_add_name_value_int(encode, name, value, &i, "startRecord", 
+                               srw_pdu->u.request->startRecord);
+        yaz_add_name_value_int(encode, name, value, &i, "maximumRecords", 
+                               srw_pdu->u.request->maximumRecords);
+        yaz_add_name_value_str(encode, name, value, &i, "recordSchema",
+                               srw_pdu->u.request->recordSchema);
+        yaz_add_name_value_str(encode, name, value, &i, "recordPacking",
+                               srw_pdu->u.request->recordPacking);
+        yaz_add_name_value_str(encode, name, value, &i, "recordXPath",
+                               srw_pdu->u.request->recordXPath);
+        yaz_add_name_value_str(encode, name, value, &i, "stylesheet",
+                               srw_pdu->u.request->stylesheet);
+        yaz_add_name_value_int(encode, name, value, &i, "resultSetTTL", 
+                               srw_pdu->u.request->resultSetTTL);
         break;
     case Z_SRW_explain_request:
         value[i++] = "explain";
-        add_val_str(encode, name, value, &i, "stylesheet",
-                    srw_pdu->u.explain_request->stylesheet);
+        yaz_add_name_value_str(encode, name, value, &i, "stylesheet",
+                               srw_pdu->u.explain_request->stylesheet);
         break;
     case Z_SRW_scan_request:
         value[i++] = "scan";
@@ -1128,24 +1179,24 @@ static int yaz_get_sru_parms(const Z_SRW_PDU *srw_pdu, ODR encode,
         switch(srw_pdu->u.scan_request->query_type)
         {
         case Z_SRW_query_type_cql:
-            add_val_str(encode, name, value, &i, "scanClause",
-                        srw_pdu->u.scan_request->scanClause.cql);
+            yaz_add_name_value_str(encode, name, value, &i, "scanClause",
+                                   srw_pdu->u.scan_request->scanClause.cql);
             break;
         case Z_SRW_query_type_pqf:
-            add_val_str(encode, name, value, &i, "x-pScanClause",
-                        srw_pdu->u.scan_request->scanClause.pqf);
+            yaz_add_name_value_str(encode, name, value, &i, "x-pScanClause",
+                                   srw_pdu->u.scan_request->scanClause.pqf);
             break;
         case Z_SRW_query_type_xcql:
-            add_val_str(encode, name, value, &i, "x-cqlScanClause",
-                        srw_pdu->u.scan_request->scanClause.xcql);
+            yaz_add_name_value_str(encode, name, value, &i, "x-cqlScanClause",
+                                   srw_pdu->u.scan_request->scanClause.xcql);
             break;
         }
-        add_val_int(encode, name, value, &i, "responsePosition", 
-                    srw_pdu->u.scan_request->responsePosition);
-        add_val_int(encode, name, value, &i, "maximumTerms", 
-                    srw_pdu->u.scan_request->maximumTerms);
-        add_val_str(encode, name, value, &i, "stylesheet",
-                    srw_pdu->u.scan_request->stylesheet);
+        yaz_add_name_value_int(encode, name, value, &i, "responsePosition", 
+                               srw_pdu->u.scan_request->responsePosition);
+        yaz_add_name_value_int(encode, name, value, &i, "maximumTerms", 
+                               srw_pdu->u.scan_request->maximumTerms);
+        yaz_add_name_value_str(encode, name, value, &i, "stylesheet",
+                               srw_pdu->u.scan_request->stylesheet);
         break;
     case Z_SRW_update_request:
         value[i++] = "update";
@@ -1187,6 +1238,7 @@ int yaz_sru_get_encode(Z_HTTP_Request *hreq, Z_SRW_PDU *srw_pdu,
         odr_malloc(encode, strlen(hreq->path) + strlen(uri_args) + 4);
 
     sprintf(path, "%s?%s", hreq->path, uri_args);
+    yaz_log(YLOG_DEBUG, "SRU HTTP Get Request %s", path);
     hreq->path = path;
 
     z_HTTP_header_add_content_type(encode, &hreq->headers,