X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=src%2Fsrwutil.c;h=c476d1105b23a7a2bcc0088dd6673a93a2b8113e;hp=6976bfc6b7b8b34475d25fb13649a9ae5502a98c;hb=84d7b06c13daa609e93f353e655c4b02f936d65c;hpb=6a07d35e5125e4a07ffcc75cfbd63052790b4605 diff --git a/src/srwutil.c b/src/srwutil.c index 6976bfc..c476d11 100644 --- a/src/srwutil.c +++ b/src/srwutil.c @@ -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.19 2004-11-21 21:56:28 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 #include #include @@ -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; @@ -256,11 +263,16 @@ int yaz_sru_decode(Z_HTTP_Request *hreq, Z_SRW_PDU **srw_pdu, char *sortKeys = 0; char *stylesheet = 0; char *scanClause = 0; + char *pScanClause = 0; char *recordXPath = 0; char *recordSchema = 0; 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; @@ -306,10 +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-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); } @@ -382,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; @@ -407,15 +429,35 @@ 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); - if (!scanClause) - yaz_add_srw_diagnostic(decode, diag, num_diag, 7, - "scanClause"); sr->srw_version = version; *srw_pdu = sr; - sr->u.scan_request->scanClause = scanClause; + + if (scanClause) + { + sr->u.scan_request->query_type = Z_SRW_query_type_cql; + sr->u.scan_request->scanClause.cql = scanClause; + } + else if (pScanClause) + { + sr->u.scan_request->query_type = Z_SRW_query_type_pqf; + sr->u.scan_request->scanClause.pqf = pScanClause; + } + else + yaz_add_srw_diagnostic(decode, diag, num_diag, 7, + "scanClause"); 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)); @@ -529,7 +571,8 @@ Z_SRW_PDU *yaz_srw_get(ODR o, int which) sr->u.scan_request->stylesheet = 0; sr->u.scan_request->maximumTerms = 0; sr->u.scan_request->responsePosition = 0; - sr->u.scan_request->scanClause = 0; + sr->u.scan_request->query_type = Z_SRW_query_type_cql; + sr->u.scan_request->scanClause.cql = 0; break; case Z_SRW_scan_response: sr->u.scan_response = (Z_SRW_scanResponse *)