summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrandomdan <randomdan@localhost>2011-02-16 16:09:32 +0000
committerrandomdan <randomdan@localhost>2011-02-16 16:09:32 +0000
commit3d4eb53e5e462e4a00afaf5eaef05c0175b3ac7f (patch)
treede350f7b05dd7b6ce2e97ee44443452ccfa77b3d
parentTidied up XML loader using boost::multi_index (diff)
downloadproject2-3d4eb53e5e462e4a00afaf5eaef05c0175b3ac7f.tar.bz2
project2-3d4eb53e5e462e4a00afaf5eaef05c0175b3ac7f.tar.xz
project2-3d4eb53e5e462e4a00afaf5eaef05c0175b3ac7f.zip
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
-rw-r--r--project2/cgi/cgiAppEngine.cpp4
-rw-r--r--project2/cgi/cgiEnvironment.cpp4
-rw-r--r--project2/commonObjects.cpp2
-rw-r--r--project2/commonObjects.h8
-rw-r--r--project2/config.cpp8
-rw-r--r--project2/console/consoleAppEngine.cpp12
-rw-r--r--project2/console/consoleEnvironment.cpp30
-rw-r--r--project2/console/consoleEnvironment.h4
-rw-r--r--project2/environment.cpp10
-rw-r--r--project2/environment.h3
-rw-r--r--project2/exceptions.cpp23
-rw-r--r--project2/exceptions.h31
-rw-r--r--project2/fileRows.cpp2
-rw-r--r--project2/fileStrmVarWriter.cpp4
-rw-r--r--project2/iHaveParameters.cpp2
-rw-r--r--project2/if.cpp18
-rw-r--r--project2/if.h3
-rw-r--r--project2/procRows.cpp15
-rw-r--r--project2/rdbmsDataSource.cpp9
-rw-r--r--project2/rowSet.cpp2
-rw-r--r--project2/rowSet.h6
-rw-r--r--project2/session.h3
-rw-r--r--project2/sessionXml.cpp2
-rw-r--r--project2/streamRows.cpp6
-rw-r--r--project2/variables.cpp16
-rw-r--r--project2/xmlObjectLoader.h3
-rw-r--r--project2/xmlRows.cpp4
-rw-r--r--project2/xslRows.cpp23
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<bySOName>().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 <class DataSourceType>
@@ -15,11 +15,11 @@ class CommonObjects : public virtual IntrusivePtrBase {
{
DataSources::index<bySOName>::type::const_iterator i = datasources.get<bySOName>().find(name);
if (i == datasources.get<bySOName>().end()) {
- throw DataSourceNotFound();
+ throw DataSourceNotFound(name);
}
const DataSourceType * s = dynamic_cast<const DataSourceType *>(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 <libxml/xinclude.h>
#include <libxml++/parsers/domparser.h>
-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 <libxml/xinclude.h>
#include <libxml++/parsers/domparser.h>
-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 <stdio.h>
#include <string.h>
#include "../logger.h"
+#include "../exceptions.h"
#include <iostream>
#include <string>
#include <boost/program_options.hpp>
namespace po = boost::program_options;
+template<typename _CharT, typename _Traits>
+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<std::string>(&scriptname)->default_value(scriptname), "Log to syslog with ident <arg>")
+ ("platform,p", po::value<std::string>(&platform), "Platform")
+ ("queryparam,q", po::value<QueryParams>(&queryParams), "Platform")
("file,f", po::value<ToDoList>(&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<boost::filesystem::path> ToDoList;
+ typedef std::map<std::string, const Glib::ustring> 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 <stdlib.h>
+#include <stdio.h>
-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 <stdexcept>
-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<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::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 <stdexcept>
+#include <exception>
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<RdbmsDataSource> {
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<RowSet>::Objects RowSets;
class RowSet : public virtual SourceObject {
public:
typedef boost::function0<VariableType> RowAttribute;
- class ParentOutOfRange : public std::exception { };
- class FieldDoesNotExist : public std::exception { };
+ SimpleNumericException(ParentOutOfRange);
+ SimpleMessageException(AttributeDoesNotExist);
+ SimpleMessageException(FieldDoesNotExist);
+ SimpleNumericException(FieldOutOfRange);
typedef std::vector<const RowSet *> 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 <boost/intrusive_ptr.hpp>
#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<Glib::ustring, VariableType> 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<byColIdx>().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<byColIdx>().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 <boost/bind.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>
-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<Glib::ustring>(new Glib::ustring(src));
@@ -82,7 +83,6 @@ makeVariableType(const Glib::ustring & src, const VT_typeID format = DefaultType
case DateTimePtr:
return boost::shared_ptr<boost::posix_time::ptime>(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 <boost/foreach.hpp>
#include "intrusivePtrBase.h"
#include "sourceObject.h"
+#include "exceptions.h"
#include <boost/multi_index_container.hpp>
#include <boost/multi_index/member.hpp>
#include <boost/multi_index/ordered_index.hpp>
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;