diff options
author | randomdan <randomdan@localhost> | 2011-02-02 10:49:10 +0000 |
---|---|---|
committer | randomdan <randomdan@localhost> | 2011-02-02 10:49:10 +0000 |
commit | cb20ea40cbd1a6678c5d87795f999215ba53c120 (patch) | |
tree | 7b0fdd4367fd76b462b159caaa106d91cd040923 | |
parent | Add lots of funky stuff to make the system (internally) type safe (diff) | |
download | project2-cb20ea40cbd1a6678c5d87795f999215ba53c120.tar.bz2 project2-cb20ea40cbd1a6678c5d87795f999215ba53c120.tar.xz project2-cb20ea40cbd1a6678c5d87795f999215ba53c120.zip |
Remove compose functions on column data and add a handle function for type safe data passing
Use new handle function to get type safe data from ODBC
Add a datetime option to variables
-rw-r--r-- | project2/Jamfile.jam | 2 | ||||
-rw-r--r-- | project2/dumpTask.cpp | 7 | ||||
-rw-r--r-- | project2/genericVisitor.h | 31 | ||||
-rw-r--r-- | project2/sqlRows.cpp | 30 | ||||
-rw-r--r-- | project2/sqlVariableBinder.cpp | 25 | ||||
-rw-r--r-- | project2/sqlVariableBinder.h | 3 | ||||
-rw-r--r-- | project2/variables.h | 7 |
7 files changed, 88 insertions, 17 deletions
diff --git a/project2/Jamfile.jam b/project2/Jamfile.jam index 0bec35a..e2eaf42 100644 --- a/project2/Jamfile.jam +++ b/project2/Jamfile.jam @@ -13,6 +13,7 @@ lib fcgi++ : : <name>fcgi++ ; lib odbc : : <name>odbc ; lib boost_regex : : <name>boost_regex ; lib boost_filesystem : : <name>boost_filesystem ; +lib boost_date_time : : <name>boost_date_time ; lib cgicc : : <name>cgicc ; lib esmtp : : <name>esmtp ; lib curl : : <name>curl ; @@ -37,6 +38,7 @@ lib p2common : <library>../libmisc//misc <library>libxmlpp <library>boost_filesystem + <library>boost_date_time ; lib p2xml : diff --git a/project2/dumpTask.cpp b/project2/dumpTask.cpp index e424dfc..5dfeba6 100644 --- a/project2/dumpTask.cpp +++ b/project2/dumpTask.cpp @@ -2,6 +2,7 @@ #include "rowSet.h" #include "xmlObjectLoader.h" #include <boost/foreach.hpp> +#include <boost/date_time/posix_time/posix_time.hpp> #include <stdio.h> ElementLoaderImpl<DumpTask> dumptaskLoader("dumptask"); @@ -59,6 +60,12 @@ class Printer : public boost::static_visitor<> { void operator()(const boost::shared_ptr<const Glib::ustring> & i) const { fprintf(stderr, "'%s'", i->c_str()); } + void operator()(const boost::posix_time::ptime & i) const { + fprintf(stderr, "[%s]", boost::posix_time::to_iso_extended_string(i).c_str()); + } + void operator()(const boost::shared_ptr<const boost::posix_time::ptime> & i) const { + fprintf(stderr, "[%s]", boost::posix_time::to_iso_extended_string(*i).c_str()); + } }; void diff --git a/project2/genericVisitor.h b/project2/genericVisitor.h index be9b462..2e66e19 100644 --- a/project2/genericVisitor.h +++ b/project2/genericVisitor.h @@ -4,6 +4,7 @@ #include <boost/lexical_cast.hpp> #include <boost/function.hpp> #include <boost/bind.hpp> +#include <boost/date_time/posix_time/posix_time.hpp> namespace LexicalVisitorHelper { template <typename T, typename S, typename R> @@ -54,28 +55,36 @@ namespace LexicalVisitorHelper { return func(i.c_str()); } }; - template <typename T, typename R> - class lexical_run<T, const T *, R> { + template <typename R> + class lexical_run<Glib::ustring, boost::shared_ptr<const boost::posix_time::ptime>, R> { public: - R operator()(const boost::function1<R, T> & func, const T * i) const + R operator()(const boost::function1<R, Glib::ustring> & func, const boost::shared_ptr<const boost::posix_time::ptime> & i) const { - return func(*i); + return func(boost::posix_time::to_iso_extended_string(*i)); } }; template <typename R> - class lexical_run<const unsigned char *, const Glib::ustring *, R> { + class lexical_run<Glib::ustring, const boost::posix_time::ptime, R> { public: - R operator()(const boost::function1<R, const unsigned char *> & func, const Glib::ustring * i) const + R operator()(const boost::function1<R, Glib::ustring> & func, const boost::posix_time::ptime & i) const { - return func(reinterpret_cast<const unsigned char *>(i->c_str())); + return func(boost::posix_time::to_iso_extended_string(i)); } }; - template <typename R> - class lexical_run<const char *, const Glib::ustring *, R> { + template <typename S, typename R> + class lexical_run<const char *, boost::shared_ptr<const S>, R> { public: - R operator()(const boost::function1<R, const char *> & func, const Glib::ustring * i) const + R operator()(const boost::function1<R, const char *> & func, const boost::shared_ptr<const S> & i) const { - return func(i->c_str()); + return func(boost::lexical_cast<Glib::ustring>(*i).c_str()); + } + }; + template <typename S, typename R> + class lexical_run<const unsigned char *, boost::shared_ptr<const S>, R> { + public: + R operator()(const boost::function1<R, const unsigned char *> & func, const boost::shared_ptr<const S> & i) const + { + return func(reinterpret_cast<const unsigned char *>(boost::lexical_cast<Glib::ustring>(*i).c_str())); } }; template <typename T, typename R> diff --git a/project2/sqlRows.cpp b/project2/sqlRows.cpp index 0017352..d4c6cd8 100644 --- a/project2/sqlRows.cpp +++ b/project2/sqlRows.cpp @@ -9,6 +9,7 @@ #include "xmlObjectLoader.h" #include "commonObjects.h" #include "sqlVariableBinder.h" +#include <boost/date_time/gregorian/gregorian_types.hpp> ElementLoaderImpl<SqlRows> sqlviewLoader("sqlrows"); @@ -41,16 +42,41 @@ SqlRows::setFilter(const Glib::ustring & name) } } +class HandleAsVariableType : public ODBC::HandleField { + public: + void null() { } + void string(const std::vector<char> & c) { + variable = boost::shared_ptr<Glib::ustring>(new Glib::ustring(&c[0], &c[c.size()])); + } + void integer(SQLINTEGER i) { + variable = i; + } + void floatingpoint(SQLDOUBLE d) { + variable = d; + } + void timestamp(const SQL_TIMESTAMP_STRUCT & t) + { + variable = boost::shared_ptr<boost::posix_time::ptime>(new boost::posix_time::ptime( + boost::gregorian::date(t.year, t.month, t.day), + boost::posix_time::time_duration(t.hour, t.minute, t.second, t.fraction))); + } + VariableType variable; +}; + VariableType SqlRows::getCurrentValue(const Glib::ustring & id) const { - return (*query)[id].compose(); + HandleAsVariableType h; + (*query)[id].apply(h); + return h.variable; } VariableType SqlRows::getCurrentValue(unsigned int col) const { - return (*query)[col].compose(); + HandleAsVariableType h; + (*query)[col].apply(h); + return h.variable; } bool diff --git a/project2/sqlVariableBinder.cpp b/project2/sqlVariableBinder.cpp index f1e70da..13912f3 100644 --- a/project2/sqlVariableBinder.cpp +++ b/project2/sqlVariableBinder.cpp @@ -1,5 +1,6 @@ #include "sqlVariableBinder.h" #include "command.h" +#include <boost/date_time/posix_time/posix_time_duration.hpp> OdbcVariableBinder::OdbcVariableBinder(ODBC::Command * c, unsigned int i) : cmd(c), @@ -14,7 +15,8 @@ OdbcVariableBinder::operator()(const Glib::ustring & i) const void OdbcVariableBinder::operator()(const boost::shared_ptr<const Glib::ustring> & i) const { - cmd->bindParamS(idx, *i); + if (!i) return cmd->bindNull(idx); + (*this)(*i); } void OdbcVariableBinder::operator()(const long long unsigned int & i) const @@ -66,5 +68,24 @@ OdbcVariableBinder::operator()(const float & i) const { cmd->bindParamF(idx, i); } - +void +OdbcVariableBinder::operator()(const boost::posix_time::ptime & i) const +{ + SQL_TIMESTAMP_STRUCT t; + boost::gregorian::date::ymd_type ymd(i.date().year_month_day()); + t.year = ymd.year; + t.month = ymd.month; + t.day = ymd.day; + t.hour = i.time_of_day().hours(); + t.minute = i.time_of_day().minutes(); + t.second = i.time_of_day().seconds(); + t.fraction = i.time_of_day().fractional_seconds(); + cmd->bindParamT(idx, t); +} +void +OdbcVariableBinder::operator()(const boost::shared_ptr<const boost::posix_time::ptime> & i) const +{ + if (!i) return cmd->bindNull(idx); + (*this)(*i); +} diff --git a/project2/sqlVariableBinder.h b/project2/sqlVariableBinder.h index ace2028..f175be1 100644 --- a/project2/sqlVariableBinder.h +++ b/project2/sqlVariableBinder.h @@ -3,6 +3,7 @@ #include <boost/variant.hpp> #include <boost/shared_ptr.hpp> +#include <boost/date_time/posix_time/ptime.hpp> #include <glibmm/ustring.h> namespace ODBC { @@ -23,6 +24,8 @@ class OdbcVariableBinder : public boost::static_visitor<> { void operator()(const short int & i) const; void operator()(const double & i) const; void operator()(const float & i) const; + void operator()(const boost::posix_time::ptime & i) const; + void operator()(const boost::shared_ptr<const boost::posix_time::ptime> & i) const; private: ODBC::Command * cmd; diff --git a/project2/variables.h b/project2/variables.h index 469baa5..0b27419 100644 --- a/project2/variables.h +++ b/project2/variables.h @@ -3,6 +3,7 @@ #include <boost/intrusive_ptr.hpp> #include <boost/optional.hpp> +#include <boost/date_time/posix_time/posix_time_types.hpp> #include <stdint.h> #include <glibmm/ustring.h> #include <libxml++/nodes/element.h> @@ -26,8 +27,10 @@ typedef boost::variant< int, short int, double, - float - // DateTimes (todo) + float, + // DateTimes + boost::posix_time::ptime, + boost::shared_ptr<const boost::posix_time::ptime> > VariableType; class VariableImpl : public virtual IntrusivePtrBase { |