+void yf::Virt_db::Rep::present(Package &package, Z_APDU *apdu, bool &move_later){
+ Session *id = 0;
+ std::string resultSetId;
+ Z_PresentRequest *req = apdu->u.presentRequest;
+ {
+ resultSetId = req->resultSetId;
+ boost::mutex::scoped_lock lock(m_sessions_mutex);
+
+ Ses_it it = m_sessions.find(package.session());
+ if (it == m_sessions.end())
+ {
+ ODR odr = odr_createmem(ODR_ENCODE);
+
+ Z_APDU *apdu = zget_APDU(odr, Z_APDU_close);
+
+ *apdu->u.close->closeReason = Z_Close_protocolError;
+ apdu->u.close->diagnosticInformation =
+ odr_strdup(odr, "no session for present request");
+
+ package.response() = apdu;
+ package.session().close();
+ odr_destroy(odr);
+ assert(false);
+ return;
+ }
+ if (it->second.m_use_vhost)
+ {
+ move_later = true;
+ return;
+ }
+ Sets_it sets_it = it->second.m_sets.find(resultSetId);
+ if (sets_it == it->second.m_sets.end())
+ {
+ ODR odr = odr_createmem(ODR_ENCODE);
+ Z_APDU *apdu = zget_APDU(odr, Z_APDU_presentResponse);
+
+ Z_Records *rec = (Z_Records *) odr_malloc(odr, sizeof(Z_Records));
+ apdu->u.presentResponse->records = rec;
+ rec->which = Z_Records_NSD;
+ rec->u.nonSurrogateDiagnostic =
+ zget_DefaultDiagFormat(
+ odr,
+ YAZ_BIB1_SPECIFIED_RESULT_SET_DOES_NOT_EXIST,
+ resultSetId.c_str());
+ package.response() = apdu;
+ odr_destroy(odr);
+ return;
+ }
+ id = new yp2::Session(sets_it->second.m_backend_session);
+ }
+ ODR odr = odr_createmem(ODR_ENCODE);
+
+ // sending present to backend
+ Package present_package(*id, package.origin());
+ present_package.copy_filter(package);
+
+ req->resultSetId = odr_strdup(odr, "default");
+ present_package.request() = yazpp_1::GDU(apdu);
+
+ odr_destroy(odr);