X-Git-Url: http://sru.miketaylor.org.uk/?a=blobdiff_plain;f=src%2Ffilter_sru_to_z3950.cpp;h=9187396961feaf994ec2f0758d5ac2491dd97ba0;hb=c1d953eee6c00432493bc364da6284704ccd9cc2;hp=7dd70a82109fde6c7d426a3bc1836866bcbe2090;hpb=9263a36f12d300b625f5dbf6aa2c0f118290e08c;p=metaproxy-moved-to-github.git diff --git a/src/filter_sru_to_z3950.cpp b/src/filter_sru_to_z3950.cpp index 7dd70a8..9187396 100644 --- a/src/filter_sru_to_z3950.cpp +++ b/src/filter_sru_to_z3950.cpp @@ -1,5 +1,5 @@ /* This file is part of Metaproxy. - Copyright (C) 2005-2010 Index Data + Copyright (C) 2005-2011 Index Data Metaproxy is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free @@ -62,11 +62,11 @@ namespace metaproxy_1 { ActiveUrlMap m_active_urls; private: void sru(metaproxy_1::Package &package, Z_GDU *zgdu_req); - bool z3950_build_query( + int z3950_build_query( mp::odr &odr_en, Z_Query *z_query, const Z_SRW_searchRetrieveRequest *req ) const; - + bool z3950_init_request( mp::Package &package, mp::odr &odr_en, @@ -156,7 +156,7 @@ void yf::SRUtoZ3950::Impl::configure(const xmlNode *confignode) } // assigning explain node to database name - no check yet m_database_explain.insert(std::make_pair(database, explainnode)); - } + } } } @@ -407,7 +407,7 @@ yf::SRUtoZ3950::Impl::z3950_init_request(mp::Package &package, 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; + return true; yaz_add_srw_diagnostic(odr_en, &(sru_pdu_res->u.response->diagnostics), @@ -463,8 +463,8 @@ bool yf::SRUtoZ3950::Impl::z3950_search_request(mp::Package &package, if (!mp_util::set_databases_from_zurl(odr_en, zurl, - &z_searchRequest->num_databaseNames, - &z_searchRequest->databaseNames)) + &z_searchRequest->num_databaseNames, + &z_searchRequest->databaseNames)) { z_searchRequest->num_databaseNames = 1; z_searchRequest->databaseNames = (char**) @@ -475,19 +475,21 @@ bool yf::SRUtoZ3950::Impl::z3950_search_request(mp::Package &package, = odr_strdup(odr_en, const_cast(sr_req->database)); else z_searchRequest->databaseNames[0] - = odr_strdup(odr_en, "Default"); + = odr_strdup(odr_en, "Default"); } // z3950'fy query Z_Query *z_query = (Z_Query *) odr_malloc(odr_en, sizeof(Z_Query)); z_searchRequest->query = z_query; - if (!z3950_build_query(odr_en, z_query, sr_req)) + 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), - 7, "query"); + sru_diagnostic, + "query"); return false; } @@ -512,7 +514,7 @@ bool yf::SRUtoZ3950::Impl::z3950_search_request(mp::Package &package, yaz_add_srw_diagnostic(odr_en, &(sru_pdu_res->u.response->diagnostics), &(sru_pdu_res->u.response->num_diagnostics), - 2, 0); + YAZ_SRW_SYSTEM_TEMPORARILY_UNAVAILABLE, 0); return false; } @@ -741,8 +743,8 @@ yf::SRUtoZ3950::Impl::z3950_present_request( return true; } -bool yf::SRUtoZ3950::Impl::z3950_build_query(mp::odr &odr_en, Z_Query *z_query, - const Z_SRW_searchRetrieveRequest *req +int yf::SRUtoZ3950::Impl::z3950_build_query(mp::odr &odr_en, Z_Query *z_query, + const Z_SRW_searchRetrieveRequest *req ) const { if (req->query_type == Z_SRW_query_type_cql) @@ -758,7 +760,7 @@ bool yf::SRUtoZ3950::Impl::z3950_build_query(mp::odr &odr_en, Z_Query *z_query, z_query->which = Z_Query_type_104; z_query->u.type_104 = ext; - return true; + return 0; } if (req->query_type == Z_SRW_query_type_pqf) @@ -769,18 +771,18 @@ bool yf::SRUtoZ3950::Impl::z3950_build_query(mp::odr &odr_en, Z_Query *z_query, pqf_parser = yaz_pqf_create (); RPNquery = yaz_pqf_parse (pqf_parser, odr_en, req->query.pqf); + + yaz_pqf_destroy(pqf_parser); + if (!RPNquery) - { - std::cout << "TODO: Handeling of bad PQF\n"; - std::cout << "TODO: Diagnostic to be send\n"; - } + return YAZ_SRW_QUERY_SYNTAX_ERROR; + z_query->which = Z_Query_type_1; z_query->u.type_1 = RPNquery; - yaz_pqf_destroy(pqf_parser); - return true; + return 0; } - return false; + return YAZ_SRW_MANDATORY_PARAMETER_NOT_SUPPLIED; } @@ -805,8 +807,8 @@ yf::SRUtoZ3950::Impl::z3950_to_srw_diagnostics_ok(mp::odr &odr_en, int yf::SRUtoZ3950::Impl::z3950_to_srw_diag(mp::odr &odr_en, - Z_SRW_searchRetrieveResponse *sru_res, - Z_DefaultDiagFormat *ddf) const + Z_SRW_searchRetrieveResponse *sru_res, + Z_DefaultDiagFormat *ddf) const { int bib1_code = *ddf->condition; sru_res->num_diagnostics = 1;