X-Git-Url: http://sru.miketaylor.org.uk/?a=blobdiff_plain;f=src%2Ffilter_zoom.cpp;h=68252b2aa6486b7db09b2b94d86dd3bcfe8430fc;hb=f769e0395476e212ad2757538e546503edfda838;hp=ea3df0103aec0b80e354e92412990281f9e35de7;hpb=a48de5fe67ddff23e96fe9f02318e6d4123719a8;p=metaproxy-moved-to-github.git diff --git a/src/filter_zoom.cpp b/src/filter_zoom.cpp index ea3df01..68252b2 100644 --- a/src/filter_zoom.cpp +++ b/src/filter_zoom.cpp @@ -29,6 +29,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA #include #include #include +#include #include #include #include @@ -40,7 +41,8 @@ namespace yf = mp::filter; namespace metaproxy_1 { namespace filter { - struct Zoom::Searchable { + struct Zoom::Searchable : boost::noncopyable { + std::string authentication; std::string database; std::string target; std::string query_encoding; @@ -55,7 +57,7 @@ namespace metaproxy_1 { Searchable(); ~Searchable(); }; - class Zoom::Backend { + class Zoom::Backend : boost::noncopyable { friend class Impl; friend class Frontend; std::string zurl; @@ -75,7 +77,7 @@ namespace metaproxy_1 { void set_option(const char *name, const char *value); int get_error(const char **addinfo); }; - class Zoom::Frontend { + class Zoom::Frontend : boost::noncopyable { friend class Impl; Impl *m_p; bool m_is_virtual; @@ -201,7 +203,7 @@ int yf::Zoom::Backend::get_error(const char **addinfo) yf::Zoom::Searchable::Searchable() { piggyback = true; - use_turbomarc = false; + use_turbomarc = true; ccl_bibset = ccl_qual_mk(); } @@ -296,7 +298,12 @@ void yf::Zoom::Impl::parse_torus(const xmlNode *ptr1) { if (ptr3->type != XML_ELEMENT_NODE) continue; - if (!strcmp((const char *) ptr3->name, "id")) + if (!strcmp((const char *) ptr3->name, + "authentication")) + { + s->authentication = mp::xml::get_text(ptr3); + } + else if (!strcmp((const char *) ptr3->name, "id")) { s->database = mp::xml::get_text(ptr3); } @@ -341,11 +348,7 @@ void yf::Zoom::Impl::parse_torus(const xmlNode *ptr1) else if (!strcmp((const char *) ptr3->name, "useTurboMarc")) { - yaz_log(YLOG_LOG, "seeing useTurboMarc"); - s->use_turbomarc = mp::xml::get_bool(ptr3, false); - yaz_log(YLOG_LOG, "value=%s", - s->use_turbomarc ? "1" : "0"); - + ; // useTurboMarc is ignored } else if (!strncmp((const char *) ptr3->name, "cclmap_", 7)) @@ -368,7 +371,6 @@ void yf::Zoom::Impl::parse_torus(const xmlNode *ptr1) } } - void yf::Zoom::Impl::configure(const xmlNode *ptr, bool test_only) { for (ptr = ptr->children; ptr; ptr = ptr->next) @@ -470,6 +472,9 @@ yf::Zoom::BackendPtr yf::Zoom::Frontend::get_backend_from_databases( if (sptr->query_encoding.length()) b->set_option("rpnCharset", sptr->query_encoding.c_str()); + if (sptr->authentication.length()) + b->set_option("user", sptr->authentication.c_str()); + std::string url; if (sptr->sru.length()) { @@ -531,9 +536,6 @@ Z_Records *yf::Zoom::Frontend::get_records(Odr_int start, } } - yaz_log(YLOG_LOG, "enable_pz2_transform %s", enable_pz2_transform ? - "enabled" : "disabled"); - b->set_option("preferredRecordSyntax", syntax_name); if (enable_pz2_transform) @@ -686,45 +688,59 @@ void yf::Zoom::Frontend::handle_search(mp::Package &package) Odr_int hits = 0; Z_Query *query = sr->query; + WRBUF ccl_wrbuf = 0; + WRBUF pqf_wrbuf = 0; + if (query->which == Z_Query_type_1 || query->which == Z_Query_type_101) { // RPN - WRBUF w = wrbuf_alloc(); - yaz_rpnquery_to_wrbuf(w, query->u.type_1); - - b->search_pqf(wrbuf_cstr(w), &hits, &error, &addinfo); - - wrbuf_destroy(w); + pqf_wrbuf = wrbuf_alloc(); + yaz_rpnquery_to_wrbuf(pqf_wrbuf, query->u.type_1); } else if (query->which == Z_Query_type_2) { // CCL - WRBUF w = wrbuf_alloc(); - wrbuf_write(w, (const char *) query->u.type_2->buf, + ccl_wrbuf = wrbuf_alloc(); + wrbuf_write(ccl_wrbuf, (const char *) query->u.type_2->buf, query->u.type_2->len); - int cerror, cpos; - struct ccl_rpn_node *cn; - cn = ccl_find_str(b->sptr->ccl_bibset, wrbuf_cstr(w), &cerror, &cpos); - wrbuf_destroy(w); - - if (!cn) + } + else if (query->which == Z_Query_type_104 && + query->u.type_104->which == Z_External_CQL) + { + // CQL + const char *cql = query->u.type_104->u.cql; + CQL_parser cp = cql_parser_create(); + int r = cql_parser_string(cp, cql); + if (r) { - char *addinfo = odr_strdup(odr, ccl_err_msg(cerror)); + cql_parser_destroy(cp); + apdu_res = + odr.create_searchResponse(apdu_req, + YAZ_BIB1_MALFORMED_QUERY, + "CQL syntax error"); + package.response() = apdu_res; + return; + } + struct cql_node *cn = cql_parser_result(cp); + char ccl_buf[1024]; + r = cql_to_ccl_buf(cn, ccl_buf, sizeof(ccl_buf)); + yaz_log(YLOG_LOG, "cql_to_ccl_buf returned %d", r); + if (r == 0) + { + ccl_wrbuf = wrbuf_alloc(); + wrbuf_puts(ccl_wrbuf, ccl_buf); + } + cql_parser_destroy(cp); + if (r) + { apdu_res = odr.create_searchResponse(apdu_req, YAZ_BIB1_MALFORMED_QUERY, - addinfo); + "CQL to CCL conversion error"); package.response() = apdu_res; return; } - w = wrbuf_alloc(); - ccl_pquery(w, cn); - - b->search_pqf(wrbuf_cstr(w), &hits, &error, &addinfo); - - ccl_rpn_delete(cn); - wrbuf_destroy(w); } else { @@ -733,6 +749,36 @@ void yf::Zoom::Frontend::handle_search(mp::Package &package) package.response() = apdu_res; return; } + + if (ccl_wrbuf) + { + // CCL to PQF + assert(pqf_wrbuf == 0); + int cerror, cpos; + struct ccl_rpn_node *cn; + cn = ccl_find_str(b->sptr->ccl_bibset, wrbuf_cstr(ccl_wrbuf), + &cerror, &cpos); + wrbuf_destroy(ccl_wrbuf); + if (!cn) + { + char *addinfo = odr_strdup(odr, ccl_err_msg(cerror)); + + apdu_res = + odr.create_searchResponse(apdu_req, + YAZ_BIB1_MALFORMED_QUERY, + addinfo); + package.response() = apdu_res; + return; + } + pqf_wrbuf = wrbuf_alloc(); + ccl_pquery(pqf_wrbuf, cn); + ccl_rpn_delete(cn); + } + + assert(pqf_wrbuf); + b->search_pqf(wrbuf_cstr(pqf_wrbuf), &hits, &error, &addinfo); + + wrbuf_destroy(pqf_wrbuf); const char *element_set_name = 0; Odr_int number_to_present = 0;