X-Git-Url: http://sru.miketaylor.org.uk/?a=blobdiff_plain;f=src%2Ffilter_virt_db.cpp;h=56ba9465f0772baabec8231dc2674bed2001d17a;hb=e6d572ef110d14fa55115021505b808620457bd3;hp=903d2993550bcf5f2ebd07cc4ac272aed03edd4e;hpb=0ca83fd98df8c2c62e755d087e95bb013970883e;p=metaproxy-moved-to-github.git diff --git a/src/filter_virt_db.cpp b/src/filter_virt_db.cpp index 903d299..56ba946 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-2008 Index Data + Copyright (C) 2005-2010 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,19 +18,19 @@ 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 @@ -50,8 +50,10 @@ namespace metaproxy_1 { std::string m_setname; }; struct VirtualDB::Map { - Map(std::list targets, std::string route); + Map(std::string database, std::list targets, std::string route); Map(); + bool match(const std::string db) const; + std::string m_dbpattern; std::list m_targets; std::string m_route; }; @@ -105,11 +107,12 @@ namespace metaproxy_1 { FrontendPtr get_frontend(Package &package); void release_frontend(Package &package); private: - std::mapm_maps; + std::listm_maps; typedef std::map::iterator Sets_it; boost::mutex m_mutex; boost::condition m_cond_session_ready; std::map m_clients; + bool pass_vhosts; }; } } @@ -141,8 +144,15 @@ yf::VirtualDB::BackendPtr yf::VirtualDB::Frontend::create_backend_from_databases std::map targets_dedup; for (; db_it != databases.end(); db_it++) { - std::map::iterator map_it; - map_it = m_p->m_maps.find(mp::util::database_name_normalize(*db_it)); + std::list::const_iterator map_it; + map_it = m_p->m_maps.begin(); + while (map_it != m_p->m_maps.end()) + { + if (map_it->match(*db_it)) + break; + map_it++; + } + if (map_it == m_p->m_maps.end()) // database not found { error_code = YAZ_BIB1_DATABASE_DOES_NOT_EXIST; @@ -151,8 +161,8 @@ yf::VirtualDB::BackendPtr yf::VirtualDB::Frontend::create_backend_from_databases return ptr; } std::list::const_iterator t_it = - map_it->second.m_targets.begin(); - for (; t_it != map_it->second.m_targets.end(); t_it++) { + map_it->m_targets.begin(); + for (; t_it != map_it->m_targets.end(); t_it++) { if (!targets_dedup[*t_it]) { targets_dedup[*t_it] = true; @@ -161,14 +171,14 @@ yf::VirtualDB::BackendPtr yf::VirtualDB::Frontend::create_backend_from_databases } // see if we have a route conflict. - if (!first_route && b->m_route != map_it->second.m_route) + if (!first_route && b->m_route != map_it->m_route) { // we have a conflict.. error_code = YAZ_BIB1_COMBI_OF_SPECIFIED_DATABASES_UNSUPP; BackendPtr ptr; return ptr; } - b->m_route = map_it->second.m_route; + b->m_route = map_it->m_route; first_route = false; } return b; @@ -225,31 +235,24 @@ yf::VirtualDB::BackendPtr yf::VirtualDB::Frontend::init_backend( { b->m_named_result_sets = true; } - if (!*res->result) + if (*res->result) { - 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; + } - } - else - { error_code = YAZ_BIB1_DATABASE_UNAVAILABLE; - // addinfo = database; - BackendPtr null; - return null; - } - if (init_package.session().is_closed()) + mp::util::get_init_diagnostics(res, error_code, addinfo); + } + 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) @@ -461,8 +464,9 @@ yf::VirtualDB::Set::~Set() { } -yf::VirtualDB::Map::Map(std::list targets, std::string route) - : m_targets(targets), m_route(route) +yf::VirtualDB::Map::Map(std::string database, + std::list targets, std::string route) + : m_dbpattern(database), m_targets(targets), m_route(route) { } @@ -470,8 +474,17 @@ yf::VirtualDB::Map::Map() { } +bool yf::VirtualDB::Map::match(const std::string db) const +{ + std::string norm_db = mp::util::database_name_normalize(db); + if (yaz_match_glob(m_dbpattern.c_str(), norm_db.c_str())) + return true; + return false; +} + yf::VirtualDB::VirtualDB() : m_p(new VirtualDB::Rep) { + m_p->pass_vhosts = false; } yf::VirtualDB::~VirtualDB() { @@ -490,21 +503,26 @@ void yf::VirtualDB::Frontend::fixup_npr_record(ODR odr, Z_NamePlusRecord *npr, db_it != b->m_frontend_databases.end(); db_it++) { // see which target it corresponds to.. (if any) - std::map::const_iterator map_it; - - map_it = m_p->m_maps.find(mp::util::database_name_normalize(*db_it)); + std::list::const_iterator map_it = + m_p->m_maps.begin(); + while (map_it != m_p->m_maps.end()) + { + if (map_it->match(*db_it)) + break; + map_it++; + } if (map_it != m_p->m_maps.end()) { - VirtualDB::Map m = map_it->second; - - std::list::const_iterator t; - for (t = m.m_targets.begin(); t != m.m_targets.end(); t++) + std::list::const_iterator t + = map_it->m_targets.begin(); + while (t != map_it->m_targets.end()) { if (*t == b_database) { npr->databaseName = odr_strdup(odr, (*db_it).c_str()); return; } + t++; } } @@ -668,8 +686,8 @@ void yf::VirtualDB::add_map_db2targets(std::string db, std::list targets, std::string route) { - m_p->m_maps[mp::util::database_name_normalize(db)] - = VirtualDB::Map(targets, route); + m_p->m_maps.push_back( + VirtualDB::Map(mp::util::database_name_normalize(db), targets, route)); } @@ -680,8 +698,7 @@ void yf::VirtualDB::add_map_db2target(std::string db, std::list targets; targets.push_back(target); - m_p->m_maps[mp::util::database_name_normalize(db)] - = VirtualDB::Map(targets, route); + add_map_db2targets(db, targets, route); } void yf::VirtualDB::process(mp::Package &package) const @@ -697,7 +714,12 @@ void yf::VirtualDB::process(mp::Package &package) const std::list vhosts; mp::util::get_vhost_otherinfo(req->otherInfo, vhosts); - if (vhosts.size() == 0) + + if (vhosts.size() > 0 && m_p->pass_vhosts) + { + package.move(); + } + else { f->m_init_gdu = gdu; @@ -732,8 +754,6 @@ void yf::VirtualDB::process(mp::Package &package) const package.response() = apdu; f->m_is_virtual = true; } - else - package.move(); } else if (!f->m_is_virtual) package.move(); @@ -788,7 +808,11 @@ void mp::filter::VirtualDB::configure(const xmlNode * ptr, bool test_only) { if (ptr->type != XML_ELEMENT_NODE) continue; - if (!strcmp((const char *) ptr->name, "virtual")) + if (!strcmp((const char *) ptr->name, "pass-vhosts")) + { + m_p->pass_vhosts = mp::xml::get_bool(ptr->children, false); + } + else if (!strcmp((const char *) ptr->name, "virtual")) { std::string database; std::list targets; @@ -839,8 +863,9 @@ extern "C" { /* * Local variables: * c-basic-offset: 4 + * c-file-style: "Stroustrup" * indent-tabs-mode: nil - * c-file-style: "stroustrup" * End: * vim: shiftwidth=4 tabstop=8 expandtab */ +