/* This file is part of Metaproxy.
- Copyright (C) 2005-2012 Index Data
+ Copyright (C) 2005-2013 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
mp::odr &odr_en,
Z_SRW_PDU *sru_pdu_res,
Z_SRW_searchRetrieveRequest const *sr_req,
- std::string zurl
+ std::string zurl,
+ std::string db_append
) const;
bool z3950_present_request(
bool enable_package_log = false;
std::string zurl;
+ std::string dbargs;
Z_SRW_extra_arg *arg;
for ( arg = sru_pdu_req->extra_args; arg; arg = arg->next)
package.log_enable();
}
}
+ else if (!strncmp(arg->name, "x-client-", 9) && arg->value)
+ {
+ if (dbargs.length())
+ dbargs += '&';
+ dbargs += mp_util::uri_encode(arg->name + 9);
+ dbargs += '=';
+ dbargs += mp_util::uri_encode(arg->value);
+ }
+
assert(sru_pdu_req);
// filter acts as sink for SRU explain requests
zurl, sru_pdu_res, sru_pdu_req))
{
ok = z3950_search_request(package, odr_en,
- sru_pdu_res, sr_req, zurl);
+ sru_pdu_res, sr_req, zurl, dbargs);
if (ok
&& sru_pdu_res->u.response->numberOfRecords
Z_SRW_PDU *sru_pdu_res,
Z_SRW_searchRetrieveRequest
const *sr_req,
- std::string zurl) const
+ std::string zurl,
+ std::string dbappend) const
{
assert(sru_pdu_res->u.response);
&z_searchRequest->num_databaseNames,
&z_searchRequest->databaseNames))
{
- z_searchRequest->num_databaseNames = 1;
- z_searchRequest->databaseNames = (char**)
- odr_malloc(odr_en, sizeof(char *));
+ std::string db;
if (sr_req->database)
- z_searchRequest->databaseNames[0]
- = odr_strdup(odr_en, const_cast<char *>(sr_req->database));
+ db = sr_req->database;
else
- z_searchRequest->databaseNames[0]
- = odr_strdup(odr_en, "Default");
+ db = "Default";
+
+ if (dbappend.length())
+ {
+ db += ",";
+ db += dbappend;
+ }
+ z_searchRequest->num_databaseNames = 1;
+ z_searchRequest->databaseNames = (char**)
+ odr_malloc(odr_en, sizeof(char *));
+ z_searchRequest->databaseNames[0] = odr_strdup(odr_en, db.c_str());
}
Z_Query *z_query = (Z_Query *) odr_malloc(odr_en, sizeof(Z_Query));
const Z_SRW_searchRetrieveRequest *req
) const
{
- if (req->query_type == Z_SRW_query_type_cql)
+ if (
+#ifdef Z_SRW_query_type_cql
+ req->query_type == Z_SRW_query_type_cql
+#else
+ !strcmp(req->queryType, "cql")
+#endif
+ )
{
Z_External *ext = (Z_External *)
odr_malloc(odr_en, sizeof(*ext));
ext->indirect_reference = 0;
ext->descriptor = 0;
ext->which = Z_External_CQL;
- ext->u.cql = odr_strdup(odr_en, req->query.cql);
+ ext->u.cql = odr_strdup(odr_en,
+#ifdef Z_SRW_query_type_cql
+ req->query.cql
+#else
+ req->query
+#endif
+ );
z_query->which = Z_Query_type_104;
z_query->u.type_104 = ext;
return 0;
}
- if (req->query_type == Z_SRW_query_type_pqf)
+ if (
+#ifdef Z_SRW_query_type_pqf
+ req->query_type == Z_SRW_query_type_pqf
+#else
+ !strcmp(req->queryType, "pqf")
+#endif
+ )
{
Z_RPNQuery *RPNquery;
YAZ_PQF_Parser pqf_parser;
pqf_parser = yaz_pqf_create ();
- RPNquery = yaz_pqf_parse (pqf_parser, odr_en, req->query.pqf);
-
+ RPNquery = yaz_pqf_parse (pqf_parser, odr_en,
+#ifdef Z_SRW_query_type_pqf
+ req->query.pqf
+#else
+ req->query
+#endif
+ );
yaz_pqf_destroy(pqf_parser);
if (!RPNquery)
}
extern "C" {
- struct metaproxy_1_filter_struct metaproxy_1_filter_sru_to_z3950 = {
+ struct metaproxy_1_filter_struct metaproxy_1_filter_sru_z3950 = {
0,
"sru_z3950",
filter_creator