summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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;