-/* $Id: filter_virt_db.cpp,v 1.6 2005-10-25 21:32:01 adam Exp $
+/* $Id: filter_virt_db.cpp,v 1.7 2005-10-25 22:44:39 adam Exp $
Copyright (c) 2005, Index Data.
%LICENSE%
Virt_db_set();
~Virt_db_set();
- yp2::Session m_session;
+ yp2::Session m_backend_session;
std::string m_setname;
std::string m_vhost;
};
yf::Virt_db_set::Virt_db_set(yp2::Session &id, std::string setname,
std::string vhost)
- : m_session(id), m_setname(setname), m_vhost(vhost)
+ : m_backend_session(id), m_setname(setname), m_vhost(vhost)
{
}
void yf::Virt_db::Rep::present(Package &package, Z_APDU *apdu, bool &move_later){
Session *id = 0;
+ std::string resultSetId;
Z_PresentRequest *req = apdu->u.presentRequest;
{
+ resultSetId = req->resultSetId;
boost::mutex::scoped_lock lock(m_sessions_mutex);
Ses_it it = m_sessions.find(package.session());
move_later = true;
return;
}
- Sets_it sets_it = it->second.m_sets.find(req->resultSetId);
+ Sets_it sets_it = it->second.m_sets.find(resultSetId);
if (sets_it == it->second.m_sets.end())
{
ODR odr = odr_createmem(ODR_ENCODE);
zget_DefaultDiagFormat(
odr,
YAZ_BIB1_SPECIFIED_RESULT_SET_DOES_NOT_EXIST,
- req->resultSetId);
+ resultSetId.c_str());
package.response() = apdu;
odr_destroy(odr);
return;
}
- id = new yp2::Session(sets_it->second.m_session);
+ id = new yp2::Session(sets_it->second.m_backend_session);
}
ODR odr = odr_createmem(ODR_ENCODE);
req->resultSetId = odr_strdup(odr, "default");
present_package.request() = yazpp_1::GDU(apdu);
-
+
odr_destroy(odr);
-
+
present_package.move();
- package.response() = present_package.response();
- // must check for a closed present session..
+ 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));
+ apdu->u.presentResponse->records = rec;
+ rec->which = Z_Records_NSD;
+ rec->u.nonSurrogateDiagnostic =
+ zget_DefaultDiagFormat(
+ odr,
+ YAZ_BIB1_RESULT_SET_NO_LONGER_EXISTS_UNILATERALLY_DELETED_BY_,
+ 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())
+ it->second.m_sets.erase(resultSetId);
+ }
+ else
+ {
+ package.response() = present_package.response();
+ }
delete id;
}
Z_SearchRequest *req = apdu->u.searchRequest;
std::string vhost;
std::string database;
- Session *id = 0;
{
boost::mutex::scoped_lock lock(m_sessions_mutex);
return;
}
}
+ it->second.m_sets.erase(req->resultSetName);
vhost = map_it->second.m_vhost;
- id = new Session;
-
- it->second.m_sets[req->resultSetName] =
- Virt_db_set(*id, req->resultSetName, vhost);
}
+ // we might look for an existing session with same vhost
+ Session id;
const char *vhost_cstr = vhost.c_str();
if (true)
{ // sending init to backend
- Package init_package(*id, package.origin());
+ Package init_package(id, package.origin());
init_package.copy_filter(package);
ODR odr = odr_createmem(ODR_ENCODE);
package.response() = apdu;
odr_destroy(odr);
- return;
}
}
// sending search to backend
- Package search_package(*id, package.origin());
+ Package search_package(id, package.origin());
search_package.copy_filter(package);
const char *sep = strchr(vhost_cstr, '/');
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));
+ apdu->u.searchResponse->records = rec;
+ rec->which = Z_Records_NSD;
+ rec->u.nonSurrogateDiagnostic =
+ zget_DefaultDiagFormat(
+ odr, YAZ_BIB1_DATABASE_UNAVAILABLE, database.c_str());
+ package.response() = apdu;
+
+ odr_destroy(odr);
+ return;
+ }
package.response() = search_package.response();
- // must check for a closed search session..
- delete id;
+
+ boost::mutex::scoped_lock lock(m_sessions_mutex);
+ Ses_it it = m_sessions.find(package.session());
+ if (it != m_sessions.end())
+ it->second.m_sets[req->resultSetName] =
+ Virt_db_set(id, req->resultSetName, vhost);
}
void yf::Virt_db::Rep::init(Package &package, Z_APDU *apdu, bool &move_later)