X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Fsrw.c;h=f7b2f555ef08b3b07caf9bfa139ad2e58d7d01a7;hb=2f1772e6ceae5de8a838b9811822a21acc49a80b;hp=8ef2a622d755304863d58f3dd22ebfb956a9b391;hpb=421a6cab3464893ae0e28d929608b993912e0278;p=yaz-moved-to-github.git diff --git a/src/srw.c b/src/srw.c index 8ef2a62..f7b2f55 100644 --- 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.43 2006-02-03 10:44:57 adam Exp $ + * $Id: srw.c,v 1.50 2006-10-27 11:22:09 adam Exp $ */ /** * \file srw.c @@ -10,7 +10,7 @@ */ #include -#if HAVE_XML2 +#if YAZ_HAVE_XML2 #include #include @@ -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 ) @@ -431,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); } @@ -539,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")) { @@ -592,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)) @@ -604,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")) @@ -967,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")) { @@ -999,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"; @@ -1008,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)) @@ -1057,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 )) @@ -1108,7 +1141,7 @@ int yaz_ucp_codec(ODR o, void * vptr, Z_SRW_PDU **handler_data, 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)