Changed include/yaz/diagbib1.h and added include/yaz/diagsrw.h with
[yaz-moved-to-github.git] / src / srwutil.c
index d34f6de..c476d11 100644 (file)
@@ -1,14 +1,15 @@
 /*
- * Copyright (c) 2002-2004, Index Data.
+ * Copyright (C) 1995-2005, Index Data ApS
  * See the file LICENSE for details.
  *
- * $Id: srwutil.c,v 1.20 2005-01-08 01:20:19 adam Exp $
+ * $Id: srwutil.c,v 1.27 2005-02-01 14:43:50 adam Exp $
  */
 /**
  * \file srwutil.c
  * \brief Implements SRW/SRU utilities.
  */
 
+#include <stdlib.h>
 #include <yaz/srw.h>
 #include <yaz/yaz-iconv.h>
 
@@ -167,7 +168,9 @@ int yaz_srw_decode(Z_HTTP_Request *hreq, Z_SRW_PDU **srw_pdu,
     {
        const char *content_type = z_HTTP_header_lookup(hreq->headers,
                                                        "Content-Type");
-       if (content_type && !yaz_strcmp_del("text/xml", content_type, "; "))
+       if (content_type && 
+           (!yaz_strcmp_del("text/xml", content_type, "; ") ||
+            !yaz_strcmp_del("text/plain", content_type, "; ")))
        {
            char *db = "Default";
            const char *p0 = hreq->path, *p1;
@@ -234,6 +237,9 @@ int yaz_srw_decode(Z_HTTP_Request *hreq, Z_SRW_PDU **srw_pdu,
     return 2;
 }
 
+/**
+  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,
                   Z_SRW_diagnostic **diag, int *num_diag)
@@ -249,6 +255,7 @@ int yaz_sru_decode(Z_HTTP_Request *hreq, Z_SRW_PDU **srw_pdu,
     {
         char *db = "Default";
         const char *p0 = hreq->path, *p1;
+#if HAVE_XML2
        const char *operation = 0;
        char *version = 0;
        char *query = 0;
@@ -262,6 +269,10 @@ int yaz_sru_decode(Z_HTTP_Request *hreq, Z_SRW_PDU **srw_pdu,
        char *recordPacking = "xml";  /* xml packing is default for SRU */
        char *maximumRecords = 0;
        char *startRecord = 0;
+       char *maximumTerms = 0;
+       char *responsePosition = 0;
+       char *extraRequestData = 0;
+#endif
        char **uri_name;
        char **uri_val;
 
@@ -307,12 +318,18 @@ int yaz_sru_decode(Z_HTTP_Request *hreq, Z_SRW_PDU **srw_pdu,
                    version = v;
                else if (!strcmp(n, "scanClause"))
                    scanClause = v;
-               else if (!strcmp(n, "x-ScanClause"))
+               else if (!strcmp(n, "x-pScanClause"))
                    pScanClause = v;
                else if (!strcmp(n, "maximumRecords"))
                    maximumRecords = v;
                else if (!strcmp(n, "startRecord"))
                    startRecord = v;
+               else if (!strcmp(n, "maximumTerms"))
+                   maximumTerms = v;
+               else if (!strcmp(n, "responsePosition"))
+                   responsePosition = v;
+               else if (!strcmp(n, "extraRequestData"))
+                   extraRequestData = v;
                else
                    yaz_add_srw_diagnostic(decode, diag, num_diag, 8, n);
            }
@@ -385,6 +402,8 @@ int yaz_sru_decode(Z_HTTP_Request *hreq, Z_SRW_PDU **srw_pdu,
         }
        else if (!strcmp(operation, "explain"))
        {
+           /* Transfer SRU explain parameters to common struct */
+           /* http://www.loc.gov/z3950/agency/zing/srw/explain.html */
             Z_SRW_PDU *sr = yaz_srw_get(decode, Z_SRW_explain_request);
 
            sr->srw_version = version;
@@ -410,8 +429,13 @@ int yaz_sru_decode(Z_HTTP_Request *hreq, Z_SRW_PDU **srw_pdu,
        }
        else if (!strcmp(operation, "scan"))
        {
+           /* Transfer SRU scan parameters to common struct */
+           /* http://www.loc.gov/z3950/agency/zing/srw/scan.html */
             Z_SRW_PDU *sr = yaz_srw_get(decode, Z_SRW_scan_request);
 
+           sr->srw_version = version;
+           *srw_pdu = sr;
+
             if (scanClause)
             {
                 sr->u.scan_request->query_type = Z_SRW_query_type_cql;
@@ -425,9 +449,15 @@ int yaz_sru_decode(Z_HTTP_Request *hreq, Z_SRW_PDU **srw_pdu,
            else
                yaz_add_srw_diagnostic(decode, diag, num_diag, 7,
                                       "scanClause");
-           sr->srw_version = version;
-           *srw_pdu = sr;
            sr->u.scan_request->database = db;
+
+           if (maximumTerms)
+               sr->u.scan_request->maximumTerms =
+                   odr_intdup(decode, atoi(maximumTerms));
+           if (responsePosition)
+               sr->u.scan_request->responsePosition =
+                   odr_intdup(decode, atoi(responsePosition));
+
             sr->u.scan_request->stylesheet = stylesheet;
 
            (*soap_package) = odr_malloc(decode, sizeof(**soap_package));