Merge branch 'zoom_filter'
authorAdam Dickmeiss <adam@indexdata.dk>
Fri, 17 Jun 2011 08:24:19 +0000 (10:24 +0200)
committerAdam Dickmeiss <adam@indexdata.dk>
Fri, 17 Jun 2011 08:24:19 +0000 (10:24 +0200)
src/filter_zoom.cpp

index da0f017..2544189 100644 (file)
@@ -85,7 +85,7 @@ namespace metaproxy_1 {
                          int *error, const char **addinfo);
             void set_option(const char *name, const char *value);
             const char *get_option(const char *name);
-            int get_error(const char **addinfo);
+            void get_zoom_error(int *error, const char **addinfo);
         };
         class Zoom::Frontend : boost::noncopyable {
             friend class Impl;
@@ -173,18 +173,35 @@ yf::Zoom::Backend::~Backend()
     ZOOM_resultset_destroy(m_resultset);
 }
 
+
+void yf::Zoom::Backend::get_zoom_error(int *error, const char **addinfo)
+{
+    const char *msg = 0;
+    *error = ZOOM_connection_error(m_connection, &msg, addinfo);
+    if (*error)
+    {
+        if (*error >= ZOOM_ERROR_CONNECT)
+        {
+            // turn ZOOM diagnostic into a Bib-1 2: with addinfo=zoom err msg
+            *error = YAZ_BIB1_TEMPORARY_SYSTEM_ERROR;
+            if (addinfo)
+                *addinfo = msg;
+        }
+    }
+}
+
 void yf::Zoom::Backend::connect(std::string zurl,
                                 int *error, const char **addinfo)
 {
     ZOOM_connection_connect(m_connection, zurl.c_str(), 0);
-    *error = ZOOM_connection_error(m_connection, 0, addinfo);
+    get_zoom_error(error, addinfo);
 }
 
 void yf::Zoom::Backend::search_pqf(const char *pqf, Odr_int *hits,
                                    int *error, const char **addinfo)
 {
     m_resultset = ZOOM_connection_search_pqf(m_connection, pqf);
-    *error = ZOOM_connection_error(m_connection, 0, addinfo);
+    get_zoom_error(error, addinfo);
     if (*error == 0)
         *hits = ZOOM_resultset_size(m_resultset);
     else
@@ -200,7 +217,7 @@ void yf::Zoom::Backend::search_cql(const char *cql, Odr_int *hits,
 
     m_resultset = ZOOM_connection_search(m_connection, q);
     ZOOM_query_destroy(q);
-    *error = ZOOM_connection_error(m_connection, 0, addinfo);
+    get_zoom_error(error, addinfo);
     if (*error == 0)
         *hits = ZOOM_resultset_size(m_resultset);
     else
@@ -212,7 +229,7 @@ void yf::Zoom::Backend::present(Odr_int start, Odr_int number,
                                 int *error, const char **addinfo)
 {
     ZOOM_resultset_records(m_resultset, recs, start, number);
-    *error = ZOOM_connection_error(m_connection, 0, addinfo);
+    get_zoom_error(error, addinfo);
 }
 
 void yf::Zoom::Backend::set_option(const char *name, const char *value)
@@ -227,11 +244,6 @@ const char *yf::Zoom::Backend::get_option(const char *name)
     return ZOOM_connection_option_get(m_connection, name);
 }
 
-int yf::Zoom::Backend::get_error(const char **addinfo)
-{
-    return ZOOM_connection_error(m_connection, 0, addinfo);
-}
-
 yf::Zoom::Searchable::Searchable()
 {
     piggyback = true;
@@ -482,13 +494,14 @@ yf::Zoom::BackendPtr yf::Zoom::Frontend::get_backend_from_databases(
     if (m_backend && m_backend->m_frontend_database == database)
         return m_backend;
 
-    bool db_args = false;
+    std::string db_args;
+    std::string cf_parm;
     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 = true;
+        db_args = database.substr(db_arg_pos+1);
     }
     else
         torus_db = database;
@@ -543,10 +556,11 @@ yf::Zoom::BackendPtr yf::Zoom::Frontend::get_backend_from_databases(
 
     BackendPtr b(new Backend(sptr));
 
-    std::string cf_parm;
     b->xsp = xsp;
     b->m_frontend_database = database;
     std::string authentication = sptr->authentication;
+        
+    b->set_option("timeout", "40");
 
     if (sptr->query_encoding.length())
         b->set_option("rpnCharset", sptr->query_encoding.c_str());
@@ -592,10 +606,10 @@ yf::Zoom::BackendPtr yf::Zoom::Frontend::get_backend_from_databases(
     {
         url = sptr->target;
     }
-    if (cf_parm.length() && !db_args)
-    {
+    if (db_args.length())
+        url += "," + db_args;
+    else if (cf_parm.length())
         url += "," + cf_parm;
-    }
     yaz_log(YLOG_LOG, "url=%s", url.c_str());
     b->connect(url, error, addinfo);
     if (*error == 0)