X-Git-Url: http://sru.miketaylor.org.uk/?a=blobdiff_plain;f=src%2Ffilter_zoom.cpp;h=1c2ff9a42cc945f5467c68b174fa10698d00ab4a;hb=844c0b8ab1de859d3c1052b81c0fc056b2cd5437;hp=6591a6e69a7b4e9124650ab6cbe84bfdc8f5af99;hpb=cc219724dfe5b390413a4c93f85786c586c18893;p=metaproxy-moved-to-github.git diff --git a/src/filter_zoom.cpp b/src/filter_zoom.cpp index 6591a6e..1c2ff9a 100644 --- a/src/filter_zoom.cpp +++ b/src/filter_zoom.cpp @@ -17,6 +17,10 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA */ #include "config.hpp" + +#include +#include +#include #include "filter_zoom.hpp" #include #include @@ -145,6 +149,7 @@ namespace metaproxy_1 { std::string file_path; std::string content_proxy_server; std::string content_tmp_file; + bool apdu_log; CCL_bibset bibset; std::string element_transform; std::string element_raw; @@ -198,7 +203,8 @@ void yf::Zoom::Backend::get_zoom_error(int *error, char **addinfo, { const char *msg = 0; const char *zoom_addinfo = 0; - *error = ZOOM_connection_error(m_connection, &msg, &zoom_addinfo); + const char *dset = 0; + *error = ZOOM_connection_error_x(m_connection, &msg, &zoom_addinfo, &dset); if (*error) { if (*error >= ZOOM_ERROR_CONNECT) @@ -218,6 +224,8 @@ void yf::Zoom::Backend::get_zoom_error(int *error, char **addinfo, } else { + if (dset && !strcmp(dset, "info:srw/diagnostic/1")) + *error = yaz_diag_srw_to_bib1(*error); *addinfo = (char *) odr_malloc( odr, 20 + (zoom_addinfo ? strlen(zoom_addinfo) : 0)); **addinfo = '\0'; @@ -357,9 +365,12 @@ void yf::Zoom::Impl::release_frontend(mp::Package &package) } } -yf::Zoom::Impl::Impl() : element_transform("pz2") , element_raw("raw") +yf::Zoom::Impl::Impl() : + apdu_log(false), element_transform("pz2") , element_raw("raw") { bibset = ccl_qual_mk(); + + srand(time(0)); } yf::Zoom::Impl::~Impl() @@ -516,7 +527,7 @@ void yf::Zoom::Impl::configure_local_records(const xmlNode *ptr, bool test_only) void yf::Zoom::Impl::configure(const xmlNode *ptr, bool test_only, const char *path) { - content_tmp_file = "/tmp/mp_content_proxy."; + content_tmp_file = "/tmp/cf.XXXXXX.p"; if (path && *path) { file_path = path; @@ -584,6 +595,19 @@ void yf::Zoom::Impl::configure(const xmlNode *ptr, bool test_only, attr->name)); } } + else if (!strcmp((const char *) ptr->name, "log")) + { + const struct _xmlAttr *attr; + for (attr = ptr->properties; attr; attr = attr->next) + { + if (!strcmp((const char *) attr->name, "apdu")) + apdu_log = mp::xml::get_bool(attr->children, false); + else + throw mp::filter::FilterException( + "Bad attribute " + std::string((const char *) + attr->name)); + } + } else { throw mp::filter::FilterException @@ -710,7 +734,9 @@ yf::Zoom::BackendPtr yf::Zoom::Frontend::get_backend_from_databases( b->set_option("rpnCharset", sptr->query_encoding); b->set_option("timeout", "40"); - + + if (m_p->apdu_log) + b->set_option("apdulog", "1"); std::string authentication = sptr->authentication; std::string proxy = sptr->cfProxy; @@ -811,13 +837,23 @@ yf::Zoom::BackendPtr yf::Zoom::Frontend::get_backend_from_databases( } if (b->sptr->contentConnector.length()) { - int fd; - char *fname = (char *) xmalloc(m_p->content_tmp_file.length() + 8); strcpy(fname, m_p->content_tmp_file.c_str()); - strcat(fname, "XXXXXX"); - fd = mkstemp(fname); - + int suffixlen; + char *xx = strstr(fname, "XXXXXX"); + if (xx) + suffixlen = strlen(xx) - 6; + else + { + suffixlen = 0; + xx = fname + strlen(fname); + strcat(fname, "XXXXXX"); + } + char tmp_char = xx[6]; + sprintf(xx, "%06d", ((unsigned) rand()) % 1000000); + xx[6] = tmp_char; + + int fd = creat(fname, 0666); if (fd == -1) { yaz_log(YLOG_WARN|YLOG_ERRNO, "create %s", fname); @@ -828,7 +864,7 @@ yf::Zoom::BackendPtr yf::Zoom::Frontend::get_backend_from_databases( BackendPtr backend_null; return backend_null; } - b->content_session_id.assign(fname + (strlen(fname) - 6)); + b->content_session_id.assign(xx, 6); WRBUF w = wrbuf_alloc(); wrbuf_puts(w, "#content_proxy\n"); wrbuf_printf(w, "connector: %s\n", b->sptr->contentConnector.c_str()); @@ -846,7 +882,6 @@ yf::Zoom::BackendPtr yf::Zoom::Frontend::get_backend_from_databases( yaz_log(YLOG_LOG, "file %s created\n", fname); xfree(fname); } - std::string url; if (sptr->sru.length()) @@ -1252,6 +1287,13 @@ static void sort_via_cql(WRBUF cql_sortby, const char *sru_sortkeys) nmem_destroy(nmem); } +#if YAZ_VERSIONL < 0x40206 +static void wrbuf_vp_puts(const char *buf, void *client_data) +{ + WRBUF b = (WRBUF) client_data; + wrbuf_puts(b, buf); +} +#endif void yf::Zoom::Frontend::handle_search(mp::Package &package) {