X-Git-Url: http://sru.miketaylor.org.uk/?a=blobdiff_plain;f=src%2Ffilter_virt_db.cpp;h=b30e7b4b975bd61d4b233b8cde78d9bfaacab8b7;hb=c1d953eee6c00432493bc364da6284704ccd9cc2;hp=aca263461567f9c06e5ae101204fd1723a3d7ac1;hpb=66ed48c630abf19ec779a29c5d2b67a9938685a5;p=metaproxy-moved-to-github.git diff --git a/src/filter_virt_db.cpp b/src/filter_virt_db.cpp index aca2634..b30e7b4 100644 --- a/src/filter_virt_db.cpp +++ b/src/filter_virt_db.cpp @@ -1,5 +1,5 @@ /* This file is part of Metaproxy. - Copyright (C) 2005-2009 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 @@ -18,20 +18,20 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA #include "config.hpp" -#include "filter.hpp" -#include "package.hpp" +#include "filter_virt_db.hpp" +#include #include #include #include -#include "util.hpp" -#include "filter_virt_db.hpp" +#include #include #include #include #include +#include #include #include @@ -228,39 +228,32 @@ yf::VirtualDB::BackendPtr yf::VirtualDB::Frontend::init_backend( Z_GDU *gdu = init_package.response().get(); // we hope to get an init response - if (gdu && gdu->which == Z_GDU_Z3950 && gdu->u.z3950->which == - Z_APDU_initResponse) + error_code = YAZ_BIB1_DATABASE_UNAVAILABLE; + if (gdu && gdu->which == Z_GDU_Z3950 + && gdu->u.z3950->which == Z_APDU_initResponse + && *gdu->u.z3950->u.initResponse->result) { Z_InitResponse *res = gdu->u.z3950->u.initResponse; if (ODR_MASK_GET(res->options, Z_Options_namedResultSets)) { b->m_named_result_sets = true; } - if (!*res->result) + if (*res->result && !init_package.session().is_closed()) { - error_code = YAZ_BIB1_DATABASE_UNAVAILABLE; - mp::util::get_init_diagnostics(res, error_code, addinfo); - BackendPtr null; - return null; + m_backend_list.push_back(b); + return b; } + mp::util::get_init_diagnostics(res, error_code, addinfo); } - else + if (!init_package.session().is_closed()) { - error_code = YAZ_BIB1_DATABASE_UNAVAILABLE; - // addinfo = database; - BackendPtr null; - return null; - } - if (init_package.session().is_closed()) - { - error_code = YAZ_BIB1_DATABASE_UNAVAILABLE; - // addinfo = database; - BackendPtr null; - return null; + Package close_package(b->m_backend_session, package.origin()); + close_package.copy_filter(package); + close_package.session().close(); + close_package.move(b->m_route); // closing it } - - m_backend_list.push_back(b); - return b; + BackendPtr null; + return null; } void yf::VirtualDB::Frontend::search(mp::Package &package, Z_APDU *apdu_req) @@ -275,7 +268,6 @@ void yf::VirtualDB::Frontend::search(mp::Package &package, Z_APDU *apdu_req) for (i = 0; inum_databaseNames; i++) databases.push_back(req->databaseNames[i]); - BackendPtr b; // null for now Sets_it sets_it = m_sets.find(req->resultSetName); if (sets_it != m_sets.end()) { @@ -294,37 +286,22 @@ void yf::VirtualDB::Frontend::search(mp::Package &package, Z_APDU *apdu_req) return; } sets_it->second.m_backend->m_number_of_sets--; - - // pick up any existing backend with a database match - std::list::const_iterator map_it; - map_it = m_backend_list.begin(); - for (; map_it != m_backend_list.end(); map_it++) - { - BackendPtr tmp = *map_it; - if (tmp->m_frontend_databases == databases) - break; - } - if (map_it != m_backend_list.end()) - b = *map_it; } - else + // pick up any existing database with named result sets .. + // or one which has no result sets.. yet. + BackendPtr b; // null for now + std::list::const_iterator map_it; + map_it = m_backend_list.begin(); + for (; map_it != m_backend_list.end(); map_it++) { - // new result set. - - // pick up any existing database with named result sets .. - // or one which has no result sets.. yet. - std::list::const_iterator map_it; - map_it = m_backend_list.begin(); - for (; map_it != m_backend_list.end(); map_it++) + BackendPtr tmp = *map_it; + if (tmp->m_frontend_databases == databases && + (tmp->m_named_result_sets || + tmp->m_number_of_sets == 0)) { - BackendPtr tmp = *map_it; - if (tmp->m_frontend_databases == databases && - (tmp->m_named_result_sets || - tmp->m_number_of_sets == 0)) - break; - } - if (map_it != m_backend_list.end()) b = *map_it; + break; + } } if (!b) // no backend yet. Must create a new one {