X-Git-Url: http://lists.indexdata.com/cgi-bin?a=blobdiff_plain;f=src%2Ffilter_sru_to_z3950.cpp;h=a0a7d82688c906bded35d2386daccf799de095f0;hb=dbadcb9afcc679f58e0a7208abccd0303abe4abe;hp=ffc979052282b8e228a1aa028868f6943305bd20;hpb=b14ef6f1d5405bd653691fb3ff47b3e9c6475500;p=metaproxy-moved-to-github.git diff --git a/src/filter_sru_to_z3950.cpp b/src/filter_sru_to_z3950.cpp index ffc9790..a0a7d82 100644 --- a/src/filter_sru_to_z3950.cpp +++ b/src/filter_sru_to_z3950.cpp @@ -1,5 +1,5 @@ -/* $Id: filter_sru_to_z3950.cpp,v 1.26 2007-01-08 11:10:06 marc Exp $ - Copyright (c) 2005-2006, Index Data. +/* $Id: filter_sru_to_z3950.cpp,v 1.29 2007-01-25 14:05:54 adam Exp $ + Copyright (c) 2005-2007, Index Data. See the LICENSE file for details */ @@ -47,8 +47,10 @@ namespace metaproxy_1 { SRW_query_type query_type) const; bool z3950_init_request(mp::Package &package, - const std::string - &database = "Default") const; + mp::odr &odr_en, + Z_SRW_PDU *sru_pdu_res, + const std::string + &database = "Default") const; bool z3950_close_request(mp::Package &package) const; @@ -70,6 +72,9 @@ namespace metaproxy_1 { Z_SRW_scanRequest const *sr_req) const; + bool z3950_to_srw_diagnostics_ok(mp::odr &odr_en, + Z_SRW_searchRetrieveResponse *srw_res, + Z_Records *records) const; int z3950_to_srw_diag(mp::odr &odr_en, Z_SRW_searchRetrieveResponse *srw_res, @@ -208,7 +213,7 @@ void yf::SRUtoZ3950::Impl::process(mp::Package &package) ok = mp_util::check_sru_query_exists(package, odr_en, sru_pdu_res, sr_req); - if (ok && z3950_init_request(package)) + if (ok && z3950_init_request(package, odr_en, sru_pdu_res)) { { ok = z3950_search_request(package, odr_en, @@ -244,7 +249,7 @@ void yf::SRUtoZ3950::Impl::process(mp::Package &package) 4, "scan"); // to be used when we do scan - if (false && z3950_init_request(package)) + if (false && z3950_init_request(package, odr_en, sru_pdu_res)) { z3950_scan_request(package, odr_en, sru_pdu_res, sr_req); z3950_close_request(package); @@ -270,6 +275,8 @@ void yf::SRUtoZ3950::Impl::process(mp::Package &package) bool yf::SRUtoZ3950::Impl::z3950_init_request(mp::Package &package, + mp::odr &odr_en, + Z_SRW_PDU *sru_pdu_res, const std::string &database) const { // prepare Z3950 package @@ -277,7 +284,6 @@ yf::SRUtoZ3950::Impl::z3950_init_request(mp::Package &package, z3950_package.copy_filter(package); // set initRequest APDU - mp::odr odr_en(ODR_ENCODE); Z_APDU *apdu = zget_APDU(odr_en, Z_APDU_initRequest); Z_InitRequest *init_req = apdu->u.initRequest; //TODO: add user name in apdu @@ -303,6 +309,10 @@ yf::SRUtoZ3950::Impl::z3950_init_request(mp::Package &package, // dead Z3950 backend detection if (z3950_package.session().is_closed()){ + yaz_add_srw_diagnostic(odr_en, + &(sru_pdu_res->u.response->diagnostics), + &(sru_pdu_res->u.response->num_diagnostics), + 2, 0); package.session().close(); return false; } @@ -311,9 +321,15 @@ yf::SRUtoZ3950::Impl::z3950_init_request(mp::Package &package, Z_GDU *z3950_gdu = z3950_package.response().get(); if (z3950_gdu && z3950_gdu->which == Z_GDU_Z3950 - && z3950_gdu->u.z3950->which == Z_APDU_initResponse) + && z3950_gdu->u.z3950->which == Z_APDU_initResponse + && *z3950_gdu->u.z3950->u.initResponse->result) return true; + yaz_add_srw_diagnostic(odr_en, + &(sru_pdu_res->u.response->diagnostics), + &(sru_pdu_res->u.response->num_diagnostics), + 2, 0); + package.session().close(); return false; } @@ -401,35 +417,44 @@ yf::SRUtoZ3950::Impl::z3950_search_request(mp::Package &package, Z_GDU *z3950_gdu = z3950_package.response().get(); //TODO: check success condition - //int yaz_diag_bib1_to_srw (int bib1_code); //int yaz_diag_srw_to_bib1(int srw_code); //Se kode i src/seshigh.c (srw_bend_search, srw_bend_init). - if (z3950_gdu && z3950_gdu->which == Z_GDU_Z3950 - && z3950_gdu->u.z3950->which == Z_APDU_searchResponse - && z3950_gdu->u.z3950->u.searchResponse->searchStatus) + if (!z3950_gdu || z3950_gdu->which != Z_GDU_Z3950 + || z3950_gdu->u.z3950->which != Z_APDU_searchResponse + || !z3950_gdu->u.z3950->u.searchResponse + || !z3950_gdu->u.z3950->u.searchResponse->searchStatus) { + yaz_add_srw_diagnostic(odr_en, + &(sru_pdu_res->u.response->diagnostics), + &(sru_pdu_res->u.response->num_diagnostics), + 2, 0); + package.session().close(); + return false; + } + + // everything fine, continuing + Z_SearchResponse *sr = z3950_gdu->u.z3950->u.searchResponse; - Z_SearchResponse *sr = z3950_gdu->u.z3950->u.searchResponse; - if (sr) - { - // srw'fy number of records - sru_pdu_res->u.response->numberOfRecords - = (int *) odr_malloc(odr_en, sizeof(int *)); - *(sru_pdu_res->u.response->numberOfRecords) = *(sr->resultCount); - - // srw'fy nextRecordPosition - //sru_pdu_res->u.response->nextRecordPosition - // = (int *) odr_malloc(odr_en, sizeof(int *)); - //*(sru_pdu_res->u.response->nextRecordPosition) = 1; - - } - - return true; + // checking non surrogate diagnostics in Z3950 search response package + if (!z3950_to_srw_diagnostics_ok(odr_en, sru_pdu_res->u.response, + sr->records)) + { + return false; } + + // Finally, roll on and srw'fy number of records + sru_pdu_res->u.response->numberOfRecords + = (int *) odr_malloc(odr_en, sizeof(int *)); + *(sru_pdu_res->u.response->numberOfRecords) = *(sr->resultCount); - return false; + // srw'fy nextRecordPosition + //sru_pdu_res->u.response->nextRecordPosition + // = (int *) odr_malloc(odr_en, sizeof(int *)); + //*(sru_pdu_res->u.response->nextRecordPosition) = 1; + + return true; } bool @@ -591,16 +616,13 @@ yf::SRUtoZ3950::Impl::z3950_present_request(mp::Package &package, Z_PresentResponse *pr = z3950_gdu->u.z3950->u.presentResponse; Z_SRW_searchRetrieveResponse *sru_res = sru_pdu_res->u.response; - // checking non surrogate dioagnostics in Z3950 present response package - if (pr->records - && pr->records->which == Z_Records_NSD - && pr->records->u.nonSurrogateDiagnostic) - { - //int http_code = - z3950_to_srw_diag(odr_en, sru_res, - pr->records->u.nonSurrogateDiagnostic); + + // checking non surrogate diagnostics in Z3950 present response package + if (!z3950_to_srw_diagnostics_ok(odr_en, sru_pdu_res->u.response, + pr->records)) return false; - } + + // copy all records if existing if (pr->records && pr->records->which == Z_Records_DBOSD) @@ -631,8 +653,8 @@ yf::SRUtoZ3950::Impl::z3950_present_request(mp::Package &package, = pr->records->u.databaseOrSurDiagnostics->records[i]; sru_res->records[i].recordPosition - = odr_intdup(odr_en, - i + *(apdu->u.presentRequest->resultSetStartPoint)); + = odr_intdup(odr_en, + i + *(apdu->u.presentRequest->resultSetStartPoint)); sru_res->records[i].recordPacking = record_packing; @@ -777,6 +799,24 @@ bool yf::SRUtoZ3950::Impl::z3950_build_query(mp::odr &odr_en, Z_Query *z_query, } +bool +yf::SRUtoZ3950::Impl::z3950_to_srw_diagnostics_ok(mp::odr &odr_en, + Z_SRW_searchRetrieveResponse + *sru_res, + Z_Records *records) const +{ + // checking non surrogate diagnostics in Z3950 present response package + if (records + && records->which == Z_Records_NSD + && records->u.nonSurrogateDiagnostic) + { + z3950_to_srw_diag(odr_en, sru_res, + records->u.nonSurrogateDiagnostic); + return false; + } + return true; +} + int yf::SRUtoZ3950::Impl::z3950_to_srw_diag(mp::odr &odr_en, @@ -784,13 +824,11 @@ yf::SRUtoZ3950::Impl::z3950_to_srw_diag(mp::odr &odr_en, Z_DefaultDiagFormat *ddf) const { int bib1_code = *ddf->condition; - if (bib1_code == 109) - return 404; sru_res->num_diagnostics = 1; sru_res->diagnostics = (Z_SRW_diagnostic *) odr_malloc(odr_en, sizeof(*sru_res->diagnostics)); yaz_mk_std_diagnostic(odr_en, sru_res->diagnostics, - yaz_diag_bib1_to_srw(*ddf->condition), + yaz_diag_bib1_to_srw(bib1_code), ddf->u.v2Addinfo); return 0; }