summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--icetray/icetray/abstractDatabaseClient.cpp20
-rw-r--r--icetray/icetray/abstractDatabaseClient.h16
-rw-r--r--icetray/unittests/testIceTrayServiceI.cpp21
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 &)