X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=src%2Ffilter_cql_to_rpn.cpp;h=225ee824c061fa41bfe20e83bab22947c7ef05d1;hb=908c8147d8bcef7ed9c84e0c6720a56dd22e6e86;hp=fccf623888106439d8be7481bb187c46f4dad46a;hpb=5d0b9069a3a9909c29e663f967ef032e62daac73;p=metaproxy-moved-to-github.git diff --git a/src/filter_cql_to_rpn.cpp b/src/filter_cql_to_rpn.cpp index fccf623..225ee82 100644 --- a/src/filter_cql_to_rpn.cpp +++ b/src/filter_cql_to_rpn.cpp @@ -1,66 +1,137 @@ -/* $Id: filter_cql_to_rpn.cpp,v 1.2 2007-01-12 10:17:23 adam Exp $ - Copyright (c) 2005-2006, Index Data. +/* This file is part of Metaproxy. + Copyright (C) 2005-2012 Index Data - See the LICENSE file for details - */ +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 +Software Foundation; either version 2, or (at your option) any later +version. -#include "config.hpp" +Metaproxy is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +*/ -#include "filter.hpp" -#include "package.hpp" +#include "config.hpp" +#include -#include -#include -#include -#include -#include -#include +#include +#include -#include "util.hpp" #include "filter_cql_to_rpn.hpp" -#include +#include #include +#include #include -#include #include #include -#include -#include -#include -#include -#include + namespace mp = metaproxy_1; namespace yf = metaproxy_1::filter; namespace metaproxy_1 { namespace filter { - class CQL_to_RPN::Rep { - friend class CQL_to_RPN; - - Rep(); - - yazpp_1::Yaz_cql2rpn cql2rpn; + class CQLtoRPN::Impl { + public: + Impl(); + ~Impl(); + void process(metaproxy_1::Package & package); + void configure(const xmlNode * ptr); + private: + yazpp_1::Yaz_cql2rpn m_cql2rpn; }; } } -yf::CQL_to_RPN::Rep::Rep() + +// define Pimpl wrapper forwarding to Impl + +yf::CQLtoRPN::CQLtoRPN() : m_p(new Impl) { +} + +yf::CQLtoRPN::~CQLtoRPN() +{ // must have a destructor because of boost::scoped_ptr +} +void yf::CQLtoRPN::configure(const xmlNode *xmlnode, bool test_only, + const char *path) +{ + m_p->configure(xmlnode); } -yf::CQL_to_RPN::CQL_to_RPN() : m_p(new CQL_to_RPN::Rep) +void yf::CQLtoRPN::process(mp::Package &package) const { + m_p->process(package); } -yf::CQL_to_RPN::~CQL_to_RPN() + +// define Implementation stuff + +yf::CQLtoRPN::Impl::Impl() { +} +yf::CQLtoRPN::Impl::~Impl() +{ } -void yf::CQL_to_RPN::process(mp::Package &package) const +void yf::CQLtoRPN::Impl::configure(const xmlNode *xmlnode) +{ + + /* + + + + */ + + std::string fname; + for (xmlnode = xmlnode->children; xmlnode; xmlnode = xmlnode->next) + { + if (xmlnode->type != XML_ELEMENT_NODE) + continue; + if (!strcmp((const char *) xmlnode->name, "conversion")) + { + const struct _xmlAttr *attr; + for (attr = xmlnode->properties; attr; attr = attr->next) + { + if (!strcmp((const char *) attr->name, "file")) + fname = mp::xml::get_text(attr); + else + throw mp::filter::FilterException( + "Bad attribute " + std::string((const char *) + attr->name)); + } + } + else + { + throw mp::filter::FilterException("Bad element " + + std::string((const char *) + xmlnode->name)); + } + } + if (fname.length() == 0) + { + throw mp::filter::FilterException("Missing conversion configuration " + "for filter cql_rpn"); + } + + int error = 0; + if (!m_cql2rpn.parse_spec_file(fname.c_str(), &error)) + { + throw mp::filter::FilterException("Bad or missing " + "CQL to RPN configuration " + + fname); + } +} + +void yf::CQLtoRPN::Impl::process(mp::Package &package) { Z_GDU *gdu = package.request().get(); @@ -76,17 +147,16 @@ void yf::CQL_to_RPN::process(mp::Package &package) const Z_RPNQuery *rpnquery = 0; mp::odr odr; - int r = m_p->cql2rpn.query_transform(sr->query->u.type_104->u.cql, + int r = m_cql2rpn.query_transform(sr->query->u.type_104->u.cql, &rpnquery, odr, &addinfo); if (r == -3) { - yaz_log(YLOG_LOG, "No CQL to RPN table"); Z_APDU *f_apdu = odr.create_searchResponse( apdu_req, YAZ_BIB1_TEMPORARY_SYSTEM_ERROR, - "Missing CQL to RPN spec"); + "Missing CQL to RPN configuration"); package.response() = f_apdu; return; } @@ -94,7 +164,6 @@ void yf::CQL_to_RPN::process(mp::Package &package) const { int error_code = yaz_diag_srw_to_bib1(r); - yaz_log(YLOG_LOG, "CQL Conversion error %d", r); Z_APDU *f_apdu = odr.create_searchResponse(apdu_req, error_code, addinfo); package.response() = f_apdu; @@ -112,63 +181,16 @@ void yf::CQL_to_RPN::process(mp::Package &package) const package.move(); } -void yf::CQL_to_RPN::configure(const xmlNode *ptr) -{ - - /* - - - - */ - - std::string fname; - for (ptr = ptr->children; ptr; ptr = ptr->next) - { - if (ptr->type != XML_ELEMENT_NODE) - continue; - if (!strcmp((const char *) ptr->name, "conversion")) - { - const struct _xmlAttr *attr; - for (attr = ptr->properties; attr; attr = attr->next) - { - if (!strcmp((const char *) attr->name, "file")) - fname = mp::xml::get_text(attr); - else - throw mp::filter::FilterException( - "Bad attribute " + std::string((const char *) - attr->name)); - } - } - else - { - throw mp::filter::FilterException("Bad element " - + std::string((const char *) - ptr->name)); - } - } - if (fname.length() == 0) - { - throw mp::filter::FilterException("Missing conversion spec for " - "filter cql_to_rpn"); - } - - int error = 0; - if (!m_p->cql2rpn.parse_spec_file(fname.c_str(), &error)) - { - throw mp::filter::FilterException("Bad or missing CQL to RPN spec " - + fname); - } -} static mp::filter::Base* filter_creator() { - return new mp::filter::CQL_to_RPN; + return new mp::filter::CQLtoRPN; } extern "C" { struct metaproxy_1_filter_struct metaproxy_1_filter_cql_to_rpn = { 0, - "cql_to_rpn", + "cql_rpn", filter_creator }; } @@ -176,8 +198,9 @@ extern "C" { /* * Local variables: * c-basic-offset: 4 + * c-file-style: "Stroustrup" * indent-tabs-mode: nil - * c-file-style: "stroustrup" * End: * vim: shiftwidth=4 tabstop=8 expandtab */ +