1 /* $Id: filter_virt_db.cpp,v 1.1 2005-10-24 14:33:30 adam Exp $
2 Copyright (c) 2005, Index Data.
11 #include "package.hpp"
13 #include <boost/thread/mutex.hpp>
15 #include "filter_virt_db.hpp"
19 #include <yaz/otherinfo.h>
20 #include <yaz/diagbib1.h>
25 namespace yf = yp2::filter;
29 struct Virt_db_session {
30 Virt_db_session(yp2::Session &id, bool use_vhost);
31 yp2::Session m_session;
35 Virt_db_map(std::string database, std::string vhost);
36 std::string m_database;
42 void release_session(Package &package);
43 void init(Package &package, Z_APDU *apdu);
44 void search(Package &package, Z_APDU *apdu);
46 std::list<Virt_db_session>m_sessions;
47 std::list<Virt_db_map>m_maps;
52 yf::Virt_db_map::Virt_db_map(std::string database, std::string vhost)
53 : m_database(database), m_vhost(vhost)
57 yf::Virt_db_session::Virt_db_session(yp2::Session &id,
59 m_session(id) , m_use_vhost(use_vhost)
64 yf::Virt_db::Virt_db() {
65 m_p = new Virt_db::Rep;
68 yf::Virt_db::~Virt_db() {
72 void yf::Virt_db::Rep::release_session(Package &package)
77 void yf::Virt_db::Rep::search(Package &package, Z_APDU *apdu)
79 Z_SearchRequest *req = apdu->u.searchRequest;
81 std::list<Virt_db_session>::iterator it;
82 for (it = m_sessions.begin(); it != m_sessions.end(); it++)
84 if (package.session() == (*it).m_session)
87 if (it == m_sessions.end())
89 if ((*it).m_use_vhost)
93 if (req->num_databaseNames != 1)
95 ODR odr = odr_createmem(ODR_ENCODE);
96 Z_APDU *apdu = zget_APDU(odr, Z_APDU_searchResponse);
98 Z_Records *rec = (Z_Records *) odr_malloc(odr, sizeof(Z_Records));
99 apdu->u.searchResponse->records = rec;
100 rec->which = Z_Records_NSD;
101 rec->u.nonSurrogateDiagnostic =
102 zget_DefaultDiagFormat(
103 odr, YAZ_BIB1_TOO_MANY_DATABASES_SPECIFIED, 0);
104 package.response() = apdu;
108 const char *database = req->databaseNames[0];
112 void yf::Virt_db::Rep::init(Package &package, Z_APDU *apdu)
114 std::list<Virt_db_session>::iterator it;
116 for (it = m_sessions.begin(); it != m_sessions.end(); it++)
118 if (package.session() == (*it).m_session)
121 if (it != m_sessions.end())
122 m_sessions.erase(it);
124 Z_InitRequest *req = apdu->u.initRequest;
127 yaz_oi_get_string_oidval(&req->otherInfo, VAL_PROXY, 1, 0);
130 ODR odr = odr_createmem(ODR_ENCODE);
132 Z_APDU *apdu = zget_APDU(odr, Z_APDU_initResponse);
133 Z_InitResponse *resp = apdu->u.initResponse;
136 static const int masks[] = {
137 Z_Options_search, Z_Options_present, 0
139 for (i = 0; masks[i]; i++)
140 if (ODR_MASK_GET(req->options, masks[i]))
141 ODR_MASK_SET(resp->options, masks[i]);
143 package.response() = apdu;
147 m_sessions.push_back(Virt_db_session(package.session(), false));
151 m_sessions.push_back(Virt_db_session(package.session(), true));
156 void yf::Virt_db::add_map_db2vhost(std::string db, std::string vhost)
158 m_p->m_maps.push_back(Virt_db_map(db, vhost));
161 void yf::Virt_db::process(Package &package) const
163 Z_GDU *gdu = package.request().get();
165 if (!gdu || gdu->which != Z_GDU_Z3950)
169 Z_APDU *apdu = gdu->u.z3950;
170 if (apdu->which == Z_APDU_initRequest)
172 m_p->init(package, apdu);
174 else if (apdu->which == Z_APDU_searchRequest)
176 m_p->search(package, apdu);
180 ODR odr = odr_createmem(ODR_ENCODE);
182 Z_APDU *apdu = zget_APDU(odr, Z_APDU_close);
184 *apdu->u.close->closeReason = Z_Close_protocolError;
186 package.response() = apdu;
187 package.session().close();
191 m_p->release_session(package);
198 * indent-tabs-mode: nil
199 * c-file-style: "stroustrup"
201 * vim: shiftwidth=4 tabstop=8 expandtab