X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=src%2Fsrw.c;h=f7fb9275f77682707def6fefc65aadc2772f24d0;hp=2cc0c7d458001b4ec7fd90f0d20768ba4a0e1071;hb=d48a2b1b196d0964a538ba6684886f86036dce14;hpb=799ea46466fc7433ce75d7c66d796b5a0997f59c diff --git a/src/srw.c b/src/srw.c index 2cc0c7d..f7fb927 100644 --- a/src/srw.c +++ b/src/srw.c @@ -232,7 +232,7 @@ char *yaz_negotiate_sru_version(char *input_ver) static int yaz_srw_record(ODR o, xmlNodePtr pptr, Z_SRW_record *rec, Z_SRW_extra_record **extra, - void *client_data) + void *client_data, int version2) { if (o->direction == ODR_DECODE) { @@ -311,7 +311,12 @@ static int yaz_srw_record(ODR o, xmlNodePtr pptr, Z_SRW_record *rec, add_xsd_string(ptr, "recordSchema", rec->recordSchema); if (spack) - add_xsd_string(ptr, "recordPacking", spack); + { + if (version2) + add_xsd_string(ptr, "recordXMLEscaping", spack); + else + add_xsd_string(ptr, "recordPacking", spack); + } switch (pack) { case Z_SRW_recordPacking_string: @@ -345,7 +350,7 @@ static int yaz_srw_record(ODR o, xmlNodePtr pptr, Z_SRW_record *rec, static int yaz_srw_records(ODR o, xmlNodePtr pptr, Z_SRW_record **recs, Z_SRW_extra_record ***extra, - int *num, void *client_data) + int *num, void *client_data, int version2) { if (o->direction == ODR_DECODE) { @@ -367,7 +372,7 @@ static int yaz_srw_records(ODR o, xmlNodePtr pptr, Z_SRW_record **recs, if (ptr->type == XML_ELEMENT_NODE && !xmlStrcmp(ptr->name, BAD_CAST "record")) { - yaz_srw_record(o, ptr, *recs + i, *extra + i, client_data); + yaz_srw_record(o, ptr, *recs + i, *extra + i, client_data, 0); i++; } } @@ -380,7 +385,7 @@ 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 ? *extra + i : 0), - client_data); + client_data, version2); } } return 0; @@ -755,6 +760,8 @@ int yaz_srw_codec(ODR o, void * vptr, Z_SRW_PDU **handler_data, { xmlNodePtr ptr = method->children; Z_SRW_searchRetrieveRequest *req; + char *recordPacking = 0; + char *recordXMLEscaping = 0; (*p)->which = Z_SRW_searchRetrieve_request; req = (*p)->u.request = (Z_SRW_searchRetrieveRequest *) @@ -797,7 +804,10 @@ int yaz_srw_codec(ODR o, void * vptr, Z_SRW_PDU **handler_data, &req->maximumRecords)) ; else if (match_xsd_string(ptr, "recordPacking", o, - &req->recordPacking)) + &recordPacking)) + ; + else if (match_xsd_string(ptr, "recordXMLEscaping", o, + &recordXMLEscaping)) ; else if (match_xsd_string(ptr, "recordSchema", o, &req->recordSchema)) @@ -822,6 +832,15 @@ int yaz_srw_codec(ODR o, void * vptr, Z_SRW_PDU **handler_data, /* should put proper diagnostic here */ return -1; } + if (!strcmp((*p)->srw_version, "2.0")) + { + req->recordPacking = recordXMLEscaping; + req->packing = recordPacking; + } + else + { + req->recordPacking = recordPacking; + } } else if (!xmlStrcmp(method->name, BAD_CAST "searchRetrieveResponse")) { @@ -864,7 +883,7 @@ int yaz_srw_codec(ODR o, void * vptr, Z_SRW_PDU **handler_data, else if (match_element(ptr, "records")) yaz_srw_records(o, ptr, &res->records, &res->extra_records, - &res->num_records, client_data); + &res->num_records, client_data, 0); else if (match_xsd_integer(ptr, "nextRecordPosition", o, &res->nextRecordPosition)) ; @@ -933,7 +952,7 @@ int yaz_srw_codec(ODR o, void * vptr, Z_SRW_PDU **handler_data, ; else if (match_element(ptr, "record")) yaz_srw_record(o, ptr, &res->record, &res->extra_record, - client_data); + client_data, 0); else if (match_element(ptr, "diagnostics")) yaz_srw_diagnostics(o, ptr, &res->diagnostics, &res->num_diagnostics, @@ -1064,7 +1083,13 @@ int yaz_srw_codec(ODR o, void * vptr, Z_SRW_PDU **handler_data, } add_xsd_integer(ptr, "startRecord", req->startRecord); add_xsd_integer(ptr, "maximumRecords", req->maximumRecords); - add_xsd_string(ptr, "recordPacking", req->recordPacking); + if (version2) + { + add_xsd_string(ptr, "recordXMLEscaping", req->recordPacking); + add_xsd_string(ptr, "recordPacking", req->packing); + } + else + add_xsd_string(ptr, "recordPacking", req->recordPacking); add_xsd_string(ptr, "recordSchema", req->recordSchema); add_xsd_string(ptr, "recordXPath", req->recordXPath); add_xsd_integer(ptr, "resultSetTTL", req->resultSetTTL); @@ -1101,7 +1126,7 @@ int yaz_srw_codec(ODR o, void * vptr, Z_SRW_PDU **handler_data, xmlNodePtr rptr = xmlNewChild(ptr, 0, BAD_CAST "records", 0); yaz_srw_records(o, rptr, &res->records, &res->extra_records, &res->num_records, - client_data); + client_data, version2); } add_xsd_integer(ptr, "nextRecordPosition", res->nextRecordPosition); @@ -1122,7 +1147,13 @@ int yaz_srw_codec(ODR o, void * vptr, Z_SRW_PDU **handler_data, if (!version2) add_xsd_string(ptr, "version", (*p)->srw_version); - add_xsd_string(ptr, "recordPacking", req->recordPacking); + if (version2) + { + add_xsd_string(ptr, "recordXMLEscaping", req->recordPacking); + add_xsd_string(ptr, "recordPacking", req->packing); + } + else + add_xsd_string(ptr, "recordPacking", req->recordPacking); add_xsd_string(ptr, "stylesheet", req->stylesheet); add_xsd_string(ptr, "database", req->database); } @@ -1138,7 +1169,7 @@ int yaz_srw_codec(ODR o, void * vptr, Z_SRW_PDU **handler_data, { xmlNodePtr ptr1 = xmlNewChild(ptr, 0, BAD_CAST "record", 0); yaz_srw_record(o, ptr1, &res->record, &res->extra_record, - client_data); + client_data, version2); } if (res->num_diagnostics) { @@ -1285,7 +1316,7 @@ int yaz_ucp_codec(ODR o, void * vptr, Z_SRW_PDU **handler_data, { req->record = yaz_srw_get_record(o); yaz_srw_record(o, ptr, req->record, &req->extra_record, - client_data); + client_data, 0); } else if (match_xsd_string(ptr, "stylesheet", o, &req->stylesheet)) @@ -1333,7 +1364,7 @@ int yaz_ucp_codec(ODR o, void * vptr, Z_SRW_PDU **handler_data, { res->record = yaz_srw_get_record(o); yaz_srw_record(o, ptr, res->record, &res->extra_record, - client_data); + client_data, 0); } else if (match_element(ptr, "diagnostics")) yaz_srw_diagnostics(o, ptr, &res->diagnostics, @@ -1378,7 +1409,7 @@ int yaz_ucp_codec(ODR o, void * vptr, Z_SRW_PDU **handler_data, xmlNodePtr rptr = xmlNewChild(ptr, 0, BAD_CAST "record", 0); xmlSetNs(rptr, ns_srw); yaz_srw_record(o, rptr, req->record, &req->extra_record, - client_data); + client_data, 0); } if (req->extraRequestData_len) { @@ -1410,7 +1441,7 @@ int yaz_ucp_codec(ODR o, void * vptr, Z_SRW_PDU **handler_data, xmlNodePtr rptr = xmlNewChild(ptr, 0, BAD_CAST "record", 0); xmlSetNs(rptr, ns_srw); yaz_srw_record(o, rptr, res->record, &res->extra_record, - client_data); + client_data, 0); } if (res->num_diagnostics) {