diff options
-rw-r--r-- | project2/console/consoleEnvironment.cpp | 24 | ||||
-rw-r--r-- | project2/console/consoleEnvironment.h | 4 | ||||
-rw-r--r-- | project2/environment.cpp | 8 | ||||
-rw-r--r-- | project2/fileStrmVarWriter.cpp | 3 | ||||
-rw-r--r-- | project2/fileStrmVarWriter.h | 1 | ||||
-rw-r--r-- | project2/rdbmsDataSource.cpp | 2 | ||||
-rw-r--r-- | project2/sqlRows.cpp | 4 | ||||
-rw-r--r-- | project2/sqlVariableBinder.cpp | 8 | ||||
-rw-r--r-- | project2/sqlVariableBinder.h | 2 | ||||
-rw-r--r-- | project2/variableConvert.cpp | 18 | ||||
-rw-r--r-- | project2/variables.h | 2 |
11 files changed, 57 insertions, 19 deletions
diff --git a/project2/console/consoleEnvironment.cpp b/project2/console/consoleEnvironment.cpp index 6b2a753..f2d4667 100644 --- a/project2/console/consoleEnvironment.cpp +++ b/project2/console/consoleEnvironment.cpp @@ -7,18 +7,18 @@ #include "../exceptions.h" #include <iostream> #include <string> +#include <boost/algorithm/string/predicate.hpp> #include <boost/program_options.hpp> +#include <boost/bind.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) +operator>>(std::basic_istream<_CharT, _Traits> & s, ConsoleEnvironment::QueryParams::value_type & q) { - std::string n, v; - std::getline(s, n, '='); - std::getline(s, v); - q.insert(ConsoleEnvironment::QueryParams::value_type(n, v)); + std::getline(s, q.first, '='); + std::getline(s, q.second); return s; } @@ -40,7 +40,8 @@ ConsoleEnvironment::addOptions(boost::program_options::positional_options_descri ("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") + ("queryparam,q", po::value<QueryParams>(&queryParams), "Query parameter") + ("uriparam,u", po::value<UriParams>(&uriParams), "URL paramater") ("file,f", po::value<ToDoList>(&todolist), "File to process") ; poptions.add("file", -1); @@ -61,15 +62,20 @@ ConsoleEnvironment::postinit(const boost::program_options::options_description & } Glib::ustring -ConsoleEnvironment::getParamUri(unsigned int) const +ConsoleEnvironment::getParamUri(unsigned int idx) const { - throw NotSupported(__PRETTY_FUNCTION__); + if (idx < uriParams.size()) { + return uriParams[idx]; + } + throw UriElementOutOfRange(idx); } Glib::ustring ConsoleEnvironment::getParamQuery(const std::string & p) const { - QueryParams::const_iterator i = queryParams.find(p); + QueryParams::const_iterator i = std::find_if(queryParams.begin(), queryParams.end(), + boost::bind(&boost::algorithm::equals<std::string, std::string>, p, + boost::bind(&ConsoleEnvironment::QueryParams::value_type::first, _1))); if (i != queryParams.end()) { return i->second; } diff --git a/project2/console/consoleEnvironment.h b/project2/console/consoleEnvironment.h index 82fe11f..c72eed5 100644 --- a/project2/console/consoleEnvironment.h +++ b/project2/console/consoleEnvironment.h @@ -9,7 +9,8 @@ class ConsoleEnvironment : public Environment { public: typedef std::vector<boost::filesystem::path> ToDoList; - typedef std::map<std::string, const Glib::ustring> QueryParams; + typedef std::vector<std::string> UriParams; + typedef std::vector<std::pair<std::string, std::string> > QueryParams; ConsoleEnvironment(int argc, char ** argv); virtual ~ConsoleEnvironment(); @@ -28,6 +29,7 @@ class ConsoleEnvironment : public Environment { std::string scriptname; std::string platform; QueryParams queryParams; + UriParams uriParams; ToDoList todolist; }; diff --git a/project2/environment.cpp b/project2/environment.cpp index 46ec6cf..d9e2687 100644 --- a/project2/environment.cpp +++ b/project2/environment.cpp @@ -39,13 +39,7 @@ Environment::init() // Allow anything in release, but valid the config file in debug // Some options only work in debug and you wouldn't want extra // config entries to break an install - po::store(po::parse_config_file(f, all, -#if NDEBUG - true -#else - false -#endif - ), settings); + po::store(po::parse_config_file(f, all, true), settings); } po::notify(settings); diff --git a/project2/fileStrmVarWriter.cpp b/project2/fileStrmVarWriter.cpp index 8b5b2ec..f2c8d7f 100644 --- a/project2/fileStrmVarWriter.cpp +++ b/project2/fileStrmVarWriter.cpp @@ -15,6 +15,9 @@ FileStreamVariableWriter::~FileStreamVariableWriter() { } +void FileStreamVariableWriter::operator()(const Null &) const { + fprintf(out, "<null>"); +} void FileStreamVariableWriter::operator()(const long long int & i) const { fprintf(out, "%lld", i); } diff --git a/project2/fileStrmVarWriter.h b/project2/fileStrmVarWriter.h index ecd65b6..6b0a258 100644 --- a/project2/fileStrmVarWriter.h +++ b/project2/fileStrmVarWriter.h @@ -8,6 +8,7 @@ class FileStreamVariableWriter : public boost::static_visitor<> { FileStreamVariableWriter(FILE *, bool quoting); ~FileStreamVariableWriter(); + void operator()(const Null &) const; void operator()(const long long int & i) const; void operator()(const long int & i) const; void operator()(const int & i) const; diff --git a/project2/rdbmsDataSource.cpp b/project2/rdbmsDataSource.cpp index d7d77d3..8a095c7 100644 --- a/project2/rdbmsDataSource.cpp +++ b/project2/rdbmsDataSource.cpp @@ -129,6 +129,7 @@ RdbmsDataSource::commit() DBHosts::const_iterator m = dbhosts.find(masterDsn); if (m != dbhosts.end() && m->second->connection->inTx()) { m->second->connection->commitTx(); + m->second->connection->finish(); } } @@ -138,6 +139,7 @@ RdbmsDataSource::rollback() DBHosts::const_iterator m = dbhosts.find(masterDsn); if (m != dbhosts.end() && m->second->connection->inTx()) { m->second->connection->rollbackTx(); + m->second->connection->finish(); } changedDSNs.erase(name); } diff --git a/project2/sqlRows.cpp b/project2/sqlRows.cpp index bb94034..d33a09f 100644 --- a/project2/sqlRows.cpp +++ b/project2/sqlRows.cpp @@ -45,7 +45,9 @@ SqlRows::setFilter(const Glib::ustring & name) class HandleAsVariableType : public DB::HandleField { public: - void null() { } + void null() { + variable = Null(); + } void string(const char * c, size_t l) { variable = boost::shared_ptr<Glib::ustring>(new Glib::ustring(c, c + l)); } diff --git a/project2/sqlVariableBinder.cpp b/project2/sqlVariableBinder.cpp index 22cf34a..02528d3 100644 --- a/project2/sqlVariableBinder.cpp +++ b/project2/sqlVariableBinder.cpp @@ -1,5 +1,6 @@ #include "sqlVariableBinder.h" #include "command.h" +#include "variables.h" #include <boost/date_time/posix_time/conversion.hpp> SqlVariableBinder::SqlVariableBinder(DB::Command * c, unsigned int i) : @@ -8,6 +9,11 @@ SqlVariableBinder::SqlVariableBinder(DB::Command * c, unsigned int i) : { } void +SqlVariableBinder::operator()(const Null &) const +{ + cmd->bindNull(idx); +} +void SqlVariableBinder::operator()(const Glib::ustring & i) const { cmd->bindParamS(idx, i); @@ -16,7 +22,7 @@ void SqlVariableBinder::operator()(const boost::shared_ptr<const Glib::ustring> & i) const { if (!i) return cmd->bindNull(idx); - (*this)(*i); + cmd->bindParamS(idx, *i); } void SqlVariableBinder::operator()(const long long unsigned int & i) const diff --git a/project2/sqlVariableBinder.h b/project2/sqlVariableBinder.h index 2839e34..42a4567 100644 --- a/project2/sqlVariableBinder.h +++ b/project2/sqlVariableBinder.h @@ -9,9 +9,11 @@ namespace DB { class Command; } +class Null; class SqlVariableBinder : public boost::static_visitor<> { public: SqlVariableBinder(DB::Command * c, unsigned int i); + void operator()(const Null & i) const; void operator()(const Glib::ustring & i) const; void operator()(const boost::shared_ptr<const Glib::ustring> & i) const; void operator()(const long long unsigned int & i) const; diff --git a/project2/variableConvert.cpp b/project2/variableConvert.cpp index a084639..1ac2253 100644 --- a/project2/variableConvert.cpp +++ b/project2/variableConvert.cpp @@ -25,6 +25,12 @@ set(const VariableType * var, const T * t) return set(var, t, deleter<T>); } +class NullVariable : std::runtime_error { + public: + NullVariable() : std::runtime_error("Variable has null value where one is required") { + } +}; + // Convert to Glib::ustring class ConvertVisitorGlibUstring : public boost::static_visitor<const Glib::ustring &> { public: @@ -42,6 +48,9 @@ class ConvertVisitorGlibUstring : public boost::static_visitor<const Glib::ustri const Glib::ustring & operator()(const boost::shared_ptr<const boost::posix_time::ptime> & r) const { return *set(var, new Glib::ustring(boost::posix_time::to_iso_extended_string(*r))); } + const Glib::ustring & operator()(const Null &) const { + throw NullVariable(); + } template <typename T> const Glib::ustring & operator()(const T & r) const { return *set(var, new Glib::ustring(boost::lexical_cast<Glib::ustring>(r))); @@ -66,6 +75,9 @@ class ConvertVisitorStdString : public boost::static_visitor<const std::string & const std::string & operator()(const boost::shared_ptr<const boost::posix_time::ptime> & r) const { return *set(var, new std::string(boost::posix_time::to_iso_extended_string(*r))); } + const std::string & operator()(const Null &) const { + throw NullVariable(); + } template <typename T> const std::string & operator()(const T & r) const { return *set(var, new std::string(boost::lexical_cast<std::string>(r))); @@ -90,6 +102,9 @@ class ConvertVisitorCharStar : public boost::static_visitor<const char *> { const char * operator()(const boost::shared_ptr<const boost::posix_time::ptime> & r) const { return set(var, new std::string(boost::posix_time::to_iso_extended_string(*r)))->c_str(); } + const char * operator()(const Null &) const { + return set<char>(var, NULL, NULL); + } template <typename T> const char * operator()(const T & r) const { return set(var, new std::string(boost::lexical_cast<std::string>(r)))->c_str(); @@ -116,6 +131,9 @@ class ConvertVisitorUCharStar : public boost::static_visitor<const unsigned char return reinterpret_cast<const unsigned char *>( set(var, new std::string(boost::posix_time::to_iso_extended_string(*r)))->c_str()); } + const unsigned char * operator()(const Null &) const { + return set<unsigned char>(var, NULL, NULL); + } template <typename T> const unsigned char * operator()(const T & r) const { return set(var, new std::basic_string<unsigned char>(boost::lexical_cast<std::basic_string<unsigned char> >(r)))->c_str(); diff --git a/project2/variables.h b/project2/variables.h index 7303e5a..ecb8268 100644 --- a/project2/variables.h +++ b/project2/variables.h @@ -13,7 +13,9 @@ #include <boost/shared_ptr.hpp> class RowUser; +class Null { }; typedef boost::variant< + Null, // Strings Glib::ustring, boost::shared_ptr<const Glib::ustring>, |