X-Git-Url: http://jsfdemo.indexdata.com/?a=blobdiff_plain;f=src%2Ffilter_z3950_client.cpp;h=d0d04427595889803b216b9322c8c04b344f0451;hb=fcce42024d4c6fa3ddaefc1a140ee22016db8ab7;hp=b93ecb2b1315286e27403be8e580bf379b8a9be9;hpb=0a41bd174bb83e032e5a0845e286bf1396b17f84;p=metaproxy-moved-to-github.git diff --git a/src/filter_z3950_client.cpp b/src/filter_z3950_client.cpp index b93ecb2..d0d0442 100644 --- a/src/filter_z3950_client.cpp +++ b/src/filter_z3950_client.cpp @@ -1,8 +1,20 @@ -/* $Id: filter_z3950_client.cpp,v 1.30 2007-01-26 14:49:22 adam Exp $ - Copyright (c) 2005-2007, Index Data. +/* This file is part of Metaproxy. + Copyright (C) 2005-2008 Index Data - See the LICENSE file for details - */ +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 +Software Foundation; either version 2, or (at your option) any later +version. + +Metaproxy is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ #include "config.hpp" @@ -18,6 +30,7 @@ #include #include +#include #include #include @@ -64,6 +77,7 @@ namespace metaproxy_1 { public: // number of seconds to wait before we give up request int m_timeout_sec; + int m_max_sockets; std::string m_default_target; std::string m_force_target; boost::mutex m_mutex; @@ -169,6 +183,7 @@ yazpp_1::IPDU_Observer *yf::Z3950Client::Assoc::sessionNotify( yf::Z3950Client::Z3950Client() : m_p(new yf::Z3950Client::Rep) { m_p->m_timeout_sec = 30; + m_p->m_max_sockets = 0; } yf::Z3950Client::~Z3950Client() { @@ -267,6 +282,7 @@ yf::Z3950Client::Assoc *yf::Z3950Client::Rep::get_assoc(Package &package) return 0; } } + std::list dblist; std::string host; mp::util::split_zurl(target, host, dblist); @@ -276,6 +292,33 @@ yf::Z3950Client::Assoc *yf::Z3950Client::Rep::get_assoc(Package &package) ; // z3950_client: Databases in vhost ignored } + while (m_max_sockets) + { + int number = 0; + it = m_clients.begin(); + for (; it != m_clients.end(); it++) + { + yf::Z3950Client::Assoc *as = it->second; + if (!strcmp(as->get_hostname(), host.c_str())) + number++; + } + if (number < m_max_sockets) + break; + boost::xtime xt; + xtime_get(&xt, boost::TIME_UTC); + + xt.sec += 15; + if (!m_cond_session_ready.timed_wait(lock, xt)) + { + mp::odr odr; + + package.response() = odr.create_initResponse( + apdu, YAZ_BIB1_TEMPORARY_SYSTEM_ERROR, "max sessions"); + package.session().close(); + return 0; + } + } + yazpp_1::SocketManager *sm = new yazpp_1::SocketManager; yazpp_1::PDU_Assoc *pdu_as = new yazpp_1::PDU_Assoc(sm); yf::Z3950Client::Assoc *as = new yf::Z3950Client::Assoc(sm, pdu_as, @@ -358,7 +401,7 @@ void yf::Z3950Client::Rep::release_assoc(Package &package) // wait until no one is waiting for it. while (it->second->m_queue_len) m_cond_session_ready.wait(lock); - + // the Z_Assoc and PDU_Assoc must be destroyed before // the socket manager.. so pull that out.. first.. yazpp_1::SocketManager *s = it->second->m_socket_manager; @@ -380,7 +423,7 @@ void yf::Z3950Client::process(Package &package) const m_p->release_assoc(package); } -void yf::Z3950Client::configure(const xmlNode *ptr) +void yf::Z3950Client::configure(const xmlNode *ptr, bool test_only) { for (ptr = ptr->children; ptr; ptr = ptr->next) { @@ -398,6 +441,10 @@ void yf::Z3950Client::configure(const xmlNode *ptr) { m_p->m_force_target = mp::xml::get_text(ptr); } + else if (!strcmp((const char *) ptr->name, "max-sockets")) + { + m_p->m_max_sockets = mp::xml::get_int(ptr->children, 0); + } else { throw mp::filter::FilterException("Bad element "