+ database = req->databaseNames[0];
+ std::map<std::string, Virt_db_map>::iterator map_it;
+ map_it = m_maps.find(database);
+ if (map_it == m_maps.end())
+ { // no map for database: return diagnostic
+ ODR odr = odr_createmem(ODR_ENCODE);
+ Z_APDU *apdu = zget_APDU(odr, Z_APDU_searchResponse);
+
+ Z_Records *rec = (Z_Records *) odr_malloc(odr, sizeof(Z_Records));
+ apdu->u.searchResponse->records = rec;
+ rec->which = Z_Records_NSD;
+ rec->u.nonSurrogateDiagnostic =
+ zget_DefaultDiagFormat(
+ odr, YAZ_BIB1_DATABASE_UNAVAILABLE, database.c_str());
+ package.response() = apdu;
+
+ odr_destroy(odr);
+ return;
+ }
+ if (*req->replaceIndicator == 0)
+ {
+ Sets_it sets_it = it->second.m_sets.find(req->resultSetName);
+ if (sets_it != it->second.m_sets.end())
+ {
+ ODR odr = odr_createmem(ODR_ENCODE);
+ Z_APDU *apdu = zget_APDU(odr, Z_APDU_searchResponse);
+
+ Z_Records *rec = (Z_Records *) odr_malloc(odr, sizeof(Z_Records));
+ apdu->u.searchResponse->records = rec;
+ rec->which = Z_Records_NSD;
+ rec->u.nonSurrogateDiagnostic =
+ zget_DefaultDiagFormat(
+ odr,
+ YAZ_BIB1_RESULT_SET_EXISTS_AND_REPLACE_INDICATOR_OFF,
+ 0);
+ package.response() = apdu;
+
+ odr_destroy(odr);
+ return;
+ }
+ }
+ vhost = map_it->second.m_vhost;
+ id = new Session;
+
+ it->second.m_sets[req->resultSetName] =
+ Virt_db_set(*id, req->resultSetName, vhost);