summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libdbpp/column.h11
-rw-r--r--libdbpp/unittests/testUtils.cpp16
-rw-r--r--libdbpp/unittests/util.sql1
3 files changed, 28 insertions, 0 deletions
diff --git a/libdbpp/column.h b/libdbpp/column.h
index 37f3b88..43d2687 100644
--- a/libdbpp/column.h
+++ b/libdbpp/column.h
@@ -4,6 +4,7 @@
#include <glibmm/ustring.h>
#include <boost/date_time/posix_time/posix_time_types.hpp>
#include <boost/shared_ptr.hpp>
+#include <boost/optional.hpp>
#include <visibility.h>
namespace DB {
@@ -53,6 +54,16 @@ namespace DB {
void operator>>(boost::posix_time::time_duration &) const;
/// STL like date time extractor.
void operator>>(boost::posix_time::ptime &) const;
+ template <typename T>
+ void operator>>(boost::optional<T> & v) const {
+ if (!isNull()) {
+ v = T();
+ operator>>(v.get());
+ }
+ else {
+ v = boost::none;
+ }
+ }
/// This column's ordinal.
const unsigned int colNo;
diff --git a/libdbpp/unittests/testUtils.cpp b/libdbpp/unittests/testUtils.cpp
index e43faae..b7947c7 100644
--- a/libdbpp/unittests/testUtils.cpp
+++ b/libdbpp/unittests/testUtils.cpp
@@ -33,6 +33,22 @@ BOOST_AUTO_TEST_CASE( forEachRow )
});
}
+BOOST_AUTO_TEST_CASE( forEachRowNulls )
+{
+ auto db = DB::ConnectionPtr(DB::MockDatabase::openConnectionTo("pqmock"));
+ auto sel = DB::SelectCommandPtr(db->newSelectCommand("SELECT a, b, c, d, e, f FROM forEachRow ORDER BY a DESC LIMIT 1"));
+ sel->forEachRow<int64_t, boost::optional<double>, std::string, boost::optional<boost::posix_time::ptime>, boost::optional<boost::posix_time::time_duration>, bool>(
+ [](auto a, auto b, auto c, auto d, auto e, auto f) {
+ BOOST_REQUIRE_EQUAL(2, a);
+ BOOST_REQUIRE(b);
+ BOOST_REQUIRE_EQUAL(2.3, *b);
+ BOOST_REQUIRE_EQUAL("Some text", c);
+ BOOST_REQUIRE(!d);
+ BOOST_REQUIRE(!e);
+ BOOST_REQUIRE_EQUAL(false, f);
+ });
+}
+
BOOST_AUTO_TEST_CASE( execute )
{
auto db = DB::ConnectionPtr(DB::MockDatabase::openConnectionTo("pqmock"));
diff --git a/libdbpp/unittests/util.sql b/libdbpp/unittests/util.sql
index fe98fc9..04c6bf6 100644
--- a/libdbpp/unittests/util.sql
+++ b/libdbpp/unittests/util.sql
@@ -6,4 +6,5 @@ CREATE TABLE foreachrow (
e interval,
f boolean);
INSERT INTO foreachrow(a, b, c, d, e, f) VALUES(1, 2.3, 'Some text', '2015-11-07 13:39:17', '04:03:02', true);
+INSERT INTO foreachrow(a, b, c, f) VALUES(2, 2.3, 'Some text', false);