#include <stdlib.h>
#include <sys/types.h>
#include "filter_zoom.hpp"
-#include <yaz/zoom.h>
-#include <yaz/yaz-version.h>
-#include <yaz/tpath.h>
-#include <yaz/srw.h>
#include <metaproxy/package.hpp>
#include <metaproxy/util.hpp>
#include <metaproxy/xmlutil.hpp>
#include <boost/thread/mutex.hpp>
#include <boost/thread/condition.hpp>
+
+#include <yaz/yaz-version.h>
+#include <yaz/tpath.h>
+#include <yaz/srw.h>
#include <yaz/ccl_xml.h>
#include <yaz/ccl.h>
#include <yaz/rpn2cql.h>
#include <yaz/querytowrbuf.h>
#include <yaz/sortspec.h>
#include <yaz/tokenizer.h>
+#include <yaz/zoom.h>
namespace mp = metaproxy_1;
namespace yf = mp::filter;
std::string target;
std::string query_encoding;
std::string sru;
+ std::string sru_version;
std::string request_syntax;
std::string element_set;
std::string record_encoding;
friend class Impl;
friend class Frontend;
std::string zurl;
+ WRBUF m_apdu_wrbuf;
ZOOM_connection m_connection;
ZOOM_resultset m_resultset;
std::string m_frontend_database;
void handle_package(mp::Package &package);
void handle_search(mp::Package &package);
void handle_present(mp::Package &package);
- BackendPtr get_backend_from_databases(const mp::Package &package,
+ BackendPtr get_backend_from_databases(mp::Package &package,
std::string &database,
int *error,
char **addinfo,
yf::Zoom::Backend::Backend(SearchablePtr ptr) : sptr(ptr)
{
+ m_apdu_wrbuf = wrbuf_alloc();
m_connection = ZOOM_connection_create(0);
+ ZOOM_connection_save_apdu_wrbuf(m_connection, m_apdu_wrbuf);
m_resultset = 0;
xsp = 0;
}
{
s->sru = mp::xml::get_text(ptr);
}
+ else if (!strcmp((const char *) ptr->name, "SRUVersion"))
+ {
+ s->sru_version = mp::xml::get_text(ptr);
+ }
else if (!strcmp((const char *) ptr->name,
"queryEncoding"))
{
}
yf::Zoom::BackendPtr yf::Zoom::Frontend::get_backend_from_databases(
- const mp::Package &package,
+ mp::Package &package,
std::string &database, int *error, char **addinfo, ODR odr)
{
std::list<BackendPtr>::const_iterator map_it;
fwrite(wrbuf_buf(w), 1, wrbuf_len(w), file);
fclose(file);
- package.log("zoom", YLOG_LOG, "file %s created\n", fname);
+ package.log("zoom", YLOG_LOG, "file %s created", fname);
xfree(fname);
}
{
url = "http://" + sptr->target;
b->set_option("sru", sptr->sru);
+
+ if (sptr->sru_version.length())
+ b->set_option("sru_version", sptr->sru_version);
}
else
{
(char **) out_values);
url += "," + std::string(x_args);
}
- package.log("zoom", YLOG_LOG, "url=%s", url.c_str());
+ package.log("zoom", YLOG_LOG, "url: %s", url.c_str());
b->connect(url, error, addinfo, odr);
if (*error == 0)
{
const char *cql = query->u.type_104->u.cql;
CQL_parser cp = cql_parser_create();
int r = cql_parser_string(cp, cql);
+ package.log("zoom", YLOG_LOG, "CQL: %s", cql);
if (r)
{
cql_parser_destroy(cp);
+ package.log("zoom", YLOG_WARN, "CQL syntax error");
apdu_res =
odr.create_searchResponse(apdu_req,
YAZ_BIB1_MALFORMED_QUERY,
else if (gdu->which == Z_GDU_Z3950)
{
Z_APDU *apdu_req = gdu->u.z3950;
+
+ if (m_backend)
+ wrbuf_rewind(m_backend->m_apdu_wrbuf);
if (apdu_req->which == Z_APDU_initRequest)
{
mp::odr odr;
"zoom filter cannot handle this APDU");
package.session().close();
}
+ if (m_backend)
+ {
+ WRBUF w = m_backend->m_apdu_wrbuf;
+ package.log_write(wrbuf_buf(w), wrbuf_len(w));
+ }
}
else
{