-/* $Id: filter_virt_db.cpp,v 1.11 2005-10-30 17:13:36 adam Exp $
+/* $Id: filter_virt_db.cpp,v 1.15 2005-12-19 08:42:59 adam Exp $
Copyright (c) 2005, Index Data.
%LICENSE%
#include "filter_virt_db.hpp"
#include <yaz/zgdu.h>
-#include <yaz/log.h>
#include <yaz/otherinfo.h>
#include <yaz/diagbib1.h>
-#include <list>
#include <map>
#include <iostream>
}
}
+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),
{
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());
}
Ses_it it = m_sessions.find(package.session());
if (it == m_sessions.end())
{
- 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();
-
return;
}
if (it->second.m_use_vhost)
Ses_it it = m_sessions.find(package.session());
if (it == m_sessions.end())
{
- 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();
return;
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
{
{
m_p->present(package, apdu, move_later);
}
+ else if (apdu->which == Z_APDU_close)
+ {
+ package.session().close();
+ m_p->release_session(package);
+ }
else
{
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();
+ m_p->release_session(package);
}
if (move_later)
package.move();
}
- if (package.session().is_closed())
- m_p->release_session(package);
}