diff options
author | Dan Goodliffe <dan@randomdan.homeip.net> | 2017-07-15 12:24:35 +0100 |
---|---|---|
committer | Dan Goodliffe <dan@randomdan.homeip.net> | 2017-07-15 12:24:35 +0100 |
commit | dc9c35de058417698d2286b51bf30eaf74de629d (patch) | |
tree | ab049b2ecb5e0f4501b71708c9f4466f870fc397 | |
parent | Remove the need for non-inline options classes to be explicitly regisitered (diff) | |
download | icetray-dc9c35de058417698d2286b51bf30eaf74de629d.tar.bz2 icetray-dc9c35de058417698d2286b51bf30eaf74de629d.tar.xz icetray-dc9c35de058417698d2286b51bf30eaf74de629d.zip |
Add support for binding a winder variety of types to SQL commands
-rw-r--r-- | icetray/icetray/abstractDatabaseClient.cpp | 20 | ||||
-rw-r--r-- | icetray/icetray/abstractDatabaseClient.h | 16 | ||||
-rw-r--r-- | icetray/unittests/testIceTrayServiceI.cpp | 21 |
3 files changed, 57 insertions, 0 deletions
diff --git a/icetray/icetray/abstractDatabaseClient.cpp b/icetray/icetray/abstractDatabaseClient.cpp index e18045b..8bac22f 100644 --- a/icetray/icetray/abstractDatabaseClient.cpp +++ b/icetray/icetray/abstractDatabaseClient.cpp @@ -1,6 +1,7 @@ #include "abstractDatabaseClient.h" #include "Ice/Config.h" #include "IceUtil/Optional.h" +#include <Ice/BuiltinSequences.h> namespace IceTray { AbstractDatabaseClient::AbstractDatabaseClient(DatabasePoolPtr d) : @@ -25,15 +26,34 @@ namespace IceTray { else { \ cmd->bindNull(o); \ } \ + } \ + template<> \ + void \ + AbstractDatabaseClient::bind1(int o, DB::Command * cmd, const boost::optional<T> & p) \ + { \ + if (p) { \ + cmd->bindFunc(o, *p); \ + } \ + else { \ + cmd->bindNull(o); \ + } \ } PARAMBINDER(std::string, bindParamS); PARAMBINDER(Ice::Byte, bindParamI); PARAMBINDER(Ice::Short, bindParamI); PARAMBINDER(Ice::Int, bindParamI); PARAMBINDER(Ice::Long, bindParamI); + PARAMBINDER(unsigned long, bindParamI); PARAMBINDER(Ice::Float, bindParamF); PARAMBINDER(Ice::Double, bindParamF); PARAMBINDER(bool, bindParamB); + PARAMBINDER(Ice::ByteSeq, bindParamBLOB); + template<> + void + AbstractDatabaseClient::bind1(int o, DB::Command * cmd, const std::nullptr_t &) \ + { + cmd->bindNull(o); + } void AbstractDatabaseClient::bind(int, DB::Command *) diff --git a/icetray/icetray/abstractDatabaseClient.h b/icetray/icetray/abstractDatabaseClient.h index 3242553..3178ed4 100644 --- a/icetray/icetray/abstractDatabaseClient.h +++ b/icetray/icetray/abstractDatabaseClient.h @@ -43,6 +43,22 @@ namespace IceTray { template<typename Param> static void bind1(int offset, DB::Command * cmd, const Param & p); +#define BIND1OPTIONAL(T) \ + template<typename Param> \ + static void bind1(int offset, DB::Command * cmd, const T<Param> & p) \ + { \ + if (p) { \ + bind1(offset, cmd, *p); \ + } \ + else { \ + cmd->bindNull(offset); \ + } \ + } + + BIND1OPTIONAL(IceUtil::Optional); + BIND1OPTIONAL(boost::optional); +#undef BIND1OPTIONAL + DatabasePoolPtr db; }; } diff --git a/icetray/unittests/testIceTrayServiceI.cpp b/icetray/unittests/testIceTrayServiceI.cpp index 6bea477..73cf3a9 100644 --- a/icetray/unittests/testIceTrayServiceI.cpp +++ b/icetray/unittests/testIceTrayServiceI.cpp @@ -7,6 +7,17 @@ #include <subdir/some.sql.h> #include <subdir/a/more.sql.h> +class Foo { }; + +namespace IceTray { + template<> + void + AbstractDatabaseClient::bind1(int o, DB::Command * cmd, const Foo &) \ + { + cmd->bindNull(o); + } +} + namespace TestIceTray { TestIceTrayServiceI::TestIceTrayServiceI(IceTray::DatabasePoolPtr d) : IceTray::AbstractCachingDatabaseClient(d) @@ -21,6 +32,16 @@ namespace TestIceTray { fetch<int, Ice::Byte, bool>(sql::testIceTrayServiceTestSql, 1, true); fetch<int, Ice::Short, Ice::Float>(sql::testIceTrayServiceTestSql, 1, 0.1f); fetch<int, Ice::Long, Ice::Double>(sql::testIceTrayServiceTestSql, 100000, 3.14); + // BLOB + Ice::ByteSeq blob; + fetch<int>(sql::testIceTrayServiceTestSql, blob, blob.size()); + // Test we can bind optionals and nulls + fetch<int, boost::optional<Ice::Byte>, IceUtil::Optional<bool>> + (sql::testIceTrayServiceTestSql, boost::optional<Ice::Byte>(10), IceUtil::Optional<bool>()); + fetch<int>(sql::testIceTrayServiceTestSql, 10, nullptr); + // Test we can extend to bind other things + Foo foo; + fetch<int>(sql::testIceTrayServiceTestSql, Foo(), foo); } void TestIceTrayServiceI::method2(Ice::Int id, const std::string & name, const Ice::Current &) |