+ package.response() = present_package.response();
+ }
+ delete id;
+}
+
+void yf::Virt_db::Frontend::scan(Package &package, Z_APDU *apdu_req)
+{
+ 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);
+
+#if 0
+ const char *backend_database = b->m_backend_database.c_str();
+ req->databaseNames[0] = odr_strdup(odr, backend_database);
+#endif
+
+ scan_package.request() = yazpp_1::GDU(apdu_req);
+
+ scan_package.move(b->m_route);
+
+ if (scan_package.session().is_closed())
+ {
+ Z_APDU *apdu =
+ odr.create_scanResponse(
+ apdu_req, YAZ_BIB1_DATABASE_UNAVAILABLE, 0);
+ package.response() = apdu;
+ return;