zoom: timeout is configurable
[metaproxy-moved-to-github.git] / src / filter_zoom.cpp
index d7dc442..055cebe 100644 (file)
@@ -207,6 +207,7 @@ namespace metaproxy_1 {
             std::string proxy;
             xsltStylesheetPtr explain_xsp;
             std::map<std::string,SearchablePtr> s_map;
+            std::string zoom_timeout;
         };
     }
 }
@@ -429,7 +430,8 @@ void yf::Zoom::Impl::release_frontend(mp::Package &package)
 }
 
 yf::Zoom::Impl::Impl() :
-    apdu_log(false), element_transform("pz2") , element_raw("raw")
+    apdu_log(false), element_transform("pz2") , element_raw("raw"),
+    zoom_timeout("40")
 {
     bibset = ccl_qual_mk();
 
@@ -545,8 +547,11 @@ yf::Zoom::SearchablePtr yf::Zoom::Impl::parse_torus_record(const xmlNode *ptr)
                           "cclmap_", 7))
         {
             std::string value = mp::xml::get_text(ptr);
-            ccl_qual_fitem(s->ccl_bibset, value.c_str(),
-                           (const char *) ptr->name + 7);
+            if (value.length() > 0)
+            {
+                ccl_qual_fitem(s->ccl_bibset, value.c_str(),
+                               (const char *) ptr->name + 7);
+            }
         }
         else if (!strncmp((const char *) ptr->name,
                           "sortmap_", 8))
@@ -709,6 +714,19 @@ void yf::Zoom::Impl::configure(const xmlNode *ptr, bool test_only,
                                                        attr->name));
             }
         }
+        else if (!strcmp((const char *) ptr->name, "zoom"))
+        {
+            const struct _xmlAttr *attr;
+            for (attr = ptr->properties; attr; attr = attr->next)
+            {
+                if (!strcmp((const char *) attr->name, "timeout"))
+                    zoom_timeout = mp::xml::get_text(attr->children);
+                else
+                    throw mp::filter::FilterException(
+                        "Bad attribute " + std::string((const char *)
+                                                       attr->name));
+            }
+        }
         else
         {
             throw mp::filter::FilterException
@@ -812,7 +830,8 @@ yf::Zoom::BackendPtr yf::Zoom::Frontend::get_backend_from_databases(
     int *proxy_step)
 {
     std::list<BackendPtr>::const_iterator map_it;
-    if (m_backend && m_backend->m_frontend_database == database)
+    if (m_backend && !m_backend->enable_explain && 
+        m_backend->m_frontend_database == database)
         return m_backend;
 
     std::string input_args;
@@ -936,7 +955,7 @@ yf::Zoom::BackendPtr yf::Zoom::Frontend::get_backend_from_databases(
         sptr = it->second;
     else if (torus_url.length() > 0)
     {
-        std::string torus_query = "udb=" + torus_db;
+        std::string torus_query = "udb==" + torus_db;
         xmlDoc *doc = mp::get_searchable(package,torus_url, torus_db,
                                          torus_query,
                                          realm, m_p->proxy);
@@ -1061,7 +1080,7 @@ yf::Zoom::BackendPtr yf::Zoom::Frontend::get_backend_from_databases(
     if (sptr->query_encoding.length())
         b->set_option("rpnCharset", sptr->query_encoding);
 
-    b->set_option("timeout", "40");
+    b->set_option("timeout", m_p->zoom_timeout.c_str());
     
     if (m_p->apdu_log) 
         b->set_option("apdulog", "1");
@@ -1259,21 +1278,26 @@ Z_Records *yf::Zoom::Frontend::get_explain_records(
     npl->records = (Z_NamePlusRecord **)
         odr_malloc(odr, number_to_present * sizeof(*npl->records));
     
-    for (i = start; i < start + number_to_present; i++)
+    for (i = 0; i < number_to_present; i++)
     {
-        const char *rec_buf = "<x/>";
-        int rec_len = strlen(rec_buf);
         int num = 0;
-        xmlNode *res = xml_node_search(ptr, &num, start + i);
+        xmlNode *res = xml_node_search(ptr, &num, start + i + 1);
         if (!res)
             break;
+        xmlBufferPtr xml_buf = xmlBufferCreate();
+        xmlNode *tmp_node = xmlCopyNode(res->children, 1);
+        xmlNodeDump(xml_buf, tmp_node->doc, tmp_node, 0, 0);
 
         Z_NamePlusRecord *npr =
             (Z_NamePlusRecord *) odr_malloc(odr, sizeof(*npr));
         npr->databaseName = odr_strdup(odr, b->m_frontend_database.c_str());
         npr->which = Z_NamePlusRecord_databaseRecord;
         npr->u.databaseRecord =
-            z_ext_record_xml(odr, rec_buf, rec_len);
+            z_ext_record_xml(odr,
+                             (const char *) xml_buf->content, xml_buf->use);
+        npl->records[i] = npr;
+        xmlFreeNode(tmp_node);
+        xmlBufferFree(xml_buf);
     }
     records = (Z_Records*) odr_malloc(odr, sizeof(*records));
     records->which = Z_Records_DBOSD;
@@ -1585,7 +1609,15 @@ yf::Zoom::BackendPtr yf::Zoom::Frontend::explain_search(mp::Package &package,
     Z_SearchRequest *sr = apdu_req->u.searchRequest;
     Z_Query *query = sr->query;
 
-    if (query->which == Z_Query_type_104 &&
+    if (!m_p->explain_xsp)
+    {
+        *error = YAZ_BIB1_UNSPECIFIED_ERROR;
+        *addinfo =
+            odr_strdup(odr, "IR-Explain---1 unsupported. "
+                       "Torus explain_xsl not defined");
+        return m_backend;
+    }
+    else if (query->which == Z_Query_type_104 &&
         query->u.type_104->which == Z_External_CQL)
     {
         std::string torus_url = m_p->torus_searchable_url;
@@ -1603,17 +1635,11 @@ yf::Zoom::BackendPtr yf::Zoom::Frontend::explain_search(mp::Package &package,
         if (!doc)
         {
             *error = YAZ_BIB1_UNSPECIFIED_ERROR;
-            *addinfo = odr_strdup(odr, "Torus XML/Explain problem");
+            *addinfo = odr_strdup(odr, "IR-Explain---1 problem. " 
+                                  "Could not obtain Torus records for Explain");
         }
         else
         {
-#if 1
-            xmlChar *buf_out = 0;
-            int len_out;
-            xmlDocDumpMemory(doc, &buf_out, &len_out);
-            fwrite(buf_out, 1, len_out, yaz_log_file());
-            xmlFree(buf_out);
-#endif
             xmlNode *ptr = xmlDocGetRootElement(doc);
             int hits = 0;
             
@@ -1632,7 +1658,7 @@ yf::Zoom::BackendPtr yf::Zoom::Frontend::explain_search(mp::Package &package,
     else
     {
         *error = YAZ_BIB1_QUERY_TYPE_UNSUPP;
-        *addinfo = odr_strdup(odr, "RPN/CCL, IR-Explain---1");
+        *addinfo = odr_strdup(odr, "IR-Explain---1 only supports CQL");
         return m_backend;
     }
 }
@@ -1841,12 +1867,16 @@ next_proxy:
             switch (cerror)
             {
             case CCL_ERR_UNKNOWN_QUAL:
-                error = YAZ_BIB1_UNSUPP_USE_ATTRIBUTE;
-                break;
             case CCL_ERR_TRUNC_NOT_LEFT: 
             case CCL_ERR_TRUNC_NOT_RIGHT:
             case CCL_ERR_TRUNC_NOT_BOTH:
-                error = YAZ_BIB1_UNSUPP_TRUNCATION_ATTRIBUTE;
+#ifdef CCL_ERR_TRUNC_NOT_EMBED
+            case CCL_ERR_TRUNC_NOT_EMBED:
+#endif
+#ifdef CCL_ERR_TRUNC_NOT_SINGLE
+            case CCL_ERR_TRUNC_NOT_SINGLE:
+#endif
+                error = YAZ_BIB1_UNSUPP_SEARCH;
                 break;
             }
             log_diagnostic(package, error, addinfo);