Updates for SRU Update by Ko van der Sloot:
[yaz-moved-to-github.git] / src / srw.c
index 68d2056..f7b2f55 100644 (file)
--- a/src/srw.c
+++ b/src/srw.c
@@ -1,8 +1,8 @@
 /*
- * Copyright (C) 1995-2005, Index Data ApS
+ * Copyright (C) 1995-2006, Index Data ApS
  * See the file LICENSE for details.
  *
- * $Id: srw.c,v 1.39 2005-11-11 22:06:46 adam Exp $
+ * $Id: srw.c,v 1.50 2006-10-27 11:22:09 adam Exp $
  */
 /**
  * \file srw.c
@@ -10,7 +10,7 @@
  */
 
 #include <yaz/srw.h>
-#if HAVE_XML2
+#if YAZ_HAVE_XML2
 #include <libxml/parser.h>
 #include <libxml/tree.h>
 
@@ -188,6 +188,9 @@ static int yaz_srw_extra_record(ODR o, xmlNodePtr pptr,
        {
            if (match_xsd_string(ptr, "recordId", o, 
                                 &rec->recordId ))
+               ; /* backward compatible */
+           else if (match_xsd_string(ptr, "recordIdentifier", o, 
+                                &rec->recordId ))
                ;
            else if (match_xsd_string(ptr, "recordReviewCode", o, 
                                      &rec->recordReviewCode ))
@@ -210,7 +213,7 @@ static int yaz_srw_extra_record(ODR o, xmlNodePtr pptr,
     {
         xmlNodePtr ptr = pptr;
         if ( rec->recordId )
-            add_xsd_string(ptr, "recordId", rec->recordId);
+            add_xsd_string(ptr, "recordIdentfier", rec->recordId);
         if ( rec->recordReviewCode )
             add_xsd_string(ptr, "recordReviewCode", rec->recordReviewCode);
         if (  rec->recordReviewNote )
@@ -291,8 +294,6 @@ static int yaz_srw_record(ODR o, xmlNodePtr pptr, Z_SRW_record *rec,
                 match_xsd_string_n(data_ptr, "recordData", o, 
                                    &rec->recordData_buf, &rec->recordData_len);
                 break;
-            default:
-                /* need some way to signal diagnostic here */
             }
         }
         rec->recordPacking = pack;
@@ -323,7 +324,7 @@ static int yaz_srw_record(ODR o, xmlNodePtr pptr, Z_SRW_record *rec,
         }
         if (rec->recordPosition)
             add_xsd_integer(ptr, "recordPosition", rec->recordPosition );
-        if (*extra)
+        if (extra && *extra)
         {
             xmlNodePtr rptr = xmlNewChild(ptr, 0, BAD_CAST "extraRecordData",
                                           0);
@@ -369,7 +370,8 @@ static int yaz_srw_records(ODR o, xmlNodePtr pptr, Z_SRW_record **recs,
         {
             xmlNodePtr rptr = xmlNewChild(pptr, 0, BAD_CAST "record",
                                           0);
-            yaz_srw_record(o, rptr, (*recs)+i, *extra + i, client_data, ns);
+            yaz_srw_record(o, rptr, (*recs)+i, (*extra ? *extra + i : 0),
+                           client_data, ns);
         }
     }
     return 0;
@@ -432,18 +434,28 @@ static int yaz_srw_diagnostics(ODR o, xmlNodePtr pptr, Z_SRW_diagnostic **recs,
         for (i = 0; i < *num; i++)
         {
             const char *std_diag = "info:srw/diagnostic/1/";
+            const char *ucp_diag = "info:srw/diagnostic/12/";
             xmlNodePtr rptr = xmlNewChild(pptr, ns_diag,
                                           BAD_CAST "diagnostic", 0);
             add_xsd_string(rptr, "uri", (*recs)[i].uri);
             if ((*recs)[i].message)
                 add_xsd_string(rptr, "message", (*recs)[i].message);
-            else if ((*recs)[i].uri && 
-                     !strncmp((*recs)[i].uri, std_diag, strlen(std_diag)))
+            else if ((*recs)[i].uri )
             {
-                int no = atoi((*recs)[i].uri + strlen(std_diag));
-                const char *message = yaz_diag_srw_str(no);
-                if (message)
-                    add_xsd_string(rptr, "message", message);
+                if (!strncmp((*recs)[i].uri, std_diag, strlen(std_diag)))
+                {
+                    int no = atoi((*recs)[i].uri + strlen(std_diag));
+                    const char *message = yaz_diag_srw_str(no);
+                    if (message)
+                        add_xsd_string(rptr, "message", message);
+                }
+                else if (!strncmp((*recs)[i].uri, ucp_diag, strlen(ucp_diag)))
+                {
+                    int no = atoi((*recs)[i].uri + strlen(ucp_diag));
+                    const char *message = yaz_diag_sru_update_str(no);
+                    if (message)
+                        add_xsd_string(rptr, "message", message);
+                }
             }
             add_xsd_string(rptr, "details", (*recs)[i].details);
         }
@@ -540,8 +552,7 @@ int yaz_srw_codec(ODR o, void * vptr, Z_SRW_PDU **handler_data,
         if (method->type != XML_ELEMENT_NODE)
             return -1;
 
-        *p = (Z_SRW_PDU *) odr_malloc(o, sizeof(**p));
-        (*p)->srw_version = odr_strdup(o, "1.1");
+        *p = yaz_srw_get_core_v_1_1(o);
         
         if (!xmlStrcmp(method->name, BAD_CAST "searchRetrieveRequest"))
         {
@@ -593,8 +604,8 @@ int yaz_srw_codec(ODR o, void * vptr, Z_SRW_PDU **handler_data,
                 else if (match_xsd_string(ptr, "recordXPath", o,
                                           &req->recordXPath))
                     ;
-                else if (match_xsd_string(ptr, "resultSetTTL", o,
-                                           &req->database))
+                else if (match_xsd_integer(ptr, "resultSetTTL", o,
+                                           &req->resultSetTTL))
                     ;
                 else if (match_xsd_string(ptr, "sortKeys", o, 
                                           &req->sort.sortKeys))
@@ -605,7 +616,11 @@ int yaz_srw_codec(ODR o, void * vptr, Z_SRW_PDU **handler_data,
                 else if (match_xsd_string(ptr, "database", o,
                                            &req->database))
                     ;
-                /* missing is xQuery, xSortKeys .. */
+            }
+            if (!req->query.cql && !req->query.pqf && !req->query.xcql)
+            {
+                /* should put proper diagnostic here */
+                return -1;
             }
         }
         else if (!xmlStrcmp(method->name, BAD_CAST "searchRetrieveResponse"))
@@ -968,8 +983,7 @@ int yaz_ucp_codec(ODR o, void * vptr, Z_SRW_PDU **handler_data,
         if (method->type != XML_ELEMENT_NODE)
             return -1;
 
-        *p = (Z_SRW_PDU *) odr_malloc(o, sizeof(**p));
-        (*p)->srw_version = odr_strdup(o, "1.1");
+        *p = yaz_srw_get_core_v_1_1(o);
         
         if (!xmlStrcmp(method->name, BAD_CAST "updateRequest"))
         {
@@ -1000,6 +1014,7 @@ int yaz_ucp_codec(ODR o, void * vptr, Z_SRW_PDU **handler_data,
                     ;
                 else if (match_xsd_string(ptr, "operation", o, 
                                           &oper)){
+                    /* backward compatible */
                     if ( oper ){
                         if ( !strcmp(oper, "delete"))
                             req->operation = "delete";
@@ -1009,8 +1024,22 @@ int yaz_ucp_codec(ODR o, void * vptr, Z_SRW_PDU **handler_data,
                             req->operation = "insert";
                     }
                 }
+                else if (match_xsd_string(ptr, "action", o, 
+                                          &oper)){
+                    if ( oper ){
+                        if ( !strcmp(oper, "info:srw/action/1/delete"))
+                            req->operation = "delete";
+                        else if (!strcmp(oper,"info:srw/action/1/replace" ))
+                            req->operation = "replace";
+                        else if ( !strcmp( oper, "info:srw/action/1/create"))
+                            req->operation = "insert";
+                    }
+                }
                 else if (match_xsd_string(ptr, "recordId", o,
                                           &req->recordId))
+                    ; /* backward compatible */
+                else if (match_xsd_string(ptr, "recordIdentifier", o,
+                                          &req->recordId))
                     ;
                 else if (match_xsd_string(ptr, "recordVersion", o,
                                           &req->recordVersion))
@@ -1058,6 +1087,9 @@ int yaz_ucp_codec(ODR o, void * vptr, Z_SRW_PDU **handler_data,
                     ;
                 else if (match_xsd_string(ptr, "recordId", o, 
                                           &res->recordId))
+                    ; /* backward compatible */
+                else if (match_xsd_string(ptr, "recordIdentifier", o, 
+                                          &res->recordId))
                     ;
                 else if (match_xsd_string(ptr, "recordVersion", o, 
                                            &res->recordVersion ))
@@ -1091,8 +1123,8 @@ int yaz_ucp_codec(ODR o, void * vptr, Z_SRW_PDU **handler_data,
         if ((*p)->which == Z_SRW_update_request)
         {
             Z_SRW_updateRequest *req = (*p)->u.update_request;
-            xmlNodePtr ptr = xmlNewChild(pptr, 0, "updateRequest", 0);
-           ns_srw = xmlNewNs(ptr, ns, "zu");
+            xmlNodePtr ptr = xmlNewChild(pptr, 0, BAD_CAST "updateRequest", 0);
+           ns_srw = xmlNewNs(ptr, BAD_CAST ns, BAD_CAST "zu");
            xmlSetNs(ptr, ns_srw);
 
            add_xsd_string(ptr, "version", (*p)->srw_version);
@@ -1102,26 +1134,27 @@ int yaz_ucp_codec(ODR o, void * vptr, Z_SRW_PDU **handler_data,
         else if ((*p)->which == Z_SRW_update_response)
         {
             Z_SRW_updateResponse *res = (*p)->u.update_response;
-            xmlNodePtr ptr = xmlNewChild(pptr, 0, "updateResponse", 0);
-           ns_srw = xmlNewNs(ptr, ns, "zu");
+            xmlNodePtr ptr = xmlNewChild(pptr, 0, (xmlChar *) 
+                                         "updateResponse", 0);
+           ns_srw = xmlNewNs(ptr, BAD_CAST ns, BAD_CAST "zu");
            xmlSetNs(ptr, ns_srw);
             
            add_xsd_string(ptr, "version", (*p)->srw_version);
             add_xsd_string(ptr, "operationStatus", res->operationStatus );
-            add_xsd_string(ptr, "recordId", res->recordId );
+            add_xsd_string(ptr, "recordIdentifier", res->recordId );
            if (res->recordVersion)
                 add_xsd_string(ptr, "recordVersion", res->recordVersion );
            if (res->recordChecksum)
                 add_xsd_string(ptr, "recordChecksum", res->recordChecksum );
            if (res->record.recordData_len)
             {
-                xmlNodePtr rptr = xmlNewChild(ptr, 0, "record", 0);
+                xmlNodePtr rptr = xmlNewChild(ptr, 0, BAD_CAST "record", 0);
                 yaz_srw_record(o, rptr, &res->record, &res->extra_record,
                                client_data, ns);
            }
            if (res->num_diagnostics)
            {
-               xmlNodePtr rptr = xmlNewChild(ptr, 0, "diagnostics", 0);
+               xmlNodePtr rptr = xmlNewChild(ptr, 0, BAD_CAST "diagnostics", 0);
                yaz_srw_diagnostics(o, rptr, &res->diagnostics,
                                     &res->num_diagnostics, client_data, ns);
             }