X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Ffilter_zoom.cpp;h=e8e16816df2314ff0546b9f85afbff117a38ce04;hb=896157cb0f215b54125773b8a98c257c1724239e;hp=900b45e3db0ea24ee6680c1c551ecf0bb80ec767;hpb=fc117fe38417cf8f1907547132d064958e816601;p=metaproxy-moved-to-github.git diff --git a/src/filter_zoom.cpp b/src/filter_zoom.cpp index 900b45e..e8e1681 100644 --- a/src/filter_zoom.cpp +++ b/src/filter_zoom.cpp @@ -322,7 +322,7 @@ void yf::Zoom::Backend::connect(std::string zurl, int *error, char **addinfo, ODR odr) { - ZOOM_connection_connect(m_connection, zurl.c_str(), 0); + ZOOM_connection_connect(m_connection, zurl.length() ? zurl.c_str() : 0, 0); get_zoom_error(error, addinfo, odr); } @@ -368,7 +368,6 @@ yf::Zoom::Searchable::Searchable(CCL_bibset base) piggyback = true; use_turbomarc = true; sortStrategy = "embed"; - urlRecipe = "${md-electronic-url}"; ccl_bibset = ccl_qual_dup(base); } @@ -873,7 +872,10 @@ yf::Zoom::BackendPtr yf::Zoom::Frontend::get_backend_from_databases( std::list::const_iterator map_it; if (m_backend && !m_backend->enable_explain && m_backend->m_frontend_database == database) + { + m_backend->connect("", error, addinfo, odr); return m_backend; + } std::string input_args; std::string torus_db; @@ -1003,7 +1005,7 @@ yf::Zoom::BackendPtr yf::Zoom::Frontend::get_backend_from_databases( if (!doc) { *error = YAZ_BIB1_DATABASE_DOES_NOT_EXIST; - *addinfo = odr_strdup(odr, database.c_str()); + *addinfo = odr_strdup(odr, torus_db.c_str()); BackendPtr b; return b; } @@ -1036,7 +1038,7 @@ yf::Zoom::BackendPtr yf::Zoom::Frontend::get_backend_from_databases( if (!sptr) { *error = YAZ_BIB1_DATABASE_DOES_NOT_EXIST; - *addinfo = odr_strdup(odr, database.c_str()); + *addinfo = odr_strdup(odr, torus_db.c_str()); BackendPtr b; return b; } @@ -1506,9 +1508,30 @@ Z_Records *yf::Zoom::Frontend::get_records(Package &package, } else { + // first stage XSLT - per target xsltStylesheetPtr xsp = b->xsp; xmlDoc *rec_res = xsltApplyStylesheet(xsp, rec_doc, xsl_parms); + // insert generated-url + if (rec_res) + { + std::string res = + mp::xml::url_recipe_handle(rec_res, + b->sptr->urlRecipe); + if (res.length()) + { + xmlNode *ptr = xmlDocGetRootElement(rec_res); + while (ptr && ptr->type != XML_ELEMENT_NODE) + ptr = ptr->next; + xmlNode *c = + xmlNewChild(ptr, 0, BAD_CAST "metadata", 0); + xmlNewProp(c, BAD_CAST "type", BAD_CAST + "generated-url"); + xmlNode * t = xmlNewText(BAD_CAST res.c_str()); + xmlAddChild(c, t); + } + } + // second stage XSLT - common if (rec_res && m_p->record_xsp && enable_record_transform) { @@ -1519,6 +1542,7 @@ Z_Records *yf::Zoom::Frontend::get_records(Package &package, xsl_parms); xmlFreeDoc(tmp_doc); } + // get result out of it if (rec_res) { xsltSaveResultToString(&xmlrec_buf, &rec_len, @@ -1545,37 +1569,6 @@ Z_Records *yf::Zoom::Frontend::get_records(Package &package, } } - if (rec_buf) - { - xmlDoc *doc = xmlParseMemory(rec_buf, rec_len); - std::string res = - mp::xml::url_recipe_handle(doc, b->sptr->urlRecipe); - if (res.length() && *cproxy_host) - { - size_t off = res.find_first_of("://"); - if (off != std::string::npos) - res.insert(off + 3, cproxy_host); - } - if (res.length()) - { - xmlNode *ptr = xmlDocGetRootElement(doc); - while (ptr && ptr->type != XML_ELEMENT_NODE) - ptr = ptr->next; - xmlNode *c = - xmlNewChild(ptr, 0, BAD_CAST "metadata", 0); - xmlNewProp(c, BAD_CAST "type", BAD_CAST - "generated-url"); - xmlNode * t = xmlNewText(BAD_CAST res.c_str()); - xmlAddChild(c, t); - - if (xmlrec_buf) - xmlFree(xmlrec_buf); - - xmlDocDumpMemory(doc, &xmlrec_buf, &rec_len); - rec_buf = (const char *) xmlrec_buf; - } - xmlFreeDoc(doc); - } if (!npr) { if (!rec_buf) @@ -1943,7 +1936,7 @@ next_proxy: wrbuf_destroy(ccl_wrbuf); if (!cn) { - char *addinfo = odr_strdup(odr, ccl_err_msg(cerror)); + char *addinfo = odr_strdup_null(odr, ccl_err_msg(cerror)); error = YAZ_BIB1_MALFORMED_QUERY; switch (cerror)