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)
1  2 
src/filter_zoom.cpp

diff --combined src/filter_zoom.cpp
@@@ -29,6 -29,7 +29,7 @@@ Foundation, Inc., 51 Franklin St, Fift
  
  #include <boost/thread/mutex.hpp>
  #include <boost/thread/condition.hpp>
+ #include <yaz/ccl_xml.h>
  #include <yaz/ccl.h>
  #include <yaz/rpn2cql.h>
  #include <yaz/pquery.h>
@@@ -84,7 -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;
              std::string torus_url;
              std::map<std::string,std::string> fieldmap;
              std::string xsldir;
+             CCL_bibset bibset;
          };
      }
  }
@@@ -171,35 -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
@@@ -215,7 -200,7 +217,7 @@@ void yf::Zoom::Backend::search_cql(cons
  
      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
@@@ -227,7 -212,7 +229,7 @@@ void yf::Zoom::Backend::present(Odr_in
                                  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)
@@@ -242,6 -227,11 +244,6 @@@ const char *yf::Zoom::Backend::get_opti
      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;
@@@ -310,10 -300,12 +312,12 @@@ void yf::Zoom::Impl::release_frontend(m
  
  yf::Zoom::Impl::Impl()
  {
+     bibset = ccl_qual_mk();
  }
  
  yf::Zoom::Impl::~Impl()
  { 
+     ccl_qual_rm(&bibset);
  }
  
  yf::Zoom::SearchablePtr yf::Zoom::Impl::parse_torus(const xmlNode *ptr1)
@@@ -445,6 -437,11 +449,11 @@@ void yf::Zoom::Impl::configure(const xm
                                                         attr->name));
              }
          }
+         else if (!strcmp((const char *) ptr->name, "cclmap"))
+         {
+             const char *addinfo = 0;
+             ccl_xml_config(bibset, ptr, &addinfo);
+         }
          else if (!strcmp((const char *) ptr->name, "fieldmap"))
          {
              const struct _xmlAttr *attr;
@@@ -485,14 -482,13 +494,14 @@@ yf::Zoom::BackendPtr yf::Zoom::Frontend
      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;
  
      BackendPtr b(new Backend(sptr));
  
      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());
      {
          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)