X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=src%2Fsrwutil.c;h=2b6e0991aae39cc5051a7127ba31a46a834320e5;hp=9420a217d24eec7970dc1b9fbaec88a97695178f;hb=b1d7576903bc85c943182ef1bf5e35149c0673f6;hpb=1331fd610a8bfc1e5a849d2c4d598c11557a8372 diff --git a/src/srwutil.c b/src/srwutil.c index 9420a21..2b6e099 100644 --- a/src/srwutil.c +++ b/src/srwutil.c @@ -269,11 +269,12 @@ int yaz_srw_decode(Z_HTTP_Request *hreq, Z_SRW_PDU **srw_pdu, const char *p0 = hreq->path, *p1; int ret = -1; - static Z_SOAP_Handler soap_handlers[4] = { + static Z_SOAP_Handler soap_handlers[5] = { #if YAZ_HAVE_XML2 { YAZ_XMLNS_SRU_v1_1, 0, (Z_SOAP_fun) yaz_srw_codec }, { YAZ_XMLNS_SRU_v1_0, 0, (Z_SOAP_fun) yaz_srw_codec }, { YAZ_XMLNS_UPDATE_v0_9, 0, (Z_SOAP_fun) yaz_ucp_codec }, + { YAZ_XMLNS_SRU_v2_mask, 0, (Z_SOAP_fun) yaz_srw_codec }, #endif {0, 0, 0} }; @@ -295,6 +296,10 @@ int yaz_srw_decode(Z_HTTP_Request *hreq, Z_SRW_PDU **srw_pdu, *srw_pdu = (Z_SRW_PDU*) (*soap_package)->u.generic->p; yaz_srw_decodeauth(*srw_pdu, hreq, 0, 0, decode); + /* last entry in handlers - SRU 2.0 - is turned into + offset 0.. due to other pieces relying on it */ + if ((*soap_package)->u.generic->no == 3) + (*soap_package)->u.generic->no = 0; if ((*srw_pdu)->which == Z_SRW_searchRetrieve_request && (*srw_pdu)->u.request->database == 0) (*srw_pdu)->u.request->database = db; @@ -386,7 +391,8 @@ int yaz_sru_decode(Z_HTTP_Request *hreq, Z_SRW_PDU **srw_pdu, char *scanClause = 0; char *recordXPath = 0; char *recordSchema = 0; - char *recordPacking = "xml"; /* xml packing is default for SRU */ + char *recordXMLEscaping = 0; + char *recordPacking = 0; char *maximumRecords = 0; char *startRecord = 0; char *maximumTerms = 0; @@ -443,6 +449,8 @@ int yaz_sru_decode(Z_HTTP_Request *hreq, Z_SRW_PDU **srw_pdu, recordSchema = v; else if (!strcmp(n, "recordPacking")) recordPacking = v; + else if (!strcmp(n, "recordXMLEscaping")) + recordXMLEscaping = v; else if (!strcmp(n, "version")) version = v; else if (!strcmp(n, "scanClause")) @@ -480,24 +488,16 @@ int yaz_sru_decode(Z_HTTP_Request *hreq, Z_SRW_PDU **srw_pdu, } } } - if (!version) - { - if (uri_name) - yaz_add_srw_diagnostic( - decode, diag, num_diag, - YAZ_SRW_MANDATORY_PARAMETER_NOT_SUPPLIED, "version"); - version = "1.1"; - } - + if (!operation && query) + operation = "searchRetrieve"; version = yaz_negotiate_sru_version(version); if (!version) { /* negotiation failed. */ yaz_add_srw_diagnostic(decode, diag, num_diag, - YAZ_SRW_UNSUPP_VERSION, "1.2"); - version = "1.2"; + YAZ_SRW_UNSUPP_VERSION, "2.0"); + version = "2.0"; } - if (!operation) { if (uri_name) @@ -506,6 +506,20 @@ int yaz_sru_decode(Z_HTTP_Request *hreq, Z_SRW_PDU **srw_pdu, YAZ_SRW_MANDATORY_PARAMETER_NOT_SUPPLIED, "operation"); operation = "explain"; } + if (strcmp(version, "2.0")) + { + if (recordXMLEscaping) + { + yaz_add_srw_diagnostic(decode, diag, num_diag, + YAZ_SRW_UNSUPP_PARAMETER, + "recordXMLEscaping"); + + } + recordXMLEscaping = recordPacking; + recordPacking = "packed"; + } + if (!recordXMLEscaping) + recordXMLEscaping = "xml"; if (!strcmp(operation, "searchRetrieve")) { Z_SRW_PDU *sr = yaz_srw_get(decode, Z_SRW_searchRetrieve_request); @@ -530,7 +544,8 @@ int yaz_sru_decode(Z_HTTP_Request *hreq, Z_SRW_PDU **srw_pdu, } sr->u.request->recordXPath = recordXPath; sr->u.request->recordSchema = recordSchema; - sr->u.request->recordPacking = recordPacking; + sr->u.request->recordPacking = recordXMLEscaping; + sr->u.request->packing = recordPacking; sr->u.request->stylesheet = stylesheet; yaz_sru_decode_integer(decode, "maximumRecords", maximumRecords, @@ -568,7 +583,8 @@ int yaz_sru_decode(Z_HTTP_Request *hreq, Z_SRW_PDU **srw_pdu, sr->extra_args = extra_args; yaz_srw_decodeauth(sr, hreq, username, password, decode); *srw_pdu = sr; - sr->u.explain_request->recordPacking = recordPacking; + sr->u.explain_request->recordPacking = recordXMLEscaping; + sr->u.explain_request->packing = recordPacking; sr->u.explain_request->database = db; sr->u.explain_request->stylesheet = stylesheet; @@ -718,14 +734,14 @@ static Z_SRW_PDU *yaz_srw_get_core_ver(ODR o, const char *version) return p; } -Z_SRW_PDU *yaz_srw_get_core_v_1_1(ODR o) +Z_SRW_PDU *yaz_srw_get_core_v_2_0(ODR o) { - return yaz_srw_get_core_ver(o, "1.1"); + return yaz_srw_get_core_ver(o, "2.0"); } Z_SRW_PDU *yaz_srw_get(ODR o, int which) { - return yaz_srw_get_pdu(o, which, "1.1"); + return yaz_srw_get_pdu(o, which, "2.0"); } Z_SRW_PDU *yaz_srw_get_pdu(ODR o, int which, const char *version) @@ -746,6 +762,7 @@ Z_SRW_PDU *yaz_srw_get_pdu(ODR o, int which, const char *version) sr->u.request->maximumRecords = 0; sr->u.request->recordSchema = 0; sr->u.request->recordPacking = 0; + sr->u.request->packing = 0; sr->u.request->recordXPath = 0; sr->u.request->database = 0; sr->u.request->resultSetTTL = 0; @@ -771,6 +788,7 @@ Z_SRW_PDU *yaz_srw_get_pdu(ODR o, int which, const char *version) sr->u.explain_request = (Z_SRW_explainRequest *) odr_malloc(o, sizeof(*sr->u.explain_request)); sr->u.explain_request->recordPacking = 0; + sr->u.explain_request->packing = 0; sr->u.explain_request->database = 0; sr->u.explain_request->stylesheet = 0; break; @@ -862,16 +880,19 @@ void yaz_add_name_value_str(ODR o, char **name, char **value, int *i, static int yaz_get_sru_parms(const Z_SRW_PDU *srw_pdu, ODR encode, char **name, char **value, int max_names) { + int version2 = strcmp(srw_pdu->srw_version, "2.") > 0; int i = 0; char *queryType; - yaz_add_name_value_str(encode, name, value, &i, "version", srw_pdu->srw_version); + if (!version2) + yaz_add_name_value_str(encode, name, value, &i, "version", srw_pdu->srw_version); name[i] = "operation"; switch (srw_pdu->which) { case Z_SRW_searchRetrieve_request: - value[i++] = "searchRetrieve"; + if (!version2) + value[i++] = "searchRetrieve"; queryType = srw_pdu->u.request->queryType; - if (strcmp(srw_pdu->srw_version, "2.") > 0) + if (version2) { yaz_add_name_value_str(encode, name, value, &i, "queryType", queryType); @@ -890,7 +911,7 @@ static int yaz_get_sru_parms(const Z_SRW_PDU *srw_pdu, ODR encode, yaz_add_name_value_str(encode, name, value, &i, "x-pquery", srw_pdu->u.request->query); } - else if (!strcmp(queryType, "pqf")) + else if (!strcmp(queryType, "xcql")) { yaz_add_name_value_str(encode, name, value, &i, "x-cql", srw_pdu->u.request->query); @@ -911,8 +932,16 @@ static int yaz_get_sru_parms(const Z_SRW_PDU *srw_pdu, ODR encode, 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); + if (version2) + { + yaz_add_name_value_str(encode, name, value, &i, "recordXMLEscaping", + srw_pdu->u.request->recordPacking); + yaz_add_name_value_str(encode, name, value, &i, "recordPacking", + srw_pdu->u.request->packing); + } + else + 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", @@ -922,13 +951,24 @@ static int yaz_get_sru_parms(const Z_SRW_PDU *srw_pdu, ODR encode, break; case Z_SRW_explain_request: value[i++] = "explain"; + + if (version2) + { + yaz_add_name_value_str(encode, name, value, &i, "recordXMLEscaping", + srw_pdu->u.explain_request->recordPacking); + yaz_add_name_value_str(encode, name, value, &i, "recordPacking", + srw_pdu->u.explain_request->packing); + } + else + yaz_add_name_value_str(encode, name, value, &i, "recordPacking", + srw_pdu->u.explain_request->recordPacking); 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"; queryType = srw_pdu->u.request->queryType; - if (strcmp(srw_pdu->srw_version, "2.") > 0) + if (version2) { if (queryType && strcmp(queryType, "cql")) yaz_add_name_value_str(encode, name, value, &i, "queryType",