time_t m_time_last_use;
void timestamp();
yazpp_1::RecordCache m_record_cache;
+
+ Z_OtherInformation *additionalSearchInfoRequest;
+ Z_OtherInformation *additionalSearchInfoResponse;
+ NMEM mem_additionalSearchInfo;
BackendSet(
const std::string &result_set_id,
const Databases &databases,
- const yazpp_1::Yaz_Z_Query &query);
+ const yazpp_1::Yaz_Z_Query &query,
+ Z_OtherInformation *additionalSearchInfoRequest);
+ ~BackendSet();
bool search(
Package &frontend_package,
Package &search_package,
no_instances++;
}
}
- yaz_log(YLOG_LOG, "backend classes=%d instances=%d", no_classes,
- no_instances);
}
void yf::SessionShared::Rep::init(mp::Package &package, const Z_GDU *gdu,
yf::SessionShared::BackendSet::BackendSet(
const std::string &result_set_id,
const Databases &databases,
- const yazpp_1::Yaz_Z_Query &query) :
+ const yazpp_1::Yaz_Z_Query &query,
+ Z_OtherInformation *additionalSearchInfo) :
m_result_set_id(result_set_id),
m_databases(databases), m_result_set_size(0), m_query(query)
{
timestamp();
+ mem_additionalSearchInfo = nmem_create();
+ additionalSearchInfoResponse = 0;
+ additionalSearchInfoRequest =
+ yaz_clone_z_OtherInformation(additionalSearchInfo,
+ mem_additionalSearchInfo);
+}
+
+yf::SessionShared::BackendSet::~BackendSet()
+{
+ nmem_destroy(mem_additionalSearchInfo);
}
static int get_diagnostic(Z_DefaultDiagFormat *r)
Z_APDU *apdu_req = zget_APDU(odr, Z_APDU_searchRequest);
Z_SearchRequest *req = apdu_req->u.searchRequest;
+ req->additionalSearchInfo = additionalSearchInfoRequest;
req->resultSetName = odr_strdup(odr, m_result_set_id.c_str());
req->query = m_query.get_Z_Query();
Z_SearchResponse *b_resp = gdu->u.z3950->u.searchResponse;
*z_records = b_resp->records;
m_result_set_size = *b_resp->resultCount;
+
+ additionalSearchInfoResponse = yaz_clone_z_OtherInformation(
+ b_resp->additionalSearchInfo, mem_additionalSearchInfo);
return true;
}
Z_APDU *f_apdu = 0;
BackendSetPtr &found_set)
{
bool session_restarted = false;
+ Z_OtherInformation *additionalSearchInfo = 0;
+
+ if (apdu_req->which == Z_APDU_searchRequest)
+ additionalSearchInfo = apdu_req->u.searchRequest->additionalSearchInfo;
restart:
std::string result_set_id;
BackendSetList::const_iterator set_it = (*it)->m_sets.begin();
for (; set_it != (*it)->m_sets.end(); set_it++)
{
+ // for real present request we don't care
+ // if additionalSearchInfo matches: same records
if ((*set_it)->m_databases == databases
- && query.match(&(*set_it)->m_query))
+ && query.match(&(*set_it)->m_query)
+ && (apdu_req->which != Z_APDU_searchRequest ||
+ yaz_compare_z_OtherInformation(
+ additionalSearchInfo,
+ (*set_it)->additionalSearchInfoRequest)))
{
found_set = *set_it;
found_backend = *it;
// we must search ...
BackendSetPtr new_set(new BackendSet(result_set_id,
- databases, query));
+ databases, query,
+ additionalSearchInfo));
Z_Records *z_records = 0;
Package search_package(found_backend->m_session, package.origin());
Z_APDU *f_apdu = odr.create_searchResponse(apdu_req, 0, 0);
Z_SearchResponse *f_resp = f_apdu->u.searchResponse;
*f_resp->resultCount = found_set->m_result_set_size;
+ f_resp->additionalSearchInfo = found_set->additionalSearchInfoResponse;
package.response() = f_apdu;
FrontendSetPtr fset(new FrontendSet(databases, query));
found_set->m_record_cache.add(
odr,
b_resp->records->u.databaseOrSurDiagnostics,
- *req->resultSetStartPoint,
- *f_resp->numberOfRecordsReturned);
+ *req->resultSetStartPoint, p_req->recordComposition);
}
bc->release_backend(found_backend);
}