+ Z_ScanRequest *req = apdu_req->u.scanRequest;
+ std::string vhost;
+ yp2::odr odr;
+
+ std::list<std::string> databases;
+ int i;
+ for (i = 0; i<req->num_databaseNames; i++)
+ databases.push_back(req->databaseNames[i]);
+
+ BackendPtr b;
+ // pick up any existing backend with a database match
+ std::list<BackendPtr>::const_iterator map_it;
+ map_it = m_backend_list.begin();
+ for (; map_it != m_backend_list.end(); map_it++)
+ {
+ BackendPtr tmp = *map_it;
+ if (tmp->m_frontend_databases == databases)
+ break;
+ }
+ if (map_it != m_backend_list.end())
+ b = *map_it;
+ if (!b) // no backend yet. Must create a new one
+ {
+ int error_code;
+ std::string addinfo;
+ b = init_backend(databases, package, error_code, addinfo);
+ if (!b)
+ {
+ // did not get a backend (unavailable somehow?)
+ Z_APDU *apdu =
+ odr.create_scanResponse(
+ apdu_req, error_code, addinfo.c_str());
+ package.response() = apdu;
+
+ return;
+ }
+ }
+ // sending scan to backend
+ Package scan_package(b->m_backend_session, package.origin());
+
+ scan_package.copy_filter(package);
+
+ // pick first targets spec and move the databases from it ..
+ std::list<std::string>::const_iterator t_it = b->m_targets.begin();
+ if (t_it != b->m_targets.end())
+ {
+ if (!yp2::util::set_databases_from_zurl(odr, *t_it,
+ &req->num_databaseNames,
+ &req->databaseNames));
+ }
+ scan_package.request() = yazpp_1::GDU(apdu_req);
+
+ scan_package.move(b->m_route);
+
+ if (scan_package.session().is_closed())
+ {
+ package.response() = scan_package.response();
+ package.session().close();
+ return;
+ }
+ package.response() = scan_package.response();
+}
+
+
+void yf::Virt_db::add_map_db2targets(std::string db,
+ std::list<std::string> targets,
+ std::string route)
+{
+ m_p->m_maps[db] = Virt_db::Map(targets, route);
+}
+
+
+void yf::Virt_db::add_map_db2target(std::string db,
+ std::string target,
+ std::string route)
+{
+ std::list<std::string> targets;
+ targets.push_back(target);
+
+ m_p->m_maps[db] = Virt_db::Map(targets, route);