X-Git-Url: http://sru.miketaylor.org.uk/?a=blobdiff_plain;f=src%2Ffilter_zoom.cpp;h=3fd7e04081654c4996e1e119870914c29d34a0c9;hb=371a02c325fb4d7cdfc24a81c38e36077382e648;hp=b73588166f05a51c893c6dbcc4104b1d9c107015;hpb=757801de550ddcf90d0a7ff2c5fcdac299fd3d8d;p=metaproxy-moved-to-github.git diff --git a/src/filter_zoom.cpp b/src/filter_zoom.cpp index b735881..3fd7e04 100644 --- a/src/filter_zoom.cpp +++ b/src/filter_zoom.cpp @@ -59,11 +59,12 @@ namespace metaproxy_1 { std::string authentication; std::string cfAuth; std::string cfProxy; - std::string cfSubDb; + std::string cfSubDB; std::string udb; 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; @@ -113,7 +114,8 @@ namespace metaproxy_1 { void handle_package(mp::Package &package); void handle_search(mp::Package &package); void handle_present(mp::Package &package); - BackendPtr get_backend_from_databases(std::string &database, + BackendPtr get_backend_from_databases(const mp::Package &package, + std::string &database, int *error, char **addinfo, ODR odr); @@ -156,6 +158,7 @@ namespace metaproxy_1 { boost::mutex m_mutex; boost::condition m_cond_session_ready; std::string torus_url; + std::string default_realm; std::map fieldmap; std::string xsldir; std::string file_path; @@ -402,9 +405,9 @@ yf::Zoom::SearchablePtr yf::Zoom::Impl::parse_torus_record(const xmlNode *ptr) s->cfProxy = mp::xml::get_text(ptr); } else if (!strcmp((const char *) ptr->name, - "cfSubDb")) + "cfSubDB")) { - s->cfSubDb = mp::xml::get_text(ptr); + s->cfSubDB = mp::xml::get_text(ptr); } else if (!strcmp((const char *) ptr->name, "contentConnector")) @@ -423,6 +426,10 @@ yf::Zoom::SearchablePtr yf::Zoom::Impl::parse_torus_record(const xmlNode *ptr) { 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")) { @@ -557,6 +564,8 @@ void yf::Zoom::Impl::configure(const xmlNode *ptr, bool test_only, { if (!strcmp((const char *) attr->name, "url")) torus_url = mp::xml::get_text(attr->children); + else if (!strcmp((const char *) attr->name, "realm")) + default_realm = mp::xml::get_text(attr->children); else if (!strcmp((const char *) attr->name, "xsldir")) xsldir = mp::xml::get_text(attr->children); else if (!strcmp((const char *) attr->name, "element_transform")) @@ -635,23 +644,85 @@ void yf::Zoom::Impl::configure(const xmlNode *ptr, bool test_only, } yf::Zoom::BackendPtr yf::Zoom::Frontend::get_backend_from_databases( + const mp::Package &package, std::string &database, int *error, char **addinfo, ODR odr) { std::list::const_iterator map_it; if (m_backend && m_backend->m_frontend_database == database) return m_backend; - std::string db_args; + std::string input_args; std::string torus_db; size_t db_arg_pos = database.find(','); if (db_arg_pos != std::string::npos) { torus_db = database.substr(0, db_arg_pos); - db_args = database.substr(db_arg_pos + 1); + input_args = database.substr(db_arg_pos + 1); } else torus_db = database; - + + std::string authentication; + std::string proxy; + std::string realm = m_p->default_realm; + + const char *param_user = 0; + const char *param_password = 0; + int no_parms = 0; + + char **names; + char **values; + int no_out_args = 0; + if (input_args.length()) + no_parms = yaz_uri_to_array(input_args.c_str(), + odr, &names, &values); + // adding 10 because we'll be adding other URL args + const char **out_names = (const char **) + odr_malloc(odr, (10 + no_parms) * sizeof(*out_names)); + const char **out_values = (const char **) + odr_malloc(odr, (10 + no_parms) * sizeof(*out_values)); + + int i; + for (i = 0; i < no_parms; i++) + { + const char *name = names[i]; + const char *value = values[i]; + assert(name); + assert(value); + if (!strcmp(name, "user")) + param_user = value; + else if (!strcmp(name, "password")) + param_password = value; + else if (!strcmp(name, "proxy")) + proxy = value; + else if (!strcmp(name, "cproxysession")) + { + out_names[no_out_args] = name; + out_values[no_out_args++] = value; + } + else if (!strcmp(name, "realm")) + realm = value; + else if (name[0] == 'x' && name[1] == '-') + { + out_names[no_out_args] = name; + out_values[no_out_args++] = value; + } + else + { + BackendPtr notfound; + char *msg = (char*) odr_malloc(odr, strlen(name) + 30); + *error = YAZ_BIB1_TEMPORARY_SYSTEM_ERROR; + sprintf(msg, "Bad database argument: %s", name); + *addinfo = msg; + return notfound; + } + } + if (param_user) + { + authentication = std::string(param_user); + if (param_password) + authentication += "/" + std::string(param_password); + } SearchablePtr sptr; std::map::iterator it; @@ -660,7 +731,8 @@ yf::Zoom::BackendPtr yf::Zoom::Frontend::get_backend_from_databases( sptr = it->second; else if (m_p->torus_url.length() > 0) { - xmlDoc *doc = mp::get_searchable(m_p->torus_url, torus_db, m_p->proxy); + xmlDoc *doc = mp::get_searchable(m_p->torus_url, torus_db, realm, + m_p->proxy); if (!doc) { *error = YAZ_BIB1_DATABASE_DOES_NOT_EXIST; @@ -790,90 +862,49 @@ yf::Zoom::BackendPtr yf::Zoom::Frontend::get_backend_from_databases( maximumRecords > 0 */ b->set_option("piggyback", sptr->piggyback ? "1" : "0"); - std::string authentication = sptr->authentication; - std::string proxy = sptr->cfProxy; - - const char *param_user = 0; - const char *param_password = 0; - const char *param_proxy = 0; - if (db_args.length()) - { - char **names; - char **values; - int i; - int no_parms = yaz_uri_to_array(db_args.c_str(), - odr, &names, &values); - for (i = 0; i < no_parms; i++) - { - const char *name = names[i]; - const char *value = values[i]; - if (!strcmp(name, "user")) - param_user = value; - else if (!strcmp(name, "password")) - param_password = value; - else if (!strcmp(name, "proxy")) - param_proxy = value; - else if (!strcmp(name, "cproxysession")) - ; - else - { - BackendPtr notfound; - char *msg = (char*) odr_malloc(odr, strlen(name) + 30); - *error = YAZ_BIB1_TEMPORARY_SYSTEM_ERROR; - sprintf(msg, "Bad database argument: %s", name); - *addinfo = msg; - return notfound; - } - } - if (param_user) - { - authentication = std::string(param_user); - if (param_password) - authentication += "/" + std::string(param_password); - } - if (param_proxy) - proxy = param_proxy; - } + if (authentication.length() == 0) + authentication = sptr->authentication; + if (proxy.length() == 0) + proxy = sptr->cfProxy; + if (sptr->cfAuth.length()) { // A CF target b->set_option("user", sptr->cfAuth); - if (!param_user && !param_password && authentication.length()) + if (authentication.length()) { - if (db_args.length()) - db_args += "&"; - // no database (auth) args specified already.. and the - // Torus authentication has it.. Generate the args that CF - // understands.. size_t found = authentication.find('/'); if (found != std::string::npos) { - db_args += "user=" + - mp::util::uri_encode(authentication.substr(0, found)) - + "&password=" + - mp::util::uri_encode(authentication.substr(found+1)); + out_names[no_out_args] = "user"; + out_values[no_out_args++] = + odr_strdup(odr, authentication.substr(0, found).c_str()); + + out_names[no_out_args] = "password"; + out_values[no_out_args++] = + odr_strdup(odr, authentication.substr(found+1).c_str()); } else - db_args += "user=" + mp::util::uri_encode(authentication); + { + out_names[no_out_args] = "user"; + out_values[no_out_args++] = + odr_strdup(odr, authentication.c_str()); + } } - if (!param_proxy && proxy.length()) + if (proxy.length()) { - if (db_args.length()) - db_args += "&"; - db_args += "proxy=" + mp::util::uri_encode(proxy); + out_names[no_out_args] = "proxy"; + out_values[no_out_args++] = odr_strdup(odr, proxy.c_str()); } - if (sptr->cfSubDb.length()) + if (sptr->cfSubDB.length()) { - if (db_args.length()) - db_args += "&"; - db_args += "subdatabase=" + mp::util::uri_encode(sptr->cfSubDb); + out_names[no_out_args] = "subdatabase"; + out_values[no_out_args++] = odr_strdup(odr, sptr->cfSubDB.c_str()); } } else { - db_args.clear(); // no arguments to be passed (non-CF) - size_t found = authentication.find('/'); if (sptr->sru.length() && found != std::string::npos) @@ -904,7 +935,7 @@ yf::Zoom::BackendPtr yf::Zoom::Frontend::get_backend_from_databases( FILE *file = fopen(fname, "w"); if (!file) { - yaz_log(YLOG_WARN|YLOG_ERRNO, "create %s", fname); + package.log("zoom", YLOG_WARN|YLOG_ERRNO, "create %s", fname); *error = YAZ_BIB1_TEMPORARY_SYSTEM_ERROR; *addinfo = (char *) odr_malloc(odr, 40 + strlen(fname)); sprintf(*addinfo, "Could not create %s", fname); @@ -925,7 +956,7 @@ yf::Zoom::BackendPtr yf::Zoom::Frontend::get_backend_from_databases( fwrite(wrbuf_buf(w), 1, wrbuf_len(w), file); fclose(file); - yaz_log(YLOG_LOG, "file %s created\n", fname); + package.log("zoom", YLOG_LOG, "file %s created\n", fname); xfree(fname); } @@ -934,14 +965,24 @@ yf::Zoom::BackendPtr yf::Zoom::Frontend::get_backend_from_databases( { url = "http://" + sptr->target; b->set_option("sru", sptr->sru); + + if (sptr->sru_version.length()) + b->set_option("sru_version", sptr->sru_version); } else { url = sptr->target; } - if (db_args.length()) - url += "," + db_args; - yaz_log(YLOG_LOG, "url=%s", url.c_str()); + if (no_out_args) + { + char *x_args = 0; + out_names[no_out_args] = 0; // terminate list + + yaz_array_to_uri(&x_args, odr, (char **) out_names, + (char **) out_values); + url += "," + std::string(x_args); + } + package.log("zoom", YLOG_LOG, "url=%s", url.c_str()); b->connect(url, error, addinfo, odr); if (*error == 0) { @@ -1278,7 +1319,8 @@ void yf::Zoom::Frontend::handle_search(mp::Package &package) int error = 0; char *addinfo = 0; std::string db(sr->databaseNames[0]); - BackendPtr b = get_backend_from_databases(db, &error, &addinfo, odr); + BackendPtr b = get_backend_from_databases(package, db, &error, + &addinfo, odr); if (error) { apdu_res = @@ -1424,7 +1466,7 @@ void yf::Zoom::Frontend::handle_search(mp::Package &package) assert(pqf_wrbuf == 0); int cerror, cpos; struct ccl_rpn_node *cn; - yaz_log(YLOG_LOG, "CCL: %s", wrbuf_cstr(ccl_wrbuf)); + package.log("zoom", YLOG_LOG, "CCL: %s", wrbuf_cstr(ccl_wrbuf)); cn = ccl_find_str(b->sptr->ccl_bibset, wrbuf_cstr(ccl_wrbuf), &cerror, &cpos); wrbuf_destroy(ccl_wrbuf); @@ -1451,7 +1493,7 @@ void yf::Zoom::Frontend::handle_search(mp::Package &package) } pqf_wrbuf = wrbuf_alloc(); ccl_pquery(pqf_wrbuf, cn); - yaz_log(YLOG_LOG, "RPN: %s", wrbuf_cstr(pqf_wrbuf)); + package.log("zoom", YLOG_LOG, "RPN: %s", wrbuf_cstr(pqf_wrbuf)); ccl_rpn_delete(cn); } @@ -1486,7 +1528,7 @@ void yf::Zoom::Frontend::handle_search(mp::Package &package) if (status == 0) { ZOOM_query_cql(q, wrbuf_cstr(wrb)); - yaz_log(YLOG_LOG, "CQL: %s", wrbuf_cstr(wrb)); + package.log("zoom", YLOG_LOG, "CQL: %s", wrbuf_cstr(wrb)); b->search(q, &hits, &error, &addinfo, odr); } ZOOM_query_destroy(q); @@ -1505,7 +1547,7 @@ void yf::Zoom::Frontend::handle_search(mp::Package &package) else { ZOOM_query_prefix(q, wrbuf_cstr(pqf_wrbuf)); - yaz_log(YLOG_LOG, "search PQF: %s", wrbuf_cstr(pqf_wrbuf)); + package.log("zoom", YLOG_LOG, "search PQF: %s", wrbuf_cstr(pqf_wrbuf)); b->search(q, &hits, &error, &addinfo, odr); ZOOM_query_destroy(q); wrbuf_destroy(pqf_wrbuf);