-/* $Id: filter_sru_to_z3950.cpp,v 1.31 2007-03-20 07:05:10 adam Exp $
- Copyright (c) 2005-2007, Index Data.
-
- See the LICENSE file for details
+/* This file is part of Metaproxy.
+ Copyright (C) 2005-2008 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
+Software Foundation; either version 2, or (at your option) any later
+version.
+
+Metaproxy is distributed in the hope that it will be useful, but WITHOUT ANY
+WARRANTY; without even the implied warranty of MERCHANTABILITY or
+FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+for more details.
+
+You should have received a copy of the GNU General Public License
+along with this program; if not, write to the Free Software
+Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include "config.hpp"
#include <yaz/z-core.h>
#include <yaz/srw.h>
#include <yaz/pquery.h>
+#include <yaz/oid_db.h>
#include <boost/thread/mutex.hpp>
bool z3950_init_request(mp::Package &package,
mp::odr &odr_en,
- Z_SRW_PDU *sru_pdu_res,
- const std::string
- &database = "Default") const;
+ std::string zurl,
+ Z_SRW_PDU *sru_pdu_res) const;
bool z3950_close_request(mp::Package &package) const;
- bool z3950_search_request(mp::Package &package,
- mp::odr &odr_en,
- Z_SRW_PDU *sru_pdu_res,
- Z_SRW_searchRetrieveRequest
- const *sr_req) const;
+ bool z3950_search_request(
+ mp::Package &package,
+ mp::odr &odr_en,
+ Z_SRW_PDU *sru_pdu_res,
+ Z_SRW_searchRetrieveRequest const *sr_req,
+ std::string zurl) const;
- bool z3950_present_request(mp::Package &package,
- mp::odr &odr_en,
- Z_SRW_PDU *sru_pdu_res,
- Z_SRW_searchRetrieveRequest
- const *sr_req) const;
+ bool z3950_present_request(
+ mp::Package &package,
+ mp::odr &odr_en,
+ Z_SRW_PDU *sru_pdu_res,
+ Z_SRW_searchRetrieveRequest const *sr_req) const;
bool z3950_scan_request(mp::Package &package,
mp::odr &odr_en,
{ // must have a destructor because of boost::scoped_ptr
}
-void yf::SRUtoZ3950::configure(const xmlNode *xmlnode)
+void yf::SRUtoZ3950::configure(const xmlNode *xmlnode, bool test_only)
{
m_p->configure(xmlnode);
}
// filter acts as sink for non-valid SRU requests
if (! (sru_pdu_req = mp_util::decode_sru_request(package, odr_de, odr_en,
- sru_pdu_res, soap,
+ sru_pdu_res, &soap,
charset, stylesheet)))
{
if (soap)
return;
}
+ std::string zurl;
+ Z_SRW_extra_arg *arg;
+
+ for ( arg = sru_pdu_req->extra_args; arg; arg = arg->next)
+ if (!strcmp(arg->name, "x-target"))
+ {
+ zurl = std::string(arg->value);
+ }
+
+
// filter acts as sink for SRU explain requests
if (sru_pdu_req && sru_pdu_req->which == Z_SRW_explain_request)
{
// sruinfo, er_req);
mp_util::build_sru_explain(package, odr_en, sru_pdu_res,
sruinfo, explainnode, er_req);
- mp_util::build_sru_response(package, odr_en, soap,
- sru_pdu_res, charset, stylesheet);
- return;
}
-
- // searchRetrieve
else if (sru_pdu_req
&& sru_pdu_req->which == Z_SRW_searchRetrieve_request
&& sru_pdu_req->u.request)
- {
+ { // searchRetrieve
Z_SRW_searchRetrieveRequest *sr_req = sru_pdu_req->u.request;
sru_pdu_res = yaz_srw_get(odr_en, Z_SRW_searchRetrieve_response);
ok = mp_util::check_sru_query_exists(package, odr_en,
sru_pdu_res, sr_req);
- if (ok && z3950_init_request(package, odr_en, sru_pdu_res))
+ if (ok && z3950_init_request(package, odr_en, zurl, sru_pdu_res))
{
- {
- ok = z3950_search_request(package, odr_en,
- sru_pdu_res, sr_req);
-
- if (ok
- && sru_pdu_res->u.response->numberOfRecords
- && *(sru_pdu_res->u.response->numberOfRecords)
- && sr_req->maximumRecords
- && *(sr_req->maximumRecords))
-
- ok = z3950_present_request(package, odr_en,
- sru_pdu_res,
- sr_req);
- z3950_close_request(package);
- }
+ ok = z3950_search_request(package, odr_en,
+ sru_pdu_res, sr_req, zurl);
+
+ if (ok
+ && sru_pdu_res->u.response->numberOfRecords
+ && *(sru_pdu_res->u.response->numberOfRecords)
+ && sr_req->maximumRecords
+ && *(sr_req->maximumRecords))
+
+ ok = z3950_present_request(package, odr_en,
+ sru_pdu_res,
+ sr_req);
+ z3950_close_request(package);
}
}
4, "scan");
// to be used when we do scan
- if (false && z3950_init_request(package, odr_en, sru_pdu_res))
+ if (false && z3950_init_request(package, odr_en, zurl, sru_pdu_res))
{
z3950_scan_request(package, odr_en, sru_pdu_res, sr_req);
z3950_close_request(package);
// build and send SRU response
mp_util::build_sru_response(package, odr_en, soap,
sru_pdu_res, charset, stylesheet);
- return;
}
bool
yf::SRUtoZ3950::Impl::z3950_init_request(mp::Package &package,
mp::odr &odr_en,
- Z_SRW_PDU *sru_pdu_res,
- const std::string &database) const
+ std::string zurl,
+ Z_SRW_PDU *sru_pdu_res) const
{
// prepare Z3950 package
Package z3950_package(package.session(), package.origin());
ODR_MASK_SET(init_req->protocolVersion, Z_ProtocolVersion_2);
ODR_MASK_SET(init_req->protocolVersion, Z_ProtocolVersion_3);
+ if (zurl.length())
+ {
+ std::string host;
+ std::list<std::string> dblist;
+ mp_util::split_zurl(zurl, host, dblist);
+ mp_util::set_vhost_otherinfo(&init_req->otherInfo, odr_en, host, 1);
+ }
+
z3950_package.request() = apdu;
// send Z3950 package
return false;
}
-bool
-yf::SRUtoZ3950::Impl::z3950_search_request(mp::Package &package,
- mp::odr &odr_en,
- Z_SRW_PDU *sru_pdu_res,
- Z_SRW_searchRetrieveRequest
- const *sr_req) const
+bool yf::SRUtoZ3950::Impl::z3950_search_request(mp::Package &package,
+ mp::odr &odr_en,
+ Z_SRW_PDU *sru_pdu_res,
+ Z_SRW_searchRetrieveRequest
+ const *sr_req,
+ std::string zurl) const
{
assert(sru_pdu_res->u.response);
Z_APDU *apdu = zget_APDU(odr_en, Z_APDU_searchRequest);
Z_SearchRequest *z_searchRequest = apdu->u.searchRequest;
- // z3950'fy database
- z_searchRequest->num_databaseNames = 1;
- z_searchRequest->databaseNames = (char**)
- odr_malloc(odr_en, sizeof(char *));
- if (sr_req->database)
- z_searchRequest->databaseNames[0]
- = odr_strdup(odr_en, const_cast<char *>(sr_req->database));
- else
- z_searchRequest->databaseNames[0]
- = odr_strdup(odr_en, "Default");
+ if (!mp_util::set_databases_from_zurl(odr_en, zurl,
+ &z_searchRequest->num_databaseNames,
+ &z_searchRequest->databaseNames))
+ {
+ z_searchRequest->num_databaseNames = 1;
+ z_searchRequest->databaseNames = (char**)
+ odr_malloc(odr_en, sizeof(char *));
+ if (sr_req->database)
+ z_searchRequest->databaseNames[0]
+ = odr_strdup(odr_en, const_cast<char *>(sr_req->database));
+ else
+ z_searchRequest->databaseNames[0]
+ = odr_strdup(odr_en, "Default");
+ }
// z3950'fy query
Z_Query *z_query = (Z_Query *) odr_malloc(odr_en, sizeof(Z_Query));
record_packing = Z_SRW_recordPacking_string;
// RecordSyntax will always be XML
- (apdu->u.presentRequest->preferredRecordSyntax)
- = yaz_oidval_to_z3950oid (odr_en, CLASS_RECSYN, VAL_TEXT_XML);
+ apdu->u.presentRequest->preferredRecordSyntax
+ = odr_oiddup(odr_en, yaz_oid_recsyn_xml);
// z3950'fy record schema
if (sr_req->recordSchema)
else
{
Z_External *r = npr->u.databaseRecord;
- oident *ent = oid_getentbyoid(r->direct_reference);
- if (r->which == Z_External_octet
- && ent->value == VAL_TEXT_XML)
+ if (r->direct_reference
+ && !oid_oidcmp(r->direct_reference, yaz_oid_recsyn_xml))
{
sru_res->records[i].recordSchema = "dc";
sru_res->records[i].recordData_buf