X-Git-Url: http://lists.indexdata.com/cgi-bin?a=blobdiff_plain;f=src%2Ffilter_virt_db.cpp;h=3dc1337552de15731ce9ba5bbea8ac1ed0faeb9e;hb=7c5a169c1bcccae466bf78af1fae376d81812c43;hp=2ea70c417021ef076d7be7e71d41778571344fe8;hpb=7a90dfec2c8b5af3c39bbb7fafdf2294671b93d4;p=metaproxy-moved-to-github.git diff --git a/src/filter_virt_db.cpp b/src/filter_virt_db.cpp index 2ea70c4..3dc1337 100644 --- a/src/filter_virt_db.cpp +++ b/src/filter_virt_db.cpp @@ -1,4 +1,4 @@ -/* $Id: filter_virt_db.cpp,v 1.10 2005-10-29 15:54:29 adam Exp $ +/* $Id: filter_virt_db.cpp,v 1.15 2005-12-19 08:42:59 adam Exp $ Copyright (c) 2005, Index Data. %LICENSE% @@ -12,14 +12,13 @@ #include +#include "util.hpp" #include "filter_virt_db.hpp" #include -#include #include #include -#include #include #include @@ -68,6 +67,8 @@ namespace yp2 { } } +using namespace yp2; + yf::Virt_db_set::Virt_db_set(yp2::Session &id, std::string setname, std::string vhost, bool named_result_sets) : m_backend_session(id), m_backend_setname(setname), m_vhost(vhost), @@ -118,6 +119,20 @@ void yf::Virt_db::Rep::release_session(Package &package) { boost::mutex::scoped_lock lock(m_sessions_mutex); + Ses_it it = m_sessions.find(package.session()); + + if (it != m_sessions.end()) + { + Sets_it sit = it->second.m_sets.begin(); + for (; sit != it->second.m_sets.end(); sit++) + { + sit->second.m_backend_session.close(); + Package close_package(sit->second.m_backend_session, package.origin()); + close_package.copy_filter(package); + + close_package.move(); + } + } m_sessions.erase(package.session()); } @@ -125,24 +140,17 @@ void yf::Virt_db::Rep::present(Package &package, Z_APDU *apdu, bool &move_later) Session *id = 0; Z_PresentRequest *req = apdu->u.presentRequest; std::string resultSetId = req->resultSetId; + yp2::odr odr; { boost::mutex::scoped_lock lock(m_sessions_mutex); Ses_it it = m_sessions.find(package.session()); if (it == m_sessions.end()) { - ODR odr = odr_createmem(ODR_ENCODE); - - Z_APDU *apdu = zget_APDU(odr, Z_APDU_close); - - *apdu->u.close->closeReason = Z_Close_protocolError; - apdu->u.close->diagnosticInformation = - odr_strdup(odr, "no session for present request"); - - package.response() = apdu; + package.response() = odr.create_close( + Z_Close_protocolError, + "no session for present request"); package.session().close(); - odr_destroy(odr); - assert(false); return; } if (it->second.m_use_vhost) @@ -153,7 +161,6 @@ void yf::Virt_db::Rep::present(Package &package, Z_APDU *apdu, bool &move_later) Sets_it sets_it = it->second.m_sets.find(resultSetId); if (sets_it == it->second.m_sets.end()) { - ODR odr = odr_createmem(ODR_ENCODE); Z_APDU *apdu = zget_APDU(odr, Z_APDU_presentResponse); Z_Records *rec = (Z_Records *) odr_malloc(odr, sizeof(Z_Records)); @@ -165,12 +172,11 @@ void yf::Virt_db::Rep::present(Package &package, Z_APDU *apdu, bool &move_later) YAZ_BIB1_SPECIFIED_RESULT_SET_DOES_NOT_EXIST, resultSetId.c_str()); package.response() = apdu; - odr_destroy(odr); + return; } id = new yp2::Session(sets_it->second.m_backend_session); } - ODR odr = odr_createmem(ODR_ENCODE); // sending present to backend Package present_package(*id, package.origin()); @@ -179,13 +185,10 @@ void yf::Virt_db::Rep::present(Package &package, Z_APDU *apdu, bool &move_later) req->resultSetId = odr_strdup(odr, "default"); present_package.request() = yazpp_1::GDU(apdu); - odr_destroy(odr); - present_package.move(); if (present_package.session().is_closed()) { - ODR odr = odr_createmem(ODR_ENCODE); Z_APDU *apdu = zget_APDU(odr, Z_APDU_presentResponse); Z_Records *rec = (Z_Records *) odr_malloc(odr, sizeof(Z_Records)); @@ -198,8 +201,6 @@ void yf::Virt_db::Rep::present(Package &package, Z_APDU *apdu, bool &move_later) resultSetId.c_str()); package.response() = apdu; - odr_destroy(odr); - boost::mutex::scoped_lock lock(m_sessions_mutex); Ses_it it = m_sessions.find(package.session()); if (it != m_sessions.end()) @@ -219,23 +220,18 @@ void yf::Virt_db::Rep::search(Package &package, Z_APDU *apdu, bool &move_later) std::string database; std::string resultSetId = req->resultSetName; bool support_named_result_sets = false; // whether backend supports it + yp2::odr odr; { boost::mutex::scoped_lock lock(m_sessions_mutex); Ses_it it = m_sessions.find(package.session()); if (it == m_sessions.end()) { - ODR odr = odr_createmem(ODR_ENCODE); - - Z_APDU *apdu = zget_APDU(odr, Z_APDU_close); - - *apdu->u.close->closeReason = Z_Close_protocolError; - apdu->u.close->diagnosticInformation = - odr_strdup(odr, "no session for search request"); - - package.response() = apdu; + package.response() = odr.create_close( + Z_Close_protocolError, + "no session for search request"); package.session().close(); - odr_destroy(odr); + return; } if (it->second.m_use_vhost) @@ -245,7 +241,6 @@ void yf::Virt_db::Rep::search(Package &package, Z_APDU *apdu, bool &move_later) } if (req->num_databaseNames != 1) { // exactly one database must be specified - ODR odr = odr_createmem(ODR_ENCODE); Z_APDU *apdu = zget_APDU(odr, Z_APDU_searchResponse); Z_Records *rec = (Z_Records *) odr_malloc(odr, sizeof(Z_Records)); @@ -256,7 +251,6 @@ void yf::Virt_db::Rep::search(Package &package, Z_APDU *apdu, bool &move_later) odr, YAZ_BIB1_TOO_MANY_DATABASES_SPECIFIED, 0); package.response() = apdu; - odr_destroy(odr); return; } database = req->databaseNames[0]; @@ -264,7 +258,6 @@ void yf::Virt_db::Rep::search(Package &package, Z_APDU *apdu, bool &move_later) map_it = m_maps.find(database); if (map_it == m_maps.end()) { // no map for database: return diagnostic - ODR odr = odr_createmem(ODR_ENCODE); Z_APDU *apdu = zget_APDU(odr, Z_APDU_searchResponse); Z_Records *rec = (Z_Records *) odr_malloc(odr, sizeof(Z_Records)); @@ -275,7 +268,6 @@ void yf::Virt_db::Rep::search(Package &package, Z_APDU *apdu, bool &move_later) odr, YAZ_BIB1_DATABASE_DOES_NOT_EXIST, database.c_str()); package.response() = apdu; - odr_destroy(odr); return; } if (*req->replaceIndicator == 0) @@ -283,7 +275,6 @@ void yf::Virt_db::Rep::search(Package &package, Z_APDU *apdu, bool &move_later) Sets_it sets_it = it->second.m_sets.find(req->resultSetName); if (sets_it != it->second.m_sets.end()) { - ODR odr = odr_createmem(ODR_ENCODE); Z_APDU *apdu = zget_APDU(odr, Z_APDU_searchResponse); Z_Records *rec = (Z_Records *) odr_malloc(odr, sizeof(Z_Records)); @@ -296,7 +287,6 @@ void yf::Virt_db::Rep::search(Package &package, Z_APDU *apdu, bool &move_later) 0); package.response() = apdu; - odr_destroy(odr); return; } } @@ -311,20 +301,17 @@ void yf::Virt_db::Rep::search(Package &package, Z_APDU *apdu, bool &move_later) Package init_package(id, package.origin()); init_package.copy_filter(package); - ODR odr = odr_createmem(ODR_ENCODE); Z_APDU *init_apdu = zget_APDU(odr, Z_APDU_initRequest); yaz_oi_set_string_oidval(&init_apdu->u.initRequest->otherInfo, odr, VAL_PROXY, 1, vhost_cstr); init_package.request() = init_apdu; - odr_destroy(odr); init_package.move(); // sending init if (init_package.session().is_closed()) { - ODR odr = odr_createmem(ODR_ENCODE); Z_APDU *apdu = zget_APDU(odr, Z_APDU_searchResponse); Z_Records *rec = (Z_Records *) odr_malloc(odr, sizeof(Z_Records)); @@ -334,8 +321,6 @@ void yf::Virt_db::Rep::search(Package &package, Z_APDU *apdu, bool &move_later) zget_DefaultDiagFormat( odr, YAZ_BIB1_DATABASE_UNAVAILABLE, database.c_str()); package.response() = apdu; - - odr_destroy(odr); } Z_GDU *gdu = init_package.response().get(); // we hope to get an init response @@ -348,7 +333,6 @@ void yf::Virt_db::Rep::search(Package &package, Z_APDU *apdu, bool &move_later) } else { - ODR odr = odr_createmem(ODR_ENCODE); Z_APDU *apdu = zget_APDU(odr, Z_APDU_searchResponse); Z_Records *rec = (Z_Records *) odr_malloc(odr, sizeof(Z_Records)); @@ -359,7 +343,6 @@ void yf::Virt_db::Rep::search(Package &package, Z_APDU *apdu, bool &move_later) odr, YAZ_BIB1_DATABASE_UNAVAILABLE, database.c_str()); package.response() = apdu; - odr_destroy(odr); return; } } @@ -368,7 +351,6 @@ void yf::Virt_db::Rep::search(Package &package, Z_APDU *apdu, bool &move_later) search_package.copy_filter(package); const char *sep = strchr(vhost_cstr, '/'); - ODR odr = odr_createmem(ODR_ENCODE); if (sep) req->databaseNames[0] = odr_strdup(odr, sep+1); @@ -378,13 +360,10 @@ void yf::Virt_db::Rep::search(Package &package, Z_APDU *apdu, bool &move_later) req->resultSetName = odr_strdup(odr, backend_resultSetId.c_str()); search_package.request() = yazpp_1::GDU(apdu); - odr_destroy(odr); - search_package.move(); if (search_package.session().is_closed()) { - ODR odr = odr_createmem(ODR_ENCODE); Z_APDU *apdu = zget_APDU(odr, Z_APDU_searchResponse); Z_Records *rec = (Z_Records *) odr_malloc(odr, sizeof(Z_Records)); @@ -395,7 +374,6 @@ void yf::Virt_db::Rep::search(Package &package, Z_APDU *apdu, bool &move_later) odr, YAZ_BIB1_DATABASE_UNAVAILABLE, database.c_str()); package.response() = apdu; - odr_destroy(odr); return; } package.response() = search_package.response(); @@ -419,8 +397,7 @@ void yf::Virt_db::Rep::init(Package &package, Z_APDU *apdu, bool &move_later) yaz_oi_get_string_oidval(&req->otherInfo, VAL_PROXY, 1, 0); if (!vhost) { - ODR odr = odr_createmem(ODR_ENCODE); - + yp2::odr odr; Z_APDU *apdu = zget_APDU(odr, Z_APDU_initResponse); Z_InitResponse *resp = apdu->u.initResponse; @@ -446,8 +423,6 @@ void yf::Virt_db::Rep::init(Package &package, Z_APDU *apdu, bool &move_later) package.response() = apdu; - odr_destroy(odr); - m_sessions[package.session()] = Virt_db_session(package.session(), false); } else @@ -465,8 +440,10 @@ void yf::Virt_db::add_map_db2vhost(std::string db, std::string vhost) void yf::Virt_db::process(Package &package) const { Z_GDU *gdu = package.request().get(); - - if (!gdu || gdu->which != Z_GDU_Z3950) + + if (package.session().is_closed()) + m_p->release_session(package); + else if (!gdu || gdu->which != Z_GDU_Z3950) package.move(); else { @@ -484,26 +461,25 @@ void yf::Virt_db::process(Package &package) const { m_p->present(package, apdu, move_later); } + else if (apdu->which == Z_APDU_close) + { + package.session().close(); + m_p->release_session(package); + } else { - ODR odr = odr_createmem(ODR_ENCODE); + yp2::odr odr; - Z_APDU *apdu = zget_APDU(odr, Z_APDU_close); - - *apdu->u.close->closeReason = Z_Close_protocolError; - - apdu->u.close->diagnosticInformation = - odr_strdup(odr, "unsupported APDU in filter_virt_db"); - - package.response() = apdu; + package.response() = odr.create_close( + Z_Close_protocolError, + "unsupported APDU in filter_virt_db"); + package.session().close(); - odr_destroy(odr); + m_p->release_session(package); } if (move_later) package.move(); } - if (package.session().is_closed()) - m_p->release_session(package); }