cql_rpn: use path for cql2rpn file MP-481
[metaproxy-moved-to-github.git] / src / filter_cql_to_rpn.cpp
index c1a7057..322eb46 100644 (file)
@@ -1,5 +1,5 @@
 /* This file is part of Metaproxy.
-   Copyright (C) 2005-2010 Index Data
+   Copyright (C) 2005-2013 Index Data
 
 Metaproxy is free software; you can redistribute it and/or modify it under
 the terms of the GNU General Public License as published by the Free
@@ -30,7 +30,7 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 #include <yaz/zgdu.h>
 #include <yaz/diagbib1.h>
 #include <yaz/srw.h>
-
+#include <yaz/tpath.h>
 
 namespace mp = metaproxy_1;
 namespace yf = metaproxy_1::filter;
@@ -42,7 +42,7 @@ namespace metaproxy_1 {
             Impl();
             ~Impl();
             void process(metaproxy_1::Package & package);
-            void configure(const xmlNode * ptr);
+            void configure(const xmlNode *ptr, const char *path);
         private:
             yazpp_1::Yaz_cql2rpn m_cql2rpn;
         };
@@ -51,7 +51,7 @@ namespace metaproxy_1 {
 
 
 // define Pimpl wrapper forwarding to Impl
+
 yf::CQLtoRPN::CQLtoRPN() : m_p(new Impl)
 {
 }
@@ -60,9 +60,10 @@ yf::CQLtoRPN::~CQLtoRPN()
 {  // must have a destructor because of boost::scoped_ptr
 }
 
-void yf::CQLtoRPN::configure(const xmlNode *xmlnode, bool test_only)
+void yf::CQLtoRPN::configure(const xmlNode *xmlnode, bool test_only,
+                             const char *path)
 {
-    m_p->configure(xmlnode);
+    m_p->configure(xmlnode, path);
 }
 
 void yf::CQLtoRPN::process(mp::Package &package) const
@@ -78,10 +79,10 @@ yf::CQLtoRPN::Impl::Impl()
 }
 
 yf::CQLtoRPN::Impl::~Impl()
-{ 
+{
 }
 
-void yf::CQLtoRPN::Impl::configure(const xmlNode *xmlnode)
+void yf::CQLtoRPN::Impl::configure(const xmlNode *xmlnode, const char *path)
 {
 
     /*
@@ -89,7 +90,7 @@ void yf::CQLtoRPN::Impl::configure(const xmlNode *xmlnode)
       <conversion file="pqf.properties"/>
       </filter>
     */
-    
+
     std::string fname;
     for (xmlnode = xmlnode->children; xmlnode; xmlnode = xmlnode->next)
     {
@@ -110,7 +111,7 @@ void yf::CQLtoRPN::Impl::configure(const xmlNode *xmlnode)
         }
         else
         {
-            throw mp::filter::FilterException("Bad element " 
+            throw mp::filter::FilterException("Bad element "
                                                + std::string((const char *)
                                                              xmlnode->name));
         }
@@ -121,8 +122,14 @@ void yf::CQLtoRPN::Impl::configure(const xmlNode *xmlnode)
                                           "for filter cql_rpn");
     }
 
+
+    char fullpath[1024];
+    if (!yaz_filepath_resolve(fname.c_str(), path, 0, fullpath))
+    {
+        throw mp::filter::FilterException("Could not open " + fname);
+    }
     int error = 0;
-    if (!m_cql2rpn.parse_spec_file(fname.c_str(), &error))
+    if (!m_cql2rpn.parse_spec_file(fullpath, &error))
     {
         throw mp::filter::FilterException("Bad or missing "
                                           "CQL to RPN configuration "
@@ -145,17 +152,17 @@ void yf::CQLtoRPN::Impl::process(mp::Package &package)
             char *addinfo = 0;
             Z_RPNQuery *rpnquery = 0;
             mp::odr odr;
-            
+
             int r = m_cql2rpn.query_transform(sr->query->u.type_104->u.cql,
                                                  &rpnquery, odr,
                                                  &addinfo);
             if (r == -3)
             {
-                Z_APDU *f_apdu = 
+                Z_APDU *f_apdu =
                     odr.create_searchResponse(
-                        apdu_req, 
-                        YAZ_BIB1_TEMPORARY_SYSTEM_ERROR,
-                        "Missing CQL to RPN configuration");
+                        apdu_req,
+                        YAZ_BIB1_PERMANENT_SYSTEM_ERROR,
+                        "cql_rpn: missing CQL to RPN configuration");
                 package.response() = f_apdu;
                 return;
             }
@@ -163,14 +170,14 @@ void yf::CQLtoRPN::Impl::process(mp::Package &package)
             {
                 int error_code = yaz_diag_srw_to_bib1(r);
 
-                Z_APDU *f_apdu = 
+                Z_APDU *f_apdu =
                     odr.create_searchResponse(apdu_req, error_code, addinfo);
                 package.response() = f_apdu;
                 return;
             }
             else
             {   // conversion OK
-                
+
                 sr->query->which = Z_Query_type_1;
                 sr->query->u.type_1 = rpnquery;
                 package.request() = gdu;
@@ -187,7 +194,7 @@ static mp::filter::Base* filter_creator()
 }
 
 extern "C" {
-    struct metaproxy_1_filter_struct metaproxy_1_filter_cql_to_rpn = {
+    struct metaproxy_1_filter_struct metaproxy_1_filter_cql_rpn = {
         0,
         "cql_rpn",
         filter_creator