+ Z_SearchRequest *req = apdu_req->u.searchRequest;
+ std::string vhost;
+ std::string resultSetId = req->resultSetName;
+ yp2::odr odr;
+
+ // only one datatabase for now
+ if (req->num_databaseNames != 1)
+ { // exactly one database must be specified
+ Z_APDU *apdu =
+ odr.create_searchResponse(
+ apdu_req, YAZ_BIB1_TOO_MANY_DATABASES_SPECIFIED, 0);
+ package.response() = apdu;
+
+ return;
+ }
+ std::string database = std::string(req->databaseNames[0]);
+
+ BackendPtr b; // null for now
+ Sets_it sets_it = m_sets.find(req->resultSetName);
+ if (sets_it != m_sets.end())
+ {
+ // result set already exist
+ // if replace indicator is off: we return diagnostic if
+ // result set already exist.
+ if (*req->replaceIndicator == 0)
+ {
+ Z_APDU *apdu =
+ odr.create_searchResponse(
+ apdu_req,
+ YAZ_BIB1_RESULT_SET_EXISTS_AND_REPLACE_INDICATOR_OFF,
+ 0);
+ package.response() = apdu;
+
+ return;
+ }
+ sets_it->second.m_backend->m_number_of_sets--;
+
+ // 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_database == database)
+ break;
+ }
+ if (map_it != m_backend_list.end())
+ b = *map_it;
+ }
+ else
+ {
+ // new result set.
+
+ // pick up any existing database with named result sets ..
+ // or one which has no result sets.. yet.
+ 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_database == database &&
+ (tmp->m_named_result_sets ||
+ tmp->m_number_of_sets == 0))
+ 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(database, package, error_code, addinfo);
+ if (!b)
+ {
+ // did not get a backend (unavailable somehow?)
+
+ Z_APDU *apdu =
+ odr.create_searchResponse(
+ apdu_req, error_code, addinfo.c_str());
+ package.response() = apdu;
+ return;
+ }
+ }
+ m_sets.erase(req->resultSetName);
+ // sending search to backend
+ Package search_package(b->m_backend_session, package.origin());
+
+ search_package.copy_filter(package);
+
+ std::string backend_setname;
+ if (b->m_named_result_sets)
+ {
+ std::cout << "named_result_sets TRUE\n";
+ backend_setname = std::string(req->resultSetName);
+ }
+ else
+ {
+ std::cout << "named_result_sets FALSE\n";
+ backend_setname = "default";
+ req->resultSetName = odr_strdup(odr, backend_setname.c_str());
+ }
+
+ const char *backend_database = b->m_backend_database.c_str();
+ req->databaseNames[0] = odr_strdup(odr, backend_database);
+
+ *req->replaceIndicator = 1;
+
+ search_package.request() = yazpp_1::GDU(apdu_req);
+
+ search_package.move(b->m_route);
+
+ if (search_package.session().is_closed())
+ {
+ Z_APDU *apdu =
+ odr.create_searchResponse(
+ apdu_req,
+ YAZ_BIB1_DATABASE_UNAVAILABLE, database.c_str());
+ package.response() = apdu;
+ return;
+ }
+ package.response() = search_package.response();
+
+ b->m_number_of_sets++;
+
+ m_sets[resultSetId] = Virt_db::Set(b, backend_setname);