X-Git-Url: http://git.indexdata.com/?p=yaz-moved-to-github.git;a=blobdiff_plain;f=src%2Fsrwutil.c;h=c0e496ba13a384f887bae83e4939e634491b4e93;hp=40c8039e4edeaea2c79421cf8bcd680c05cc512b;hb=c2981f9eaa8aaf7d04e40f74a99415942bca7101;hpb=2715f6522ca62ab5dbc886c21ed18945743216f0 diff --git a/src/srwutil.c b/src/srwutil.c index 40c8039..c0e496b 100644 --- a/src/srwutil.c +++ b/src/srwutil.c @@ -1,5 +1,5 @@ /* This file is part of the YAZ toolkit. - * Copyright (C) 1995-2011 Index Data + * Copyright (C) 1995-2012 Index Data * See the file LICENSE for details. */ /** @@ -148,7 +148,7 @@ void yaz_uri_val_int(const char *path, const char *name, ODR o, Odr_int **intp) *intp = odr_intdup(o, atoi(v)); } -void yaz_mk_srw_diagnostic(ODR o, Z_SRW_diagnostic *d, +void yaz_mk_srw_diagnostic(ODR o, Z_SRW_diagnostic *d, const char *uri, const char *message, const char *details) { @@ -163,11 +163,11 @@ void yaz_mk_srw_diagnostic(ODR o, Z_SRW_diagnostic *d, d->details = 0; } -void yaz_mk_std_diagnostic(ODR o, Z_SRW_diagnostic *d, +void yaz_mk_std_diagnostic(ODR o, Z_SRW_diagnostic *d, int code, const char *details) { char uri[40]; - + sprintf(uri, "info:srw/diagnostic/1/%d", code); yaz_mk_srw_diagnostic(o, d, uri, 0, details); } @@ -190,7 +190,7 @@ void yaz_add_srw_diagnostic(ODR o, Z_SRW_diagnostic **d, int *num, int code, const char *addinfo) { char uri[40]; - + sprintf(uri, "info:srw/diagnostic/1/%d", code); yaz_add_srw_diagnostic_uri(o, d, num, uri, 0, addinfo); } @@ -200,7 +200,7 @@ void yaz_add_sru_update_diagnostic(ODR o, Z_SRW_diagnostic **d, int *num, int code, const char *addinfo) { char uri[40]; - + sprintf(uri, "info:srw/diagnostic/12/%d", code); yaz_add_srw_diagnostic_uri(o, d, num, uri, 0, addinfo); } @@ -215,9 +215,9 @@ void yaz_mk_sru_surrogate(ODR o, Z_SRW_record *record, int pos, len += strlen(message); if (details) len += strlen(details); - + record->recordData_buf = (char *) odr_malloc(o, len); - + sprintf(record->recordData_buf, "\n" " info:srw/diagnostic/1/%d\n", code); @@ -237,7 +237,7 @@ void yaz_mk_sru_surrogate(ODR o, Z_SRW_record *record, int pos, static void grab_charset(ODR o, const char *content_type, char **charset) { if (charset) - { + { const char *charset_p = 0; if (content_type && (charset_p = strstr(content_type, "; charset="))) { @@ -260,7 +260,7 @@ 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 && + if (content_type && (!yaz_strcmp_del("text/xml", content_type, "; ") || !yaz_strcmp_del("application/soap+xml", content_type, "; ") || !yaz_strcmp_del("text/plain", content_type, "; "))) @@ -268,7 +268,7 @@ int yaz_srw_decode(Z_HTTP_Request *hreq, Z_SRW_PDU **srw_pdu, char *db = "Default"; const char *p0 = hreq->path, *p1; int ret = -1; - + static Z_SOAP_Handler soap_handlers[4] = { #if YAZ_HAVE_XML2 { YAZ_XMLNS_SRU_v1_1, 0, (Z_SOAP_fun) yaz_srw_codec }, @@ -277,7 +277,7 @@ int yaz_srw_decode(Z_HTTP_Request *hreq, Z_SRW_PDU **srw_pdu, #endif {0, 0, 0} }; - + if (*p0 == '/') p0++; p1 = strchr(p0, '?'); @@ -287,14 +287,14 @@ int yaz_srw_decode(Z_HTTP_Request *hreq, Z_SRW_PDU **srw_pdu, db = yaz_decode_sru_dbpath_odr(decode, p0, p1 - p0); grab_charset(decode, content_type, charset); - ret = z_soap_codec(decode, soap_package, + ret = z_soap_codec(decode, soap_package, &hreq->content_buf, &hreq->content_len, soap_handlers); if (ret == 0 && (*soap_package)->which == Z_SOAP_generic) { *srw_pdu = (Z_SRW_PDU*) (*soap_package)->u.generic->p; yaz_srw_decodeauth(*srw_pdu, hreq, 0, 0, decode); - + if ((*srw_pdu)->which == Z_SRW_searchRetrieve_request && (*srw_pdu)->u.request->database == 0) (*srw_pdu)->u.request->database = db; @@ -320,7 +320,7 @@ int yaz_srw_decode(Z_HTTP_Request *hreq, Z_SRW_PDU **srw_pdu, } #if YAZ_HAVE_XML2 -static int yaz_sru_decode_integer(ODR odr, const char *pname, +static int yaz_sru_decode_integer(ODR odr, const char *pname, const char *valstr, Odr_int **valp, Z_SRW_diagnostic **diag, int *num_diag, int min_value) @@ -347,7 +347,7 @@ static int yaz_sru_decode_integer(ODR odr, const char *pname, /** 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) @@ -367,7 +367,7 @@ int yaz_sru_decode(Z_HTTP_Request *hreq, Z_SRW_PDU **srw_pdu, not "multipart/form-data" . */ if (!strcmp(hreq->method, "GET") - || + || (!strcmp(hreq->method, "POST") && content_type && !yaz_strcmp_del("application/x-www-form-urlencoded", content_type, "; "))) @@ -466,8 +466,11 @@ int yaz_sru_decode(Z_HTTP_Request *hreq, Z_SRW_PDU **srw_pdu, (*l)->next = 0; } else - yaz_add_srw_diagnostic(decode, diag, num_diag, - YAZ_SRW_UNSUPP_PARAMETER, n); + { + if (*num_diag < 10) + yaz_add_srw_diagnostic(decode, diag, num_diag, + YAZ_SRW_UNSUPP_PARAMETER, n); + } } } if (!version) @@ -487,12 +490,12 @@ int yaz_sru_decode(Z_HTTP_Request *hreq, Z_SRW_PDU **srw_pdu, YAZ_SRW_UNSUPP_VERSION, "1.2"); version = "1.2"; } - + if (!operation) { if (uri_name) yaz_add_srw_diagnostic( - decode, diag, num_diag, + decode, diag, num_diag, YAZ_SRW_MANDATORY_PARAMETER_NOT_SUPPLIED, "operation"); operation = "explain"; } @@ -516,7 +519,7 @@ int yaz_sru_decode(Z_HTTP_Request *hreq, Z_SRW_PDU **srw_pdu, } else yaz_add_srw_diagnostic( - decode, diag, num_diag, + decode, diag, num_diag, YAZ_SRW_MANDATORY_PARAMETER_NOT_SUPPLIED, "query"); if (sortKeys) @@ -529,11 +532,11 @@ int yaz_sru_decode(Z_HTTP_Request *hreq, Z_SRW_PDU **srw_pdu, sr->u.request->recordPacking = recordPacking; sr->u.request->stylesheet = stylesheet; - yaz_sru_decode_integer(decode, "maximumRecords", maximumRecords, - &sr->u.request->maximumRecords, + yaz_sru_decode_integer(decode, "maximumRecords", maximumRecords, + &sr->u.request->maximumRecords, diag, num_diag, 0); - - yaz_sru_decode_integer(decode, "startRecord", startRecord, + + yaz_sru_decode_integer(decode, "startRecord", startRecord, &sr->u.request->startRecord, diag, num_diag, 1); @@ -542,14 +545,14 @@ int yaz_sru_decode(Z_HTTP_Request *hreq, Z_SRW_PDU **srw_pdu, (*soap_package) = (Z_SOAP *) odr_malloc(decode, sizeof(**soap_package)); (*soap_package)->which = Z_SOAP_generic; - + (*soap_package)->u.generic = (Z_SOAP_Generic *) odr_malloc(decode, sizeof(*(*soap_package)->u.generic)); - + (*soap_package)->u.generic->p = sr; (*soap_package)->u.generic->ns = soap_handlers[0].ns; (*soap_package)->u.generic->no = 0; - + (*soap_package)->ns = "SRU"; return 0; @@ -572,14 +575,14 @@ int yaz_sru_decode(Z_HTTP_Request *hreq, Z_SRW_PDU **srw_pdu, (*soap_package) = (Z_SOAP *) odr_malloc(decode, sizeof(**soap_package)); (*soap_package)->which = Z_SOAP_generic; - + (*soap_package)->u.generic = (Z_SOAP_Generic *) odr_malloc(decode, sizeof(*(*soap_package)->u.generic)); - + (*soap_package)->u.generic->p = sr; (*soap_package)->u.generic->ns = soap_handlers[0].ns; (*soap_package)->u.generic->no = 0; - + (*soap_package)->ns = "SRU"; return 0; @@ -607,17 +610,17 @@ int yaz_sru_decode(Z_HTTP_Request *hreq, Z_SRW_PDU **srw_pdu, } else yaz_add_srw_diagnostic( - decode, diag, num_diag, + decode, diag, num_diag, YAZ_SRW_MANDATORY_PARAMETER_NOT_SUPPLIED, "scanClause"); sr->u.scan_request->database = db; - + yaz_sru_decode_integer(decode, "maximumTerms", - maximumTerms, + maximumTerms, &sr->u.scan_request->maximumTerms, diag, num_diag, 0); - + yaz_sru_decode_integer(decode, "responsePosition", - responsePosition, + responsePosition, &sr->u.scan_request->responsePosition, diag, num_diag, 0); @@ -626,14 +629,14 @@ int yaz_sru_decode(Z_HTTP_Request *hreq, Z_SRW_PDU **srw_pdu, (*soap_package) = (Z_SOAP *) odr_malloc(decode, sizeof(**soap_package)); (*soap_package)->which = Z_SOAP_generic; - + (*soap_package)->u.generic = (Z_SOAP_Generic *) odr_malloc(decode, sizeof(*(*soap_package)->u.generic)); - + (*soap_package)->u.generic->p = sr; (*soap_package)->u.generic->ns = soap_handlers[0].ns; (*soap_package)->u.generic->no = 0; - + (*soap_package)->ns = "SRU"; return 0; @@ -655,17 +658,17 @@ int yaz_sru_decode(Z_HTTP_Request *hreq, Z_SRW_PDU **srw_pdu, (*soap_package) = (Z_SOAP *) odr_malloc(decode, sizeof(**soap_package)); (*soap_package)->which = Z_SOAP_generic; - + (*soap_package)->u.generic = (Z_SOAP_Generic *) odr_malloc(decode, sizeof(*(*soap_package)->u.generic)); - + (*soap_package)->u.generic->p = sr; (*soap_package)->u.generic->ns = soap_handlers[0].ns; (*soap_package)->u.generic->no = 0; - + (*soap_package)->ns = "SRU"; - yaz_add_srw_diagnostic(decode, diag, num_diag, + yaz_add_srw_diagnostic(decode, diag, num_diag, YAZ_SRW_UNSUPP_OPERATION, operation); return 0; } @@ -767,6 +770,7 @@ Z_SRW_PDU *yaz_srw_get_pdu(ODR o, int which, const char *version) sr->u.response->nextRecordPosition = 0; sr->u.response->extra_records = 0; sr->u.response->facetList = 0; + sr->u.response->suggestions = 0; break; case Z_SRW_explain_request: sr->u.explain_request = (Z_SRW_explainRequest *) @@ -837,222 +841,6 @@ Z_SRW_PDU *yaz_srw_get_pdu(ODR o, int which, const char *version) return sr; } -/* bib1:srw */ -static int bib1_srw_map[] = { - 1, 1, - 2, 2, - 3, 11, - 4, 35, - 5, 12, - 6, 38, - 7, 30, - 8, 32, - 9, 29, - 108, 10, /* Malformed query : Syntax error */ - 10, 10, - 11, 12, - 11, 23, - 12, 60, - 13, 61, - 13, 62, - 14, 63, - 14, 64, - 14, 65, - 15, 68, - 15, 69, - 16, 70, - 17, 70, - 18, 50, - 19, 55, - 20, 56, - 21, 52, - 22, 50, - 23, 3, - 24, 66, - 25, 66, - 26, 66, - 27, 51, - 28, 52, - 29, 52, - 30, 51, - 31, 57, - 32, 58, - 33, 59, - 100, 1, /* bad map */ - 101, 3, - 102, 3, - 103, 3, - 104, 3, - 105, 3, - 106, 66, - 107, 11, - 108, 13, - 108, 14, - 108, 25, - 108, 26, - 108, 27, - 108, 45, - - 109, 2, - 110, 37, - 111, 1, - 112, 58, - 113, 10, - 114, 16, - 115, 16, - 116, 16, - 117, 19, - 117, 20, - 118, 22, - 119, 32, - 119, 31, - 120, 28, - 121, 15, - 122, 32, - 123, 22, - 123, 17, - 123, 18, - 124, 24, - 125, 36, - 126, 36, - 127, 36, - 128, 51, - 129, 39, - 130, 43, - 131, 40, - 132, 42, - 201, 44, - 201, 33, - 201, 34, - 202, 41, - 203, 43, - 205, 1, /* bad map */ - 206, 1, /* bad map */ - 207, 89, - 208, 1, /* bad map */ - 209, 80, - 210, 80, - 210, 81, - 211, 84, - 212, 85, - 213, 92, - 214, 90, - 215, 91, - 216, 92, - 217, 63, - 218, 1, /* bad map */ - 219, 1, /* bad map */ - 220, 1, /* bad map */ - 221, 1, /* bad map */ - 222, 3, - 223, 1, /* bad map */ - 224, 1, /* bad map */ - 225, 1, /* bad map */ - 226, 1, /* bad map */ - 227, 66, - 228, 1, /* bad map */ - 229, 36, - 230, 83, - 231, 89, - 232, 1, - 233, 1, /* bad map */ - 234, 1, /* bad map */ - 235, 2, - 236, 3, - 237, 82, - 238, 67, - 239, 66, - 240, 1, /* bad map */ - 241, 1, /* bad map */ - 242, 70, - 243, 1, /* bad map */ - 244, 66, - 245, 10, - 246, 10, - 247, 10, - 1001, 1, /* bad map */ - 1002, 1, /* bad map */ - 1003, 1, /* bad map */ - 1004, 1, /* bad map */ - 1005, 1, /* bad map */ - 1006, 1, /* bad map */ - 1007, 100, - 1008, 1, - 1009, 1, - 1010, 3, - 1011, 3, - 1012, 3, - 1013, 3, - 1014, 3, - 1015, 3, - 1015, 3, - 1016, 3, - 1017, 3, - 1018, 2, - 1019, 2, - 1020, 2, - 1021, 3, - 1022, 3, - 1023, 3, - 1024, 16, - 1025, 3, - 1026, 64, - 1027, 1, - 1028, 65, - 1029, 1, - 1040, 1, - /* 1041-1065 */ - 1066, 66, - 1066, 67, - 0 -}; - -/* - * This array contains overrides for when the first occurrence of a - * particular SRW error in the array above does not correspond with - * the best back-translation of that SRW error. - */ -static int srw_bib1_map[] = { - 66, 238, - /* No doubt there are many more */ - 0 -}; - - -int yaz_diag_bib1_to_srw (int code) -{ - const int *p = bib1_srw_map; - while (*p) - { - if (code == p[0]) - return p[1]; - p += 2; - } - return 1; -} - -int yaz_diag_srw_to_bib1(int code) -{ - /* Check explicit reverse-map first */ - const int *p = srw_bib1_map; - while (*p) - { - if (code == p[0]) - return p[1]; - p += 2; - } - - /* Fall back on reverse lookup in main map */ - p = bib1_srw_map; - while (*p) - { - if (code == p[1]) - return p[0]; - p += 2; - } - return 1; -} - void yaz_add_name_value_int(ODR o, char **name, char **value, int *i, char *a_name, Odr_int *val) { @@ -1105,14 +893,14 @@ static int yaz_get_sru_parms(const Z_SRW_PDU *srw_pdu, ODR encode, { case Z_SRW_sort_type_none: break; - case Z_SRW_sort_type_sort: + case Z_SRW_sort_type_sort: yaz_add_name_value_str(encode, name, value, &i, "sortKeys", srw_pdu->u.request->sort.sortKeys); break; } - yaz_add_name_value_int(encode, name, value, &i, "startRecord", + yaz_add_name_value_int(encode, name, value, &i, "startRecord", srw_pdu->u.request->startRecord); - yaz_add_name_value_int(encode, name, value, &i, "maximumRecords", + yaz_add_name_value_int(encode, name, value, &i, "maximumRecords", srw_pdu->u.request->maximumRecords); yaz_add_name_value_str(encode, name, value, &i, "recordSchema", srw_pdu->u.request->recordSchema); @@ -1122,7 +910,7 @@ static int yaz_get_sru_parms(const Z_SRW_PDU *srw_pdu, ODR encode, srw_pdu->u.request->recordXPath); yaz_add_name_value_str(encode, name, value, &i, "stylesheet", srw_pdu->u.request->stylesheet); - yaz_add_name_value_int(encode, name, value, &i, "resultSetTTL", + yaz_add_name_value_int(encode, name, value, &i, "resultSetTTL", srw_pdu->u.request->resultSetTTL); break; case Z_SRW_explain_request: @@ -1148,9 +936,9 @@ static int yaz_get_sru_parms(const Z_SRW_PDU *srw_pdu, ODR encode, srw_pdu->u.scan_request->scanClause.xcql); break; } - yaz_add_name_value_int(encode, name, value, &i, "responsePosition", + yaz_add_name_value_int(encode, name, value, &i, "responsePosition", srw_pdu->u.scan_request->responsePosition); - yaz_add_name_value_int(encode, name, value, &i, "maximumTerms", + yaz_add_name_value_int(encode, name, value, &i, "maximumTerms", srw_pdu->u.scan_request->maximumTerms); yaz_add_name_value_str(encode, name, value, &i, "stylesheet", srw_pdu->u.scan_request->stylesheet); @@ -1183,14 +971,14 @@ int yaz_sru_get_encode(Z_HTTP_Request *hreq, Z_SRW_PDU *srw_pdu, char *uri_args; char *path; - z_HTTP_header_add_basic_auth(encode, &hreq->headers, + z_HTTP_header_add_basic_auth(encode, &hreq->headers, srw_pdu->username, srw_pdu->password); if (yaz_get_sru_parms(srw_pdu, encode, name, value, MAX_SRU_PARAMETERS)) return -1; yaz_array_to_uri(&uri_args, encode, name, value); hreq->method = "GET"; - + path = (char *) odr_malloc(encode, strlen(hreq->path) + strlen(uri_args) + 4); @@ -1209,7 +997,7 @@ int yaz_sru_post_encode(Z_HTTP_Request *hreq, Z_SRW_PDU *srw_pdu, char *name[MAX_SRU_PARAMETERS], *value[MAX_SRU_PARAMETERS]; /* definite upper limit for SRU params */ char *uri_args; - z_HTTP_header_add_basic_auth(encode, &hreq->headers, + z_HTTP_header_add_basic_auth(encode, &hreq->headers, srw_pdu->username, srw_pdu->password); if (yaz_get_sru_parms(srw_pdu, encode, name, value, MAX_SRU_PARAMETERS)) return -1; @@ -1217,7 +1005,7 @@ int yaz_sru_post_encode(Z_HTTP_Request *hreq, Z_SRW_PDU *srw_pdu, yaz_array_to_uri(&uri_args, encode, name, value); hreq->method = "POST"; - + hreq->content_buf = uri_args; hreq->content_len = strlen(uri_args); @@ -1239,12 +1027,12 @@ int yaz_sru_soap_encode(Z_HTTP_Request *hreq, Z_SRW_PDU *srw_pdu, }; Z_SOAP *p = (Z_SOAP*) odr_malloc(odr, sizeof(*p)); - z_HTTP_header_add_basic_auth(odr, &hreq->headers, + z_HTTP_header_add_basic_auth(odr, &hreq->headers, srw_pdu->username, srw_pdu->password); z_HTTP_header_add_content_type(odr, &hreq->headers, "text/xml", charset); - + z_HTTP_header_add(odr, &hreq->headers, "SOAPAction", "\"\""); p->which = Z_SOAP_generic; @@ -1267,7 +1055,7 @@ int yaz_sru_soap_encode(Z_HTTP_Request *hreq, Z_SRW_PDU *srw_pdu, Z_SRW_recordVersion *yaz_srw_get_record_versions(ODR odr, int num) { - Z_SRW_recordVersion *ver + Z_SRW_recordVersion *ver = (Z_SRW_recordVersion *) odr_malloc(odr,num * sizeof(*ver)); int i; for (i = 0; i < num; ++i)