From dc9c35de058417698d2286b51bf30eaf74de629d Mon Sep 17 00:00:00 2001 From: Dan Goodliffe Date: Sat, 15 Jul 2017 12:24:35 +0100 Subject: Add support for binding a winder variety of types to SQL commands --- icetray/icetray/abstractDatabaseClient.cpp | 20 ++++++++++++++++++++ icetray/icetray/abstractDatabaseClient.h | 16 ++++++++++++++++ icetray/unittests/testIceTrayServiceI.cpp | 21 +++++++++++++++++++++ 3 files changed, 57 insertions(+) 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 namespace IceTray { AbstractDatabaseClient::AbstractDatabaseClient(DatabasePoolPtr d) : @@ -18,6 +19,17 @@ namespace IceTray { template<> \ void \ AbstractDatabaseClient::bind1(int o, DB::Command * cmd, const IceUtil::Optional & p) \ + { \ + if (p) { \ + cmd->bindFunc(o, *p); \ + } \ + else { \ + cmd->bindNull(o); \ + } \ + } \ + template<> \ + void \ + AbstractDatabaseClient::bind1(int o, DB::Command * cmd, const boost::optional & p) \ { \ if (p) { \ cmd->bindFunc(o, *p); \ @@ -31,9 +43,17 @@ namespace IceTray { 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 static void bind1(int offset, DB::Command * cmd, const Param & p); +#define BIND1OPTIONAL(T) \ + template \ + static void bind1(int offset, DB::Command * cmd, const T & 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 #include +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(sql::testIceTrayServiceTestSql, 1, true); fetch(sql::testIceTrayServiceTestSql, 1, 0.1f); fetch(sql::testIceTrayServiceTestSql, 100000, 3.14); + // BLOB + Ice::ByteSeq blob; + fetch(sql::testIceTrayServiceTestSql, blob, blob.size()); + // Test we can bind optionals and nulls + fetch, IceUtil::Optional> + (sql::testIceTrayServiceTestSql, boost::optional(10), IceUtil::Optional()); + fetch(sql::testIceTrayServiceTestSql, 10, nullptr); + // Test we can extend to bind other things + Foo foo; + fetch(sql::testIceTrayServiceTestSql, Foo(), foo); } void TestIceTrayServiceI::method2(Ice::Int id, const std::string & name, const Ice::Current &) -- cgit v1.2.3