/* This file is part of Metaproxy.
- Copyright (C) 2005-2012 Index Data
+ Copyright (C) Index Data
Metaproxy is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free
#include <yaz/otherinfo.h>
#include <yaz/diagbib1.h>
#include <yaz/match_glob.h>
+#include <yaz/oid_db.h>
#include <vector>
#include <algorithm>
void close(Package &package);
void search(Package &package, Z_APDU *apdu);
void present(Package &package, Z_APDU *apdu);
- void scan1(Package &package, Z_APDU *apdu);
- void scan2(Package &package, Z_APDU *apdu);
+ void scan(Package &package, Z_APDU *apdu);
void relay_apdu(Package &package, Z_APDU *apdu);
void record_diagnostics(Z_Records *records,
Z_DiagRecs * &z_diag,
*breq->preferredMessageSize = *req->preferredMessageSize;
*breq->maximumRecordSize = *req->maximumRecordSize;
+
+ const char *peer_name = yaz_oi_get_string_oid(
+ &req->otherInfo, yaz_oid_userinfo_client_ip, 1, 0);
+ if (peer_name)
+ yaz_oi_set_string_oid(&breq->otherInfo, odr,
+ yaz_oid_userinfo_client_ip, 1, peer_name);
+
ODR_MASK_SET(breq->options, Z_Options_search);
ODR_MASK_SET(breq->options, Z_Options_present);
ODR_MASK_SET(breq->options, Z_Options_namedResultSets);
// create search request
Z_SearchRequest *req = apdu_req->u.searchRequest;
- // save these for later
- Odr_int smallSetUpperBound = *req->smallSetUpperBound;
- Odr_int largeSetLowerBound = *req->largeSetLowerBound;
- Odr_int mediumSetPresentNumber = *req->mediumSetPresentNumber;
-
- // they are altered now - to disable piggyback
- *req->smallSetUpperBound = 0;
- *req->largeSetLowerBound = 1;
- *req->mediumSetPresentNumber = 0;
-
- int default_num_db = req->num_databaseNames;
- char **default_db = req->databaseNames;
-
std::list<BackendPtr>::const_iterator bit;
for (bit = m_backend_list.begin(); bit != m_backend_list.end(); bit++)
{
PackagePtr p = (*bit)->m_package;
+ yazpp_1::GDU gdu1(apdu_req);
mp::odr odr;
+ Z_SearchRequest *req1 = gdu1.get()->u.z3950->u.searchRequest;
+
+ // they are altered now - to disable piggyback
+ *req1->smallSetUpperBound = 0;
+ *req1->largeSetLowerBound = 1;
+ *req1->mediumSetPresentNumber = 0;
if (!mp::util::set_databases_from_zurl(odr, (*bit)->m_vhost,
- &req->num_databaseNames,
- &req->databaseNames))
+ &req1->num_databaseNames,
+ &req1->databaseNames))
{
- req->num_databaseNames = default_num_db;
- req->databaseNames = default_db;
+ req1->num_databaseNames = req->num_databaseNames;
+ req1->databaseNames = req->databaseNames;
}
- p->request() = apdu_req;
+ p->request() = gdu1;
p->copy_filter(package);
}
multi_move(m_backend_list);
Z_APDU *f_apdu = odr.create_searchResponse(apdu_req, 0, 0);
Z_SearchResponse *f_resp = f_apdu->u.searchResponse;
- yaz_log(YLOG_LOG, "no_successful=%d is_closed=%s hide_errors=%s",
+ yaz_log(YLOG_DEBUG, "no_successful=%d is_closed=%s hide_errors=%s",
no_successful,
close_p ? "true" : "false",
m_p->m_hide_errors ? "true" : "false");
m_sets[resultSet.m_setname] = resultSet;
Odr_int number;
- mp::util::piggyback(smallSetUpperBound,
- largeSetLowerBound,
- mediumSetPresentNumber,
+ mp::util::piggyback(*req->smallSetUpperBound,
+ *req->largeSetLowerBound,
+ *req->mediumSetPresentNumber,
0, 0,
result_set_size,
number, 0);
std::list<Multi::FrontendSet::PresentJob>::const_iterator jit;
for (jit = jobs.begin(); jit != jobs.end(); jit++)
{
- yaz_log(YLOG_LOG, "job pos=%d", jit->m_pos);
+ yaz_log(YLOG_DEBUG, "job pos=%d", jit->m_pos);
}
}
package.response() = f_apdu;
}
-void yf::Multi::Frontend::scan1(mp::Package &package, Z_APDU *apdu_req)
-{
- if (m_backend_list.size() > 1)
- {
- mp::odr odr;
- Z_APDU *f_apdu =
- odr.create_scanResponse(
- apdu_req, YAZ_BIB1_COMBI_OF_SPECIFIED_DATABASES_UNSUPP, 0);
- package.response() = f_apdu;
- return;
- }
- Z_ScanRequest *req = apdu_req->u.scanRequest;
-
- int default_num_db = req->num_databaseNames;
- char **default_db = req->databaseNames;
-
- std::list<BackendPtr>::const_iterator bit;
- for (bit = m_backend_list.begin(); bit != m_backend_list.end(); bit++)
- {
- PackagePtr p = (*bit)->m_package;
- mp::odr odr;
-
- if (!mp::util::set_databases_from_zurl(odr, (*bit)->m_vhost,
- &req->num_databaseNames,
- &req->databaseNames))
- {
- req->num_databaseNames = default_num_db;
- req->databaseNames = default_db;
- }
- p->request() = apdu_req;
- p->copy_filter(package);
- }
- multi_move(m_backend_list);
-
- for (bit = m_backend_list.begin(); bit != m_backend_list.end(); bit++)
- {
- PackagePtr p = (*bit)->m_package;
-
- if (p->session().is_closed()) // if any backend closes, close frontend
- package.session().close();
-
- Z_GDU *gdu = p->response().get();
- if (gdu && gdu->which == Z_GDU_Z3950 && gdu->u.z3950->which ==
- Z_APDU_scanResponse)
- {
- package.response() = p->response();
- break;
- }
- else
- {
- // if any target does not return scan response - return that
- package.response() = p->response();
- return;
- }
- }
-}
-
bool yf::Multi::ScanTermInfo::operator < (const ScanTermInfo &k) const
{
return m_norm_term < k.m_norm_term;
t->byAttributes = 0;
t->otherTermInfo = 0;
t->globalOccurrences = odr_intdup(odr, m_count);
- t->term = (Z_Term *)
- odr_malloc(odr, sizeof(*t->term));
+ t->term = (Z_Term *) odr_malloc(odr, sizeof(*t->term));
t->term->which = Z_Term_general;
- Odr_oct *o;
- t->term->u.general = o = (Odr_oct *)odr_malloc(odr, sizeof(Odr_oct));
-
- o->len = o->size = m_norm_term.size();
- o->buf = (unsigned char *) odr_malloc(odr, o->len);
- memcpy(o->buf, m_norm_term.c_str(), o->len);
+ t->term->u.general = odr_create_Odr_oct(odr,
+#if YAZ_VERSIONL < 0x50000
+ (unsigned char *)
+#endif
+ m_norm_term.c_str(), m_norm_term.size());
return e;
}
}
-void yf::Multi::Frontend::scan2(mp::Package &package, Z_APDU *apdu_req)
+void yf::Multi::Frontend::scan(mp::Package &package, Z_APDU *apdu_req)
{
Z_ScanRequest *req = apdu_req->u.scanRequest;
- int default_num_db = req->num_databaseNames;
- char **default_db = req->databaseNames;
-
std::list<BackendPtr>::const_iterator bit;
for (bit = m_backend_list.begin(); bit != m_backend_list.end(); bit++)
{
PackagePtr p = (*bit)->m_package;
+ yazpp_1::GDU gdu1(apdu_req);
mp::odr odr;
+ Z_ScanRequest *req1 = gdu1.get()->u.z3950->u.scanRequest;
if (!mp::util::set_databases_from_zurl(odr, (*bit)->m_vhost,
- &req->num_databaseNames,
- &req->databaseNames))
+ &req1->num_databaseNames,
+ &req1->databaseNames))
{
- req->num_databaseNames = default_num_db;
- req->databaseNames = default_db;
+ req1->num_databaseNames = req->num_databaseNames;
+ req1->databaseNames = req->databaseNames;
}
- p->request() = apdu_req;
+ p->request() = gdu1;
p->copy_filter(package);
}
multi_move(m_backend_list);
}
else if (apdu->which == Z_APDU_scanRequest)
{
- f->scan2(package, apdu);
+ f->scan(package, apdu);
}
else if (apdu->which == Z_APDU_close)
{