X-Git-Url: http://jsfdemo.indexdata.com/?a=blobdiff_plain;f=src%2Ffilter_sru_to_z3950.cpp;h=4f9618c148862121ca2e292c8dce25448fce67cc;hb=0627418ae05d1f79ec21f5579db0dbaf3c5ac286;hp=4fdc80bac2f18597a6861189943cd4b0aa70a2e7;hpb=81d733c7014f85212ff844b8d6e0e2f2bb569022;p=metaproxy-moved-to-github.git diff --git a/src/filter_sru_to_z3950.cpp b/src/filter_sru_to_z3950.cpp index 4fdc80b..4f9618c 100644 --- a/src/filter_sru_to_z3950.cpp +++ b/src/filter_sru_to_z3950.cpp @@ -73,16 +73,16 @@ namespace metaproxy_1 { boost::mutex m_mutex_session; boost::condition m_cond_session_ready; - std::map m_clients; + std::map m_clients; private: void sru(metaproxy_1::Package &package, Z_GDU *zgdu_req); int z3950_build_query( - mp::odr &odr_en, Z_Query *z_query, + mp::odr &odr_en, Z_Query *z_query, const Z_SRW_searchRetrieveRequest *req ) const; - + bool z3950_init_request( - mp::Package &package, + mp::Package &package, mp::odr &odr_en, std::string zurl, Z_SRW_PDU *sru_pdu_res, @@ -105,15 +105,15 @@ namespace metaproxy_1 { Z_SRW_PDU *sru_pdu_res, Z_SRW_searchRetrieveRequest const *sr_req ) const; - + bool z3950_to_srw_diagnostics_ok( - mp::odr &odr_en, + mp::odr &odr_en, Z_SRW_searchRetrieveResponse *srw_res, Z_Records *records ) const; - + int z3950_to_srw_diag( - mp::odr &odr_en, + mp::odr &odr_en, Z_SRW_searchRetrieveResponse *srw_res, Z_DefaultDiagFormat *ddf ) const; @@ -144,24 +144,24 @@ void yf::SRUtoZ3950::process(mp::Package &package) const void yf::SRUtoZ3950::Impl::configure(const xmlNode *confignode) { const xmlNode * dbnode; - + for (dbnode = confignode->children; dbnode; dbnode = dbnode->next) { if (dbnode->type != XML_ELEMENT_NODE) continue; - + std::string database; mp::xml::check_element_mp(dbnode, "database"); - for (struct _xmlAttr *attr = dbnode->properties; + for (struct _xmlAttr *attr = dbnode->properties; attr; attr = attr->next) { - + mp::xml::check_attribute(attr, "", "name"); database = mp::xml::get_text(attr); - + const xmlNode *explainnode; - for (explainnode = dbnode->children; + for (explainnode = dbnode->children; explainnode; explainnode = explainnode->next) { if (explainnode->type != XML_ELEMENT_NODE) @@ -169,7 +169,7 @@ void yf::SRUtoZ3950::Impl::configure(const xmlNode *confignode) if (explainnode) break; } - // assigning explain node to database name - no check yet + // assigning explain node to database name - no check yet m_database_explain.insert(std::make_pair(database, explainnode)); } } @@ -177,7 +177,7 @@ void yf::SRUtoZ3950::Impl::configure(const xmlNode *confignode) void yf::SRUtoZ3950::Impl::sru(mp::Package &package, Z_GDU *zgdu_req) { - bool ok = true; + bool ok = true; mp::odr odr_de(ODR_DECODE); Z_SRW_PDU *sru_pdu_req = 0; @@ -203,28 +203,28 @@ void yf::SRUtoZ3950::Impl::sru(mp::Package &package, Z_GDU *zgdu_req) char *stylesheet = 0; // filter acts as sink for non-valid SRU requests - if (! (sru_pdu_req = mp_util::decode_sru_request(package, odr_de, odr_en, + if (! (sru_pdu_req = mp_util::decode_sru_request(package, odr_de, odr_en, sru_pdu_res, &soap, charset, stylesheet))) { if (soap) { - mp_util::build_sru_explain(package, odr_en, sru_pdu_res, + mp_util::build_sru_explain(package, odr_en, sru_pdu_res, sruinfo, explainnode); - mp_util::build_sru_response(package, odr_en, soap, + mp_util::build_sru_response(package, odr_en, soap, sru_pdu_res, charset, stylesheet); } else { - metaproxy_1::odr odr; - Z_GDU *zgdu_res = - odr.create_HTTP_Response(package.session(), + metaproxy_1::odr odr; + Z_GDU *zgdu_res = + odr.create_HTTP_Response(package.session(), zgdu_req->u.HTTP_Request, 400); package.response() = zgdu_res; } return; } - + bool enable_package_log = false; std::string zurl; Z_SRW_extra_arg *arg; @@ -256,19 +256,19 @@ void yf::SRUtoZ3950::Impl::sru(mp::Package &package, Z_GDU *zgdu_req) if (sru_pdu_req->which == Z_SRW_explain_request) { Z_SRW_explainRequest *er_req = sru_pdu_req->u.explain_request; - mp_util::build_sru_explain(package, odr_en, sru_pdu_res, + mp_util::build_sru_explain(package, odr_en, sru_pdu_res, sruinfo, explainnode, er_req); } else if (sru_pdu_req->which == Z_SRW_searchRetrieve_request && sru_pdu_req->u.request) { // searchRetrieve - Z_SRW_searchRetrieveRequest *sr_req = sru_pdu_req->u.request; - + Z_SRW_searchRetrieveRequest *sr_req = sru_pdu_req->u.request; + sru_pdu_res = yaz_srw_get_pdu(odr_en, Z_SRW_searchRetrieve_response, sru_pdu_req->srw_version); // checking that we have a query - ok = mp_util::check_sru_query_exists(package, odr_en, + ok = mp_util::check_sru_query_exists(package, odr_en, sru_pdu_res, sr_req); if (ok && z3950_init_request(package, odr_en, @@ -276,8 +276,8 @@ void yf::SRUtoZ3950::Impl::sru(mp::Package &package, Z_GDU *zgdu_req) { ok = z3950_search_request(package, odr_en, sru_pdu_res, sr_req, zurl); - - if (ok + + if (ok && sru_pdu_res->u.response->numberOfRecords && *(sru_pdu_res->u.response->numberOfRecords)) @@ -294,20 +294,20 @@ void yf::SRUtoZ3950::Impl::sru(mp::Package &package, Z_GDU *zgdu_req) { sru_pdu_res = yaz_srw_get_pdu(odr_en, Z_SRW_scan_response, sru_pdu_req->srw_version); - + // we do not do scan at the moment, therefore issuing a diagnostic yaz_add_srw_diagnostic(odr_en, - &(sru_pdu_res->u.scan_response->diagnostics), - &(sru_pdu_res->u.scan_response->num_diagnostics), + &(sru_pdu_res->u.scan_response->diagnostics), + &(sru_pdu_res->u.scan_response->num_diagnostics), YAZ_SRW_UNSUPP_OPERATION, "scan"); } else { sru_pdu_res = yaz_srw_get(odr_en, Z_SRW_explain_response); - + yaz_add_srw_diagnostic(odr_en, - &(sru_pdu_res->u.explain_response->diagnostics), - &(sru_pdu_res->u.explain_response->num_diagnostics), + &(sru_pdu_res->u.explain_response->diagnostics), + &(sru_pdu_res->u.explain_response->num_diagnostics), YAZ_SRW_UNSUPP_OPERATION, "unknown"); } @@ -318,19 +318,19 @@ void yf::SRUtoZ3950::Impl::sru(mp::Package &package, Z_GDU *zgdu_req) if (l.length()) { mp::wrbuf w; - + wrbuf_puts(w, "\n"); wrbuf_xmlputs(w, l.c_str()); wrbuf_puts(w, ""); - + sru_pdu_res->extraResponseData_len = w.len(); sru_pdu_res->extraResponseData_buf = odr_strdup(odr_en, wrbuf_cstr(w)); } } - + // build and send SRU response - mp_util::build_sru_response(package, odr_en, soap, + mp_util::build_sru_response(package, odr_en, soap, sru_pdu_res, charset, stylesheet); } @@ -350,13 +350,13 @@ yf::SRUtoZ3950::FrontendPtr yf::SRUtoZ3950::Impl::get_frontend( boost::mutex::scoped_lock lock(m_mutex_session); std::map::iterator it; - + while (true) { it = m_clients.find(package.session()); if (it == m_clients.end()) break; - + if (!it->second->m_in_use) { it->second->m_in_use = true; @@ -374,7 +374,7 @@ void yf::SRUtoZ3950::Impl::release_frontend(mp::Package &package) { boost::mutex::scoped_lock lock(m_mutex_session); std::map::iterator it; - + it = m_clients.find(package.session()); if (it != m_clients.end()) { @@ -419,9 +419,9 @@ void yf::SRUtoZ3950::Impl::process(mp::Package &package) { const char *path = zgdu_req->u.HTTP_Request->path; boost::mutex::scoped_lock lock(m_url_mutex); - + ActiveUrlMap::iterator it = m_active_urls.find(path); - + m_active_urls.erase(it); m_cond_url_ready.notify_all(); } @@ -433,8 +433,53 @@ void yf::SRUtoZ3950::Impl::process(mp::Package &package) release_frontend(package); } -bool -yf::SRUtoZ3950::Impl::z3950_init_request(mp::Package &package, +static void interpret_default_diag(int *error, + const char **addinfo, + Z_DefaultDiagFormat *r) +{ + *error = *r->condition; + *addinfo = r->u.v2Addinfo; +} + +static void interpret_init_diag2(int *error, + const char **addinfo, + Z_DiagnosticFormat *diag) +{ + if (diag->num > 0) + { + Z_DiagnosticFormat_s *ds = diag->elements[0]; + if (ds->which == Z_DiagnosticFormat_s_defaultDiagRec) + interpret_default_diag(error, addinfo, ds->u.defaultDiagRec); + } +} + +static void interpret_init_diag(int *error, + const char **addinfo, + Z_InitResponse *initrs) +{ + Z_External *uif = initrs->userInformationField; + if (uif && uif->which == Z_External_userInfo1) + { + int i; + Z_OtherInformation *ui = uif->u.userInfo1; + for (i = 0; i < ui->num_elements; i++) + { + Z_OtherInformationUnit *unit = ui->list[i]; + if (unit->which == Z_OtherInfo_externallyDefinedInfo && + unit->information.externallyDefinedInfo && + unit->information.externallyDefinedInfo->which == + Z_External_diag1) + { + interpret_init_diag2( + error, addinfo, + unit->information.externallyDefinedInfo->u.diag1); + } + } + } +} + +bool +yf::SRUtoZ3950::Impl::z3950_init_request(mp::Package &package, mp::odr &odr_en, std::string zurl, Z_SRW_PDU *sru_pdu_res, @@ -469,7 +514,7 @@ yf::SRUtoZ3950::Impl::z3950_init_request(mp::Package &package, *init_req->preferredMessageSize = 10*1024*1024; *init_req->maximumRecordSize = 10*1024*1024; - + ODR_MASK_SET(init_req->options, Z_Options_search); ODR_MASK_SET(init_req->options, Z_Options_present); ODR_MASK_SET(init_req->options, Z_Options_namedResultSets); @@ -480,7 +525,7 @@ yf::SRUtoZ3950::Impl::z3950_init_request(mp::Package &package, ODR_MASK_SET(init_req->protocolVersion, Z_ProtocolVersion_3); if (zurl.length()) - { + { std::string host; std::list dblist; mp_util::split_zurl(zurl, host, dblist); @@ -492,28 +537,26 @@ yf::SRUtoZ3950::Impl::z3950_init_request(mp::Package &package, // send Z3950 package z3950_package.move(); - // 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), - YAZ_SRW_SYSTEM_TEMPORARILY_UNAVAILABLE, 0); - return false; - } - // check successful initResponse 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->u.initResponse->result) - return true; - + int error = YAZ_SRW_SYSTEM_TEMPORARILY_UNAVAILABLE; + const char *addinfo = 0; + if (z3950_gdu && z3950_gdu->which == Z_GDU_Z3950 + && z3950_gdu->u.z3950->which == Z_APDU_initResponse) + { + Z_InitResponse *initrs = z3950_gdu->u.z3950->u.initResponse; + if (*initrs->result) + return true; + int z_error = 0; + interpret_init_diag(&error, &addinfo, initrs); + if (z_error) + error = yaz_diag_bib1_to_srw(z_error); + } yaz_add_srw_diagnostic(odr_en, &(sru_pdu_res->u.response->diagnostics), &(sru_pdu_res->u.response->num_diagnostics), - YAZ_SRW_SYSTEM_TEMPORARILY_UNAVAILABLE, 0); + error, addinfo); return false; } @@ -532,10 +575,10 @@ bool yf::SRUtoZ3950::Impl::z3950_close_request(mp::Package &package) const return false; } -bool yf::SRUtoZ3950::Impl::z3950_search_request(mp::Package &package, +bool yf::SRUtoZ3950::Impl::z3950_search_request(mp::Package &package, mp::odr &odr_en, Z_SRW_PDU *sru_pdu_res, - Z_SRW_searchRetrieveRequest + Z_SRW_searchRetrieveRequest const *sr_req, std::string zurl) const { @@ -561,34 +604,34 @@ bool yf::SRUtoZ3950::Impl::z3950_search_request(mp::Package &package, odr_malloc(odr_en, sizeof(char *)); if (sr_req->database) - z_searchRequest->databaseNames[0] + z_searchRequest->databaseNames[0] = odr_strdup(odr_en, const_cast(sr_req->database)); else - z_searchRequest->databaseNames[0] + z_searchRequest->databaseNames[0] = odr_strdup(odr_en, "Default"); } Z_Query *z_query = (Z_Query *) odr_malloc(odr_en, sizeof(Z_Query)); z_searchRequest->query = z_query; - + int sru_diagnostic = z3950_build_query(odr_en, z_query, sr_req); if (sru_diagnostic) - { + { yaz_add_srw_diagnostic(odr_en, - &(sru_pdu_res->u.response->diagnostics), - &(sru_pdu_res->u.response->num_diagnostics), + &(sru_pdu_res->u.response->diagnostics), + &(sru_pdu_res->u.response->num_diagnostics), sru_diagnostic, "query"); return false; } z3950_package.request() = apdu; - + z3950_package.move(); Z_GDU *z3950_gdu = z3950_package.response().get(); - if (!z3950_gdu || z3950_gdu->which != Z_GDU_Z3950 + 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) @@ -599,10 +642,10 @@ bool yf::SRUtoZ3950::Impl::z3950_search_request(mp::Package &package, YAZ_SRW_SYSTEM_TEMPORARILY_UNAVAILABLE, 0); return false; } - + Z_SearchResponse *sr = z3950_gdu->u.z3950->u.searchResponse; - if (!z3950_to_srw_diagnostics_ok(odr_en, sru_pdu_res->u.response, + if (!z3950_to_srw_diagnostics_ok(odr_en, sru_pdu_res->u.response, sr->records)) { return false; @@ -614,7 +657,7 @@ bool yf::SRUtoZ3950::Impl::z3950_search_request(mp::Package &package, } bool yf::SRUtoZ3950::Impl::z3950_present_request( - mp::Package &package, + mp::Package &package, mp::odr &odr_en, Z_SRW_PDU *sru_pdu_res, const Z_SRW_searchRetrieveRequest *sr_req) @@ -643,57 +686,57 @@ bool yf::SRUtoZ3950::Impl::z3950_present_request( { send_z3950_present = false; yaz_add_srw_diagnostic(odr_en, - &(sru_pdu_res->u.response->diagnostics), - &(sru_pdu_res->u.response->num_diagnostics), + &(sru_pdu_res->u.response->diagnostics), + &(sru_pdu_res->u.response->num_diagnostics), YAZ_SRW_XPATH_RETRIEVAL_UNSUPP, 0); } - + // resultSetTTL unsupported. // resultSetIdleTime in response if (sr_req->resultSetTTL) { send_z3950_present = false; yaz_add_srw_diagnostic(odr_en, - &(sru_pdu_res->u.response->diagnostics), - &(sru_pdu_res->u.response->num_diagnostics), + &(sru_pdu_res->u.response->diagnostics), + &(sru_pdu_res->u.response->num_diagnostics), YAZ_SRW_RESULT_SETS_UNSUPP, 0); } - + // sort unsupported if (sr_req->sort_type != Z_SRW_sort_type_none) { send_z3950_present = false; yaz_add_srw_diagnostic(odr_en, - &(sru_pdu_res->u.response->diagnostics), - &(sru_pdu_res->u.response->num_diagnostics), + &(sru_pdu_res->u.response->diagnostics), + &(sru_pdu_res->u.response->num_diagnostics), YAZ_SRW_SORT_UNSUPP, 0); } - + // start record requested negative, or larger than number of records if (start < 0 || start > *sru_pdu_res->u.response->numberOfRecords) { send_z3950_present = false; yaz_add_srw_diagnostic(odr_en, - &(sru_pdu_res->u.response->diagnostics), - &(sru_pdu_res->u.response->num_diagnostics), + &(sru_pdu_res->u.response->diagnostics), + &(sru_pdu_res->u.response->num_diagnostics), YAZ_SRW_FIRST_RECORD_POSITION_OUT_OF_RANGE, 0); - } - + } + // maximumRecords requested negative if (max_recs < 0) { send_z3950_present = false; yaz_add_srw_diagnostic(odr_en, - &(sru_pdu_res->u.response->diagnostics), - &(sru_pdu_res->u.response->num_diagnostics), + &(sru_pdu_res->u.response->diagnostics), + &(sru_pdu_res->u.response->num_diagnostics), YAZ_SRW_UNSUPP_PARAMETER_VALUE, "maximumRecords"); - } + } // exit on all these above diagnostics if (!send_z3950_present) return false; - + if (max_recs > *sru_pdu_res->u.response->numberOfRecords - start) max_recs = *sru_pdu_res->u.response->numberOfRecords - start + 1; @@ -705,65 +748,65 @@ bool yf::SRUtoZ3950::Impl::z3950_present_request( { // now packaging the z3950 present request Package z3950_package(package.session(), package.origin()); - z3950_package.copy_filter(package); + z3950_package.copy_filter(package); Z_APDU *apdu = zget_APDU(odr_en, Z_APDU_presentRequest); - + assert(apdu->u.presentRequest); - + *apdu->u.presentRequest->resultSetStartPoint = start + num; *apdu->u.presentRequest->numberOfRecordsRequested = max_recs - num; - + // set response packing to be same as "request" packing.. int record_packing = Z_SRW_recordPacking_XML; if (sr_req->recordPacking && 's' == *(sr_req->recordPacking)) record_packing = Z_SRW_recordPacking_string; - + // RecordSyntax will always be XML apdu->u.presentRequest->preferredRecordSyntax = odr_oiddup(odr_en, yaz_oid_recsyn_xml); - + // z3950'fy record schema if (sr_req->recordSchema) { - apdu->u.presentRequest->recordComposition - = (Z_RecordComposition *) + apdu->u.presentRequest->recordComposition + = (Z_RecordComposition *) odr_malloc(odr_en, sizeof(Z_RecordComposition)); - apdu->u.presentRequest->recordComposition->which + apdu->u.presentRequest->recordComposition->which = Z_RecordComp_simple; - apdu->u.presentRequest->recordComposition->u.simple + apdu->u.presentRequest->recordComposition->u.simple = mp_util::build_esn_from_schema(odr_en, - (const char *) - sr_req->recordSchema); + (const char *) + sr_req->recordSchema); } - + // attaching Z3950 package to filter chain z3950_package.request() = apdu; - - // sending Z30.50 present request + + // sending Z30.50 present request z3950_package.move(); - + //check successful Z3950 present response Z_GDU *z3950_gdu = z3950_package.response().get(); - if (!z3950_gdu || z3950_gdu->which != Z_GDU_Z3950 + if (!z3950_gdu || z3950_gdu->which != Z_GDU_Z3950 || z3950_gdu->u.z3950->which != Z_APDU_presentResponse || !z3950_gdu->u.z3950->u.presentResponse) - + { yaz_add_srw_diagnostic(odr_en, - &(sru_pdu_res->u.response->diagnostics), - &(sru_pdu_res->u.response->num_diagnostics), + &(sru_pdu_res->u.response->diagnostics), + &(sru_pdu_res->u.response->num_diagnostics), YAZ_SRW_SYSTEM_TEMPORARILY_UNAVAILABLE, 0); return false; } // everything fine, continuing - + Z_PresentResponse *pr = z3950_gdu->u.z3950->u.presentResponse; - + // checking non surrogate diagnostics in Z3950 present response package - if (!z3950_to_srw_diagnostics_ok(odr_en, sru_pdu_res->u.response, + if (!z3950_to_srw_diagnostics_ok(odr_en, sru_pdu_res->u.response, pr->records)) return false; - + // if anything but database or surrogate diagnostics, stop if (!pr->records || pr->records->which != Z_Records_DBOSD) break; @@ -775,26 +818,45 @@ bool yf::SRUtoZ3950::Impl::z3950_present_request( for (int i = 0; i < returned_recs; i++) { int position = i + *apdu->u.presentRequest->resultSetStartPoint; - Z_NamePlusRecord *npr + Z_NamePlusRecord *npr = pr->records->u.databaseOrSurDiagnostics->records[i]; - + sru_res->records[i + num].recordPacking = record_packing; - - if (npr->which == Z_NamePlusRecord_databaseRecord && - npr->u.databaseRecord->direct_reference + + if (npr->which == Z_NamePlusRecord_surrogateDiagnostic) + { + Z_DiagRec *p = npr->u.surrogateDiagnostic; + if (p->which == Z_DiagRec_defaultFormat) + { + Z_DefaultDiagFormat *df = p->u.defaultFormat; + int c = yaz_diag_bib1_to_srw(*df->condition); + + yaz_mk_sru_surrogate( + odr_en, sru_res->records + i + num, position, + c, df->u.v2Addinfo); + } + else + { + yaz_mk_sru_surrogate( + odr_en, sru_res->records + i + num, position, + YAZ_SRW_RECORD_TEMPORARILY_UNAVAILABLE, 0); + } + } + else if (npr->which == Z_NamePlusRecord_databaseRecord && + npr->u.databaseRecord->direct_reference && !oid_oidcmp(npr->u.databaseRecord->direct_reference, yaz_oid_recsyn_xml)) { // got XML record back Z_External *r = npr->u.databaseRecord; - sru_res->records[i + num].recordPosition = + sru_res->records[i + num].recordPosition = odr_intdup(odr_en, position); sru_res->records[i + num].recordSchema = sr_req->recordSchema; sru_res->records[i + num].recordData_buf - = odr_strdupn(odr_en, - (const char *)r->u.octet_aligned->buf, + = odr_strdupn(odr_en, + (const char *)r->u.octet_aligned->buf, r->u.octet_aligned->len); - sru_res->records[i + num].recordData_len + sru_res->records[i + num].recordData_len = r->u.octet_aligned->len; } else @@ -816,21 +878,21 @@ bool yf::SRUtoZ3950::Impl::z3950_present_request( } int yf::SRUtoZ3950::Impl::z3950_build_query( - mp::odr &odr_en, Z_Query *z_query, + mp::odr &odr_en, Z_Query *z_query, const Z_SRW_searchRetrieveRequest *req ) const -{ +{ if (req->query_type == Z_SRW_query_type_cql) { - Z_External *ext = (Z_External *) + Z_External *ext = (Z_External *) odr_malloc(odr_en, sizeof(*ext)); - ext->direct_reference = + ext->direct_reference = odr_getoidbystr(odr_en, "1.2.840.10003.16.2"); ext->indirect_reference = 0; ext->descriptor = 0; ext->which = Z_External_CQL; ext->u.cql = odr_strdup(odr_en, req->query.cql); - + z_query->which = Z_Query_type_104; z_query->u.type_104 = ext; return 0; @@ -840,9 +902,9 @@ int yf::SRUtoZ3950::Impl::z3950_build_query( { Z_RPNQuery *RPNquery; YAZ_PQF_Parser pqf_parser; - + pqf_parser = yaz_pqf_create (); - + RPNquery = yaz_pqf_parse (pqf_parser, odr_en, req->query.pqf); yaz_pqf_destroy(pqf_parser); @@ -852,24 +914,24 @@ int yf::SRUtoZ3950::Impl::z3950_build_query( z_query->which = Z_Query_type_1; z_query->u.type_1 = RPNquery; - + return 0; } return YAZ_SRW_MANDATORY_PARAMETER_NOT_SUPPLIED; } bool yf::SRUtoZ3950::Impl::z3950_to_srw_diagnostics_ok( - mp::odr &odr_en, - Z_SRW_searchRetrieveResponse + mp::odr &odr_en, + Z_SRW_searchRetrieveResponse *sru_res, Z_Records *records) const { // checking non surrogate diagnostics in Z3950 present response package - if (records + if (records && records->which == Z_Records_NSD && records->u.nonSurrogateDiagnostic) { - z3950_to_srw_diag(odr_en, sru_res, + z3950_to_srw_diag(odr_en, sru_res, records->u.nonSurrogateDiagnostic); return false; } @@ -877,7 +939,7 @@ bool yf::SRUtoZ3950::Impl::z3950_to_srw_diagnostics_ok( } int yf::SRUtoZ3950::Impl::z3950_to_srw_diag( - mp::odr &odr_en, + mp::odr &odr_en, Z_SRW_searchRetrieveResponse *sru_res, Z_DefaultDiagFormat *ddf) const { @@ -886,7 +948,7 @@ int yf::SRUtoZ3950::Impl::z3950_to_srw_diag( 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(bib1_code), + yaz_diag_bib1_to_srw(bib1_code), ddf->u.v2Addinfo); return 0; }