From fceb7a7b04de5c91adcd041c87642dc11c1a0fd4 Mon Sep 17 00:00:00 2001 From: randomdan Date: Wed, 16 Feb 2011 16:09:32 +0000 Subject: Make CurlHandle throw an exception on failure Improve error messages almost everywhere Allow setting of platform through the options system Allow specifying query params on the console Fix file stream writer's string support for strings containing multibyte chars --- project2/cgi/cgiAppEngine.cpp | 4 ++-- project2/cgi/cgiEnvironment.cpp | 4 ++-- project2/commonObjects.cpp | 2 +- project2/commonObjects.h | 8 ++++---- project2/config.cpp | 8 ++++---- project2/console/consoleAppEngine.cpp | 12 ++++-------- project2/console/consoleEnvironment.cpp | 30 +++++++++++++++++++++++++++--- project2/console/consoleEnvironment.h | 4 ++++ project2/environment.cpp | 10 ---------- project2/environment.h | 3 --- project2/exceptions.cpp | 23 +++++++++++++++++++++-- project2/exceptions.h | 31 ++++++++++++++++++++++++------- project2/fileRows.cpp | 2 +- project2/fileStrmVarWriter.cpp | 4 ++-- project2/iHaveParameters.cpp | 2 +- project2/if.cpp | 18 +++++++++++++----- project2/if.h | 3 +++ project2/procRows.cpp | 15 +++++++++------ project2/rdbmsDataSource.cpp | 9 +++++---- project2/rowSet.cpp | 2 +- project2/rowSet.h | 6 ++++-- project2/session.h | 3 ++- project2/sessionXml.cpp | 2 +- project2/streamRows.cpp | 6 +++--- project2/variables.cpp | 16 ++++++++-------- project2/xmlObjectLoader.h | 3 ++- project2/xmlRows.cpp | 4 ++-- project2/xslRows.cpp | 23 +++++++++++------------ 28 files changed, 161 insertions(+), 96 deletions(-) diff --git a/project2/cgi/cgiAppEngine.cpp b/project2/cgi/cgiAppEngine.cpp index f3f8d56..b273fda 100644 --- a/project2/cgi/cgiAppEngine.cpp +++ b/project2/cgi/cgiAppEngine.cpp @@ -15,7 +15,7 @@ typedef std::string SValue; SessionContainer * sessionsContainer = new SessionContainerXml(); -class UnknownDomain : public std::exception { }; +SimpleMessageException(UnknownDomain); CgiApplicationEngine::CgiApplicationEngine(const CgiEnvironment * e) : ApplicationEngine("web/host"), @@ -208,7 +208,7 @@ CgiApplicationEngine::resolveCurrentConfig() const if (i != domplat.end()) { return i->second; } - throw UnknownDomain(); + throw UnknownDomain(_env->getServerName()); } void diff --git a/project2/cgi/cgiEnvironment.cpp b/project2/cgi/cgiEnvironment.cpp index aa9e57f..f858262 100644 --- a/project2/cgi/cgiEnvironment.cpp +++ b/project2/cgi/cgiEnvironment.cpp @@ -45,7 +45,7 @@ Glib::ustring CgiEnvironment::getParamUri(unsigned int p) const { if (p >= elems.size()) { - throw UriElementOutOfRange(); + throw UriElementOutOfRange(p); } return elems[p]; } @@ -55,7 +55,7 @@ CgiEnvironment::getParamQuery(const std::string & p) const { cgicc::const_form_iterator i = cgi->getElement(p); if (i == cgi->getElements().end()) { - throw ParamNotFound(); + throw ParamNotFound(p); } return (*cgi)(p); } diff --git a/project2/commonObjects.cpp b/project2/commonObjects.cpp index 6d8fc08..31f81a9 100644 --- a/project2/commonObjects.cpp +++ b/project2/commonObjects.cpp @@ -7,7 +7,7 @@ CommonObjects::getSource(const std::string & name) const if (i != rowSets.get().end()) { return *i; } - throw CommonObjects::DataSourceNotFound(); + throw CommonObjects::DataSourceNotFound(name); } diff --git a/project2/commonObjects.h b/project2/commonObjects.h index 12b1f2b..e3c0d37 100644 --- a/project2/commonObjects.h +++ b/project2/commonObjects.h @@ -6,8 +6,8 @@ class CommonObjects : public virtual IntrusivePtrBase { public: - class DataSourceNotFound : public std::exception { }; - class DataSourceNotCompatible : public std::exception { }; + SimpleMessageException(DataSourceNotFound); + SimpleMessageException(DataSourceNotCompatible); RowSetPtr getSource(const std::string &) const; template @@ -15,11 +15,11 @@ class CommonObjects : public virtual IntrusivePtrBase { { DataSources::index::type::const_iterator i = datasources.get().find(name); if (i == datasources.get().end()) { - throw DataSourceNotFound(); + throw DataSourceNotFound(name); } const DataSourceType * s = dynamic_cast(i->get()); if (!s) { - throw DataSourceNotCompatible(); + throw DataSourceNotCompatible(name); } return s; } diff --git a/project2/config.cpp b/project2/config.cpp index f973c05..c3823ff 100644 --- a/project2/config.cpp +++ b/project2/config.cpp @@ -5,8 +5,8 @@ #include #include -class NoSuchPlatform : public std::exception { }; -class NoSuchConfigurationValue : public std::exception { }; +SimpleMessageException(NoSuchPlatform); +SimpleMessageException(NoSuchConfigurationValue); Configuration::Configuration(const Glib::ustring & ek) : loaded(false), @@ -53,7 +53,7 @@ Configuration::getCurrentConfig() const Glib::ustring platformName(resolveCurrentConfig()); Platforms::const_iterator i = platforms.find(platformName); if (i == platforms.end()) { - throw NoSuchPlatform(); + throw NoSuchPlatform(platformName); } return i->second; } @@ -63,7 +63,7 @@ Configuration::Platform::getValue(const Glib::ustring & key) const { Values::const_iterator i = values.find(key); if (i == values.end()) { - throw NoSuchConfigurationValue(); + throw NoSuchConfigurationValue(key); } return i->second; } diff --git a/project2/console/consoleAppEngine.cpp b/project2/console/consoleAppEngine.cpp index 0d0c71d..be88638 100644 --- a/project2/console/consoleAppEngine.cpp +++ b/project2/console/consoleAppEngine.cpp @@ -5,7 +5,7 @@ #include #include -class UnknownPlatformAlias : public std::exception { }; +SimpleMessageException(UnknownPlatformAlias); class ConsoleSession : public Session { public: @@ -20,7 +20,7 @@ class ConsoleSession : public Session { { Values::const_iterator i = vars.find(name); if (i == vars.end()) { - throw Session::VariableNotFound(); + throw Session::VariableNotFound(name); } return i->second; } @@ -174,15 +174,11 @@ ConsoleApplicationEngine::popSub() const Glib::ustring ConsoleApplicationEngine::resolveCurrentConfig() const { - const char * e = getenv("P2_PLATFORM"); - if (!e) { - e = ""; - } - ConsolePlatforms::const_iterator i = conplat.find(e); + ConsolePlatforms::const_iterator i = conplat.find(_env->getPlatform()); if (i != conplat.end()) { return i->second; } - throw UnknownPlatformAlias(); + throw UnknownPlatformAlias(_env->getPlatform()); } void diff --git a/project2/console/consoleEnvironment.cpp b/project2/console/consoleEnvironment.cpp index 31f9ac9..6b2a753 100644 --- a/project2/console/consoleEnvironment.cpp +++ b/project2/console/consoleEnvironment.cpp @@ -4,12 +4,24 @@ #include #include #include "../logger.h" +#include "../exceptions.h" #include #include #include namespace po = boost::program_options; +template +std::basic_istream<_CharT, _Traits> & +operator>>(std::basic_istream<_CharT, _Traits> & s, ConsoleEnvironment::QueryParams & q) +{ + std::string n, v; + std::getline(s, n, '='); + std::getline(s, v); + q.insert(ConsoleEnvironment::QueryParams::value_type(n, v)); + return s; +} + ConsoleEnvironment::ConsoleEnvironment(int argc, char ** argv) : Environment(argc, argv) { @@ -27,6 +39,8 @@ ConsoleEnvironment::addOptions(boost::program_options::positional_options_descri //("version,v", "Print version and exit") ("help,h", "Print usage and exit") ("syslogident,i", po::value(&scriptname)->default_value(scriptname), "Log to syslog with ident ") + ("platform,p", po::value(&platform), "Platform") + ("queryparam,q", po::value(&queryParams), "Platform") ("file,f", po::value(&todolist), "File to process") ; poptions.add("file", -1); @@ -49,13 +63,23 @@ ConsoleEnvironment::postinit(const boost::program_options::options_description & Glib::ustring ConsoleEnvironment::getParamUri(unsigned int) const { - throw std::runtime_error("Not implemented"); + throw NotSupported(__PRETTY_FUNCTION__); } Glib::ustring -ConsoleEnvironment::getParamQuery(const std::string &) const +ConsoleEnvironment::getParamQuery(const std::string & p) const +{ + QueryParams::const_iterator i = queryParams.find(p); + if (i != queryParams.end()) { + return i->second; + } + throw ParamNotFound(p); +} + +const std::string & +ConsoleEnvironment::getPlatform() const { - throw std::runtime_error("Not implemented"); + return platform; } std::string diff --git a/project2/console/consoleEnvironment.h b/project2/console/consoleEnvironment.h index 23bbd05..82fe11f 100644 --- a/project2/console/consoleEnvironment.h +++ b/project2/console/consoleEnvironment.h @@ -9,6 +9,7 @@ class ConsoleEnvironment : public Environment { public: typedef std::vector ToDoList; + typedef std::map QueryParams; ConsoleEnvironment(int argc, char ** argv); virtual ~ConsoleEnvironment(); @@ -18,12 +19,15 @@ class ConsoleEnvironment : public Environment { Glib::ustring getParamQuery(const std::string & idx) const; std::string getServerName() const; std::string getScriptName() const; + const std::string & getPlatform() const; const ToDoList & todoList() const; private: boost::program_options::options_description addOptions(boost::program_options::positional_options_description &); void postinit(const boost::program_options::options_description &, const boost::program_options::variables_map &); std::string scriptname; + std::string platform; + QueryParams queryParams; ToDoList todolist; }; diff --git a/project2/environment.cpp b/project2/environment.cpp index 5510b1a..46ec6cf 100644 --- a/project2/environment.cpp +++ b/project2/environment.cpp @@ -64,13 +64,3 @@ Environment::~Environment() Logger()->clear(); } -Glib::ustring -Environment::getParamUri(unsigned int) const -{ - throw ParameterTypeNotSupported(); -} -Glib::ustring -Environment::getParamQuery(const std::string &) const -{ - throw ParameterTypeNotSupported(); -} diff --git a/project2/environment.h b/project2/environment.h index 60b5f66..246c525 100644 --- a/project2/environment.h +++ b/project2/environment.h @@ -8,9 +8,6 @@ class Environment { public: - class ParameterTypeNotSupported : public std::exception { }; - - Environment(int argc, char ** argv); virtual ~Environment() = 0; diff --git a/project2/exceptions.cpp b/project2/exceptions.cpp index 9aaeb07..ddf8e94 100644 --- a/project2/exceptions.cpp +++ b/project2/exceptions.cpp @@ -1,7 +1,26 @@ #include "exceptions.h" +#include +#include -NotSupported::NotSupported(const std::string & what) : - std::runtime_error(what) +numeric_error::numeric_error(int e) : + err(e), + buf(NULL) { } +numeric_error::~numeric_error() throw() +{ + free(buf); +} + +const char * +numeric_error::what() const throw() +{ + if (!buf) { + if (asprintf(&buf, "%d", err) < 1) { + throw std::bad_alloc(); + } + } + return buf; +} + diff --git a/project2/exceptions.h b/project2/exceptions.h index d156636..b6c64ae 100644 --- a/project2/exceptions.h +++ b/project2/exceptions.h @@ -3,15 +3,32 @@ #include -class UriElementOutOfRange : public std::exception { }; -class ParamNotFound : public std::exception { }; -class NotSupported : public std::runtime_error { +class numeric_error : public std::exception { public: - NotSupported(const std::string & what); + numeric_error(int); + ~numeric_error() throw(); + const char * what() const throw(); + private: + int err; + mutable char * buf; }; -class FileNotReadable : public std::exception { }; -class FileNotWritable : public std::exception { }; -class FilterNotFound : public std::exception { }; +#define SimpleMessageException(Name) \ +class Name : public std::runtime_error { \ + public: \ + Name(const std::string & what) : std::runtime_error(what) { } \ +} +#define SimpleNumericException(Name) \ +class Name : public numeric_error { \ + public: \ + Name(int e) : numeric_error(e) { } \ +} + +SimpleNumericException(UriElementOutOfRange); +SimpleMessageException(ParamNotFound); +SimpleMessageException(NotSupported); +SimpleMessageException(FileNotReadable); +SimpleMessageException(FileNotWritable); +SimpleMessageException(FilterNotFound); #endif diff --git a/project2/fileRows.cpp b/project2/fileRows.cpp index 950bb39..487c2ef 100644 --- a/project2/fileRows.cpp +++ b/project2/fileRows.cpp @@ -48,7 +48,7 @@ FileRows::doOpen() const { FILE * f = fopen(path(), "r"); if (!f) { - throw FileNotReadable(); + throw FileNotReadable(path()); } return FileStarChannel(f, true, fclose); } diff --git a/project2/fileStrmVarWriter.cpp b/project2/fileStrmVarWriter.cpp index f3812ce..8b5b2ec 100644 --- a/project2/fileStrmVarWriter.cpp +++ b/project2/fileStrmVarWriter.cpp @@ -46,10 +46,10 @@ void FileStreamVariableWriter::operator()(const double & i) const { fprintf(out, "%g", i); } void FileStreamVariableWriter::operator()(const Glib::ustring & i) const { - fprintf(out, "'%.*s'", i.length(), i.c_str()); + fprintf(out, "'%.*s'", i.bytes(), i.c_str()); } void FileStreamVariableWriter::operator()(const boost::shared_ptr & i) const { - fprintf(out, "'%.*s'", i->length(), i->c_str()); + fprintf(out, "'%.*s'", i->bytes(), i->c_str()); } void FileStreamVariableWriter::operator()(const boost::posix_time::ptime & i) const { fprintf(out, "[%s]", boost::posix_time::to_iso_extended_string(i).c_str()); diff --git a/project2/iHaveParameters.cpp b/project2/iHaveParameters.cpp index 84adee5..6431fc6 100644 --- a/project2/iHaveParameters.cpp +++ b/project2/iHaveParameters.cpp @@ -32,6 +32,6 @@ IHaveParameters::getParameter(const Glib::ustring & name) const if (i != parameters.end()) { return i->second->value; } - throw ParamNotFound(); + throw ParamNotFound(name); } diff --git a/project2/if.cpp b/project2/if.cpp index 8fc210d..4531b89 100644 --- a/project2/if.cpp +++ b/project2/if.cpp @@ -4,7 +4,7 @@ DECLARE_LOADER("if", If); -class IfModeIsNonsense : public std::exception { }; +SimpleMessageException(IfModeIsNonsense); IfSet::IfSet(const xmlpp::Element * e) : mode(e->get_attribute_value("mode") == "or" ? Or : And) @@ -33,7 +33,7 @@ IfSet::passes() const } return false; } - throw IfModeIsNonsense(); + throw IfModeIsNonsense(getName()); } If::If(const xmlpp::Element * e) : @@ -44,11 +44,13 @@ If::If(const xmlpp::Element * e) : { } -void If::loadComplete(const CommonObjects*) +void +If::loadComplete(const CommonObjects*) { } -void If::execute(const Presenter * presenter) const +void +If::execute(const Presenter * presenter) const { if (passes()) { Logger()->messagef(LOG_DEBUG, "IfSet passed, showing %zu views", subViews.size()); @@ -58,7 +60,8 @@ void If::execute(const Presenter * presenter) const } } -void If::execute() const +void +If::execute() const { if (passes()) { Logger()->message(LOG_DEBUG, "IfSet passed"); @@ -68,4 +71,9 @@ void If::execute() const } } +const std::string & +If::getName() const +{ + return name; +} diff --git a/project2/if.h b/project2/if.h index 8ce08fb..26aef1a 100644 --- a/project2/if.h +++ b/project2/if.h @@ -11,6 +11,7 @@ class IfSet : public virtual IntrusivePtrBase { bool passes() const; private: + virtual const std::string & getName() const = 0; enum Mode { And, Or }; Mode mode; ParamCheckers checks; @@ -23,6 +24,8 @@ class If : public Iterate, public RowView, public IfSet { virtual void loadComplete(const CommonObjects*); virtual void execute(const Presenter*) const; virtual void execute() const; + private: + const std::string & getName() const; }; #endif diff --git a/project2/procRows.cpp b/project2/procRows.cpp index 11ae35e..54b6d99 100644 --- a/project2/procRows.cpp +++ b/project2/procRows.cpp @@ -1,11 +1,11 @@ #include "procRows.h" #include "xmlObjectLoader.h" -#include +#include DECLARE_LOADER("procrows", ProcRows); -class SubProcessFailedToStart : public std::exception { }; -class SubProcessFailed : public std::exception { }; +SimpleMessageException(SubProcessFailedToStart); +SimpleNumericException(SubProcessFailed); ProcRows::ProcRows(const xmlpp::Element * p) : SourceObject(p), @@ -27,7 +27,7 @@ ProcRows::doOpen() const { FILE * f = popen(path(), "re"); if (!f) { - throw SubProcessFailedToStart(); + throw SubProcessFailedToStart(path()); } return FileStarChannel(f, false, doClose); } @@ -36,8 +36,11 @@ int ProcRows::doClose(FILE * f) { int pclo = pclose(f); - if (pclo != 0) { - throw SubProcessFailed(); + // pclose returns an error if the application is still running, + // but if there is already an exception being thrown, we don't + // want to throw another. + if (pclo != 0 && !std::uncaught_exception()) { + throw SubProcessFailed(pclo); } return 0; } diff --git a/project2/rdbmsDataSource.cpp b/project2/rdbmsDataSource.cpp index ac63042..d7d77d3 100644 --- a/project2/rdbmsDataSource.cpp +++ b/project2/rdbmsDataSource.cpp @@ -16,7 +16,7 @@ static const int PQ_TYPEID = 1; static const int ODBC_TYPEID = 2; #endif -class UnknownConnectionProvider : public std::exception { }; +SimpleMessageException(UnknownConnectionProvider); class RdbmsDataSourceLoader : public ElementLoaderImpl { public: @@ -103,7 +103,7 @@ RdbmsDataSource::getReadonly() const ReadonlyDSNs::const_iterator ro = roDSNs.find(localhost); try { if (ro == roDSNs.end()) { - Logger()->messagef(LOG_WARNING, "%s: No database host matches local host name (%s) Will use master DSN", + Logger()->messagef(LOG_INFO, "%s: No database host matches local host name (%s) Will use master DSN", __PRETTY_FUNCTION__, localhost.c_str()); return *connectTo(masterDsn)->connection; } @@ -219,7 +219,7 @@ RdbmsDataSource::ConnectionInfo::ConnectionInfo(const xmlpp::Element * n) : } #endif if (typeId == NOTSET || dsn.empty()) { - throw UnknownConnectionProvider(); + throw UnknownConnectionProvider(n->get_path()); } } @@ -236,7 +236,8 @@ RdbmsDataSource::ConnectionInfo::connect() const return new PQ::Connection(dsn); } #endif - throw UnknownConnectionProvider(); + // This should never happen if the object was constructed correctly + throw UnknownConnectionProvider(__PRETTY_FUNCTION__); } bool diff --git a/project2/rowSet.cpp b/project2/rowSet.cpp index 2dd4663..1be3547 100644 --- a/project2/rowSet.cpp +++ b/project2/rowSet.cpp @@ -66,6 +66,6 @@ RowSet::resolveAttr(const Glib::ustring & attrName) const if (attrName == "rownum") { return boost::bind(&RowSet::getRowNum, this); } - throw FieldDoesNotExist(); + throw AttributeDoesNotExist(attrName); } diff --git a/project2/rowSet.h b/project2/rowSet.h index bd17412..9a74719 100644 --- a/project2/rowSet.h +++ b/project2/rowSet.h @@ -20,8 +20,10 @@ typedef Storage::Objects RowSets; class RowSet : public virtual SourceObject { public: typedef boost::function0 RowAttribute; - class ParentOutOfRange : public std::exception { }; - class FieldDoesNotExist : public std::exception { }; + SimpleNumericException(ParentOutOfRange); + SimpleMessageException(AttributeDoesNotExist); + SimpleMessageException(FieldDoesNotExist); + SimpleNumericException(FieldOutOfRange); typedef std::vector RowValuesStack; RowSet(const xmlpp::Element *); virtual ~RowSet() = 0; diff --git a/project2/session.h b/project2/session.h index 93b0303..2227b5b 100644 --- a/project2/session.h +++ b/project2/session.h @@ -6,10 +6,11 @@ #include #include "intrusivePtrBase.h" #include "variables.h" +#include "exceptions.h" class Session : public virtual IntrusivePtrBase { public: - class VariableNotFound : public std::exception { }; + SimpleMessageException(VariableNotFound); typedef std::map Values; Session(); diff --git a/project2/sessionXml.cpp b/project2/sessionXml.cpp index 3281a81..41a2f1e 100644 --- a/project2/sessionXml.cpp +++ b/project2/sessionXml.cpp @@ -144,7 +144,7 @@ SessionXml::GetValue(const Glib::ustring & name) const { Values::const_iterator i = vars.find(name); if (i == vars.end()) { - throw Session::VariableNotFound(); + throw Session::VariableNotFound(name); } return i->second; } diff --git a/project2/streamRows.cpp b/project2/streamRows.cpp index 21ea391..d214e01 100644 --- a/project2/streamRows.cpp +++ b/project2/streamRows.cpp @@ -38,7 +38,7 @@ StreamRows::getColumnName(unsigned int col) const if (i != columns.get().end()) { return i->col; } - throw RowSet::FieldDoesNotExist(); + throw RowSet::FieldOutOfRange(col); } unsigned int @@ -54,7 +54,7 @@ StreamRows::getCurrentValue(unsigned int col) const if (i != columns.get().end()) { return i->value; } - throw RowSet::FieldDoesNotExist(); + throw RowSet::FieldOutOfRange(col); } bool @@ -76,7 +76,7 @@ StreamRows::getCurrentValue(const Glib::ustring & col) const if (i != columns.end()) { return i->value; } - throw RowSet::FieldDoesNotExist(); + throw RowSet::FieldDoesNotExist(col); } void diff --git a/project2/variables.cpp b/project2/variables.cpp index 29e6353..5514638 100644 --- a/project2/variables.cpp +++ b/project2/variables.cpp @@ -12,9 +12,9 @@ #include #include -class UnknownVariableType : public std::exception { }; -class UnknownVariableSource : public std::exception { }; -class NoVariableDefinition : public std::exception { }; +SimpleMessageException(UnknownVariableType); +SimpleMessageException(UnknownVariableSource); +SimpleMessageException(NoVariableDefinition); enum VT_typeID { DefaultType, @@ -49,13 +49,14 @@ getVariableTypeFromName(const std::string & src) if (src == "double") return Double; if (src == "datetime") return DateTime; if (src == "datetimeptr") return DateTimePtr; - throw UnknownVariableType(); + throw UnknownVariableType(src); } static VariableType makeVariableType(const Glib::ustring & src, const VT_typeID format = DefaultType) { switch (format) { + default: case DefaultType: case StringPtr: return boost::shared_ptr(new Glib::ustring(src)); @@ -82,7 +83,6 @@ makeVariableType(const Glib::ustring & src, const VT_typeID format = DefaultType case DateTimePtr: return boost::shared_ptr(new boost::posix_time::ptime(boost::posix_time::time_from_string(src))); } - throw UnknownVariableType(); } VariableType::VariableType() : @@ -268,7 +268,7 @@ class VariableParent : public VariableImplDyn, public RowUser { RowSet::RowValuesStack::const_reverse_iterator r = RowSet::Stack().rbegin(); for (size_t p = depth; p--; r++) ; if (r == RowSet::Stack().rend()) { - throw RowSet::ParentOutOfRange(); + throw RowSet::ParentOutOfRange(depth); } row = *r; row->use(this); @@ -377,7 +377,7 @@ Variable::Variable(const xmlpp::Element * e, const Glib::ustring & n, bool requi else if (source == "literal" || source.empty()) var = new VariableLiteral(c->get_attribute_value("value"), getVariableTypeFromName(c->get_attribute_value("type"))); else - throw UnknownVariableSource(); + throw UnknownVariableSource(source); return; } } @@ -385,7 +385,7 @@ Variable::Variable(const xmlpp::Element * e, const Glib::ustring & n, bool requi var = new VariableFixed(def); return; } - throw NoVariableDefinition(); + throw NoVariableDefinition(n); } Variable::Variable(VariableImpl * v) : diff --git a/project2/xmlObjectLoader.h b/project2/xmlObjectLoader.h index 4d0346e..d1209c7 100644 --- a/project2/xmlObjectLoader.h +++ b/project2/xmlObjectLoader.h @@ -9,13 +9,14 @@ #include #include "intrusivePtrBase.h" #include "sourceObject.h" +#include "exceptions.h" #include #include #include Glib::ustring xmlChildText(const xmlpp::Node * p, const Glib::ustring & n); -class StoreFailed : public std::exception { }; +SimpleMessageException(StoreFailed); struct bySOName { }; struct bySOOrder { }; diff --git a/project2/xmlRows.cpp b/project2/xmlRows.cpp index 965b8a3..0056084 100644 --- a/project2/xmlRows.cpp +++ b/project2/xmlRows.cpp @@ -66,7 +66,7 @@ XmlRows::getCurrentValue(const Glib::ustring & id) const { Values::const_iterator i = values.find(id); if (i == values.end()) { - throw FieldDoesNotExist(); + throw FieldDoesNotExist(id); } return i->second; } @@ -76,7 +76,7 @@ XmlRows::getCurrentValue(unsigned int col) const { Values::const_iterator i = values.find(fieldNames[col]); if (i == values.end()) { - throw FieldDoesNotExist(); + throw FieldDoesNotExist(""); } return i->second; } diff --git a/project2/xslRows.cpp b/project2/xslRows.cpp index 537a459..1a7d6f4 100644 --- a/project2/xslRows.cpp +++ b/project2/xslRows.cpp @@ -1,5 +1,6 @@ #include "xslRows.h" #include "rowProcessor.h" +#include "logger.h" #include "xml.h" #include "exceptions.h" #include "xmlObjectLoader.h" @@ -11,10 +12,9 @@ DECLARE_LOADER("xslrows", XslRows); -class XmlParseError : public std::exception { }; -class XpathInitError : public std::exception { }; -class XpathEvalError : public std::exception { }; -class ResourceDownloadError : public std::exception { }; +SimpleMessageException(XmlParseError); +SimpleMessageException(XpathInitError); +SimpleMessageException(XpathEvalError); XslRows::XslRows(const xmlpp::Element * p) : SourceObject(p), @@ -52,7 +52,7 @@ XslRows::setFilter(const Glib::ustring & f) { FilterViews::const_iterator i = fvs.find(f); if (i == fvs.end()) { - throw FilterNotFound(); + throw FilterNotFound(f); } fv = i->second; } @@ -78,9 +78,7 @@ XslRows::getDocument(const Glib::ustring & url) const std::string buf; c->setopt(CURLOPT_WRITEDATA, &buf); c->setopt(CURLOPT_WRITEFUNCTION, &handleDataHelper); - if (c->perform()) { - throw ResourceDownloadError(); - } + c->perform(); int flags = 0; flags |= warnings ? 0 : XML_PARSE_NOWARNING | XML_PARSE_NOERROR; @@ -88,7 +86,7 @@ XslRows::getDocument(const Glib::ustring & url) const htmlReadMemory(buf.c_str(), buf.length(), url.c_str(), NULL, flags) : xmlReadMemory(buf.c_str(), buf.length(), url.c_str(), NULL, flags); if (!doc) { - throw XmlParseError(); + throw XmlParseError(xmlGetLastError()->message); } documents.insert(Documents::value_type(url, Documents::value_type::second_type(doc, xmlFreeDoc))); return doc; @@ -106,16 +104,17 @@ XslRows::execute(const RowProcessor * rp) const xmlDocPtr doc = getDocument(url()); xmlXPathContextSPtr xpathCtx = xmlXPathContextSPtr(xmlXPathNewContext(doc), xmlXPathFreeContext); if (!xpathCtx) { - throw XpathInitError(); + throw XpathInitError(xmlGetLastError()->message); } BOOST_FOREACH(const Namespaces::value_type & ns, namespaces) { xmlXPathRegisterNs(xpathCtx.get(), BAD_CAST ns.first.c_str(), BAD_CAST ns.second.c_str()); } xmlXPathObjectSPtr xpathObj = xmlXPathObjectSPtr(xmlXPathEvalExpression(fv->root(), xpathCtx.get()), xmlXPathFreeObject); if (!xpathObj || !xpathObj->nodesetval) { - throw XpathEvalError(); + throw XpathEvalError(xmlGetLastError()->message); } rowNum = 1; + Logger()->messagef(LOG_INFO, "%d nodes matched %s", xpathObj->nodesetval->nodeNr, (const char *)(fv->root())); for (int row = 0; row < xpathObj->nodesetval->nodeNr; row += 1) { xmlNodePtr rowRoot = xpathObj->nodesetval->nodeTab[row]; xpathCtx->node = rowRoot; @@ -123,7 +122,7 @@ XslRows::execute(const RowProcessor * rp) const BOOST_FOREACH(const FilterView::XPaths::value_type & xp, fv->xpaths) { xmlXPathObjectSPtr xpathObjI = xmlXPathObjectSPtr(xmlXPathEvalExpression(xp.second(), xpathCtx.get()), xmlXPathFreeObject); if (!xpathObjI) { - throw XpathEvalError(); + throw XpathEvalError(xmlGetLastError()->message); } if (xpathObjI->floatval) { values[xp.first] = xpathObjI->floatval; -- cgit v1.2.3