+ m_p->m_maps[mp::util::database_name_normalize(db)]
+ = VirtualDB::Map(targets, route);
+}
+
+void yf::VirtualDB::process(mp::Package &package) const
+{
+ FrontendPtr f = m_p->get_frontend(package);
+
+ Z_GDU *gdu = package.request().get();
+
+ if (gdu && gdu->which == Z_GDU_Z3950 && gdu->u.z3950->which ==
+ Z_APDU_initRequest && !f->m_is_virtual)
+ {
+ Z_InitRequest *req = gdu->u.z3950->u.initRequest;
+
+ std::list<std::string> vhosts;
+ mp::util::get_vhost_otherinfo(req->otherInfo, vhosts);
+ if (vhosts.size() == 0)
+ {
+ f->m_init_gdu = gdu;
+
+ mp::odr odr;
+ Z_APDU *apdu = odr.create_initResponse(gdu->u.z3950, 0, 0);
+ Z_InitResponse *resp = apdu->u.initResponse;
+
+ int i;
+ static const int masks[] = {
+ Z_Options_search,
+ Z_Options_present,
+ Z_Options_namedResultSets,
+ Z_Options_scan,
+ -1
+ };
+ for (i = 0; masks[i] != -1; i++)
+ if (ODR_MASK_GET(req->options, masks[i]))
+ ODR_MASK_SET(resp->options, masks[i]);
+
+ static const int versions[] = {
+ Z_ProtocolVersion_1,
+ Z_ProtocolVersion_2,
+ Z_ProtocolVersion_3,
+ -1
+ };
+ for (i = 0; versions[i] != -1; i++)
+ if (ODR_MASK_GET(req->protocolVersion, versions[i]))
+ ODR_MASK_SET(resp->protocolVersion, versions[i]);
+ else
+ break;
+
+ package.response() = apdu;
+ f->m_is_virtual = true;
+ }
+ else
+ package.move();
+ }
+ else if (!f->m_is_virtual)