zoom: timeout is configurable
[metaproxy-moved-to-github.git] / src / filter_zoom.cpp
index a79a19c..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();
 
@@ -712,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
@@ -815,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;
@@ -1064,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");
@@ -1597,7 +1613,8 @@ yf::Zoom::BackendPtr yf::Zoom::Frontend::explain_search(mp::Package &package,
     {
         *error = YAZ_BIB1_UNSPECIFIED_ERROR;
         *addinfo =
-            odr_strdup(odr, "IR-Explain---1 unsupported. torus explain_xsl not defined");
+            odr_strdup(odr, "IR-Explain---1 unsupported. "
+                       "Torus explain_xsl not defined");
         return m_backend;
     }
     else if (query->which == Z_Query_type_104 &&
@@ -1618,7 +1635,7 @@ yf::Zoom::BackendPtr yf::Zoom::Frontend::explain_search(mp::Package &package,
         if (!doc)
         {
             *error = YAZ_BIB1_UNSPECIFIED_ERROR;
-            *addinfo = odr_strdup(odr, "IR-Explain--1 problem. " 
+            *addinfo = odr_strdup(odr, "IR-Explain---1 problem. " 
                                   "Could not obtain Torus records for Explain");
         }
         else
@@ -1850,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);