From 90dc1626476692be324c28b8607c64b628de278f Mon Sep 17 00:00:00 2001 From: Dan Goodliffe Date: Sun, 6 Dec 2015 23:29:54 +0000 Subject: Handle selecting nulls/optionals etc --- slicer/db/sqlSelectDeserializer.cpp | 12 ++++++++--- slicer/db/testSelect.cpp | 42 +++++++++++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+), 3 deletions(-) diff --git a/slicer/db/sqlSelectDeserializer.cpp b/slicer/db/sqlSelectDeserializer.cpp index 5c46e11..a7dd575 100644 --- a/slicer/db/sqlSelectDeserializer.cpp +++ b/slicer/db/sqlSelectDeserializer.cpp @@ -40,12 +40,15 @@ namespace Slicer { void SqlSelectDeserializer::DeserializeSimple(Slicer::ModelPartPtr mp) { - auto fmp = mp->GetAnonChild(); if (!cmd.fetch()) { - throw NoRowsReturned(); + if (!mp->IsOptional()) { + throw NoRowsReturned(); + } + return; } SqlSourcePtr h = new SqlSource(cmd[0]); if (!h->isNull()) { + auto fmp = mp->GetAnonChild(); fmp->Create(); fmp->SetValue(h); fmp->Complete(); @@ -68,7 +71,10 @@ namespace Slicer { SqlSelectDeserializer::DeserializeObject(Slicer::ModelPartPtr mp) { if (!cmd.fetch()) { - throw NoRowsReturned(); + if (!mp->IsOptional()) { + throw NoRowsReturned(); + } + return; } DeserializeRow(mp); if (cmd.fetch()) { diff --git a/slicer/db/testSelect.cpp b/slicer/db/testSelect.cpp index fdcb358..cd20170 100644 --- a/slicer/db/testSelect.cpp +++ b/slicer/db/testSelect.cpp @@ -175,6 +175,44 @@ BOOST_AUTO_TEST_CASE( select_noRowsSimple ) BOOST_REQUIRE_THROW(BoostThrowWrapperHelper(*sel), Slicer::NoRowsReturned); } +BOOST_AUTO_TEST_CASE( select_noRowsSimpleOptional ) +{ + auto db = DBPtr(DB::MockDatabase::openConnectionTo("pqmock")); + auto sel = SelectPtr(db->newSelectCommand("SELECT id FROM test WHERE false")); + auto v = Slicer::DeserializeAny>(*sel); + BOOST_REQUIRE(!v); +} + +BOOST_AUTO_TEST_CASE( select_tooManyRowsSimpleOptional ) +{ + auto db = DBPtr(DB::MockDatabase::openConnectionTo("pqmock")); + auto sel = SelectPtr(db->newSelectCommand("SELECT id FROM test")); + BOOST_REQUIRE_THROW(BoostThrowWrapperHelper>(*sel), Slicer::TooManyRowsReturned); +} + +BOOST_AUTO_TEST_CASE( select_simpleOptional ) +{ + auto db = DBPtr(DB::MockDatabase::openConnectionTo("pqmock")); + auto sel = SelectPtr(db->newSelectCommand("SELECT MAX(id) FROM test")); + auto v = Slicer::DeserializeAny>(*sel); + BOOST_REQUIRE(v); + BOOST_REQUIRE_EQUAL(4, *v); +} + +BOOST_AUTO_TEST_CASE( select_noRowsComplexOptional ) +{ + auto db = DBPtr(DB::MockDatabase::openConnectionTo("pqmock")); + auto sel = SelectPtr(db->newSelectCommand( + "SELECT boolean mbool, \ + id mbyte, id mshort, id mint, id mlong, \ + fl mdouble, fl mfloat, \ + string mstring \ + FROM test \ + WHERE false")); + auto v = Slicer::DeserializeAny>(*sel); + BOOST_REQUIRE(!v); +} + BOOST_AUTO_TEST_CASE( select_tooManyRowsComplex ) { auto db = DBPtr(DB::MockDatabase::openConnectionTo("pqmock")); @@ -210,5 +248,9 @@ BOOST_AUTO_TEST_CASE( select_null ) oi = Slicer::DeserializeAny(*sel); BOOST_REQUIRE(oi->optSimple); BOOST_REQUIRE_EQUAL(oi->optSimple.get(), 4); + + sel = SelectPtr(db->newSelectCommand("SELECT MAX(id) FROM test WHERE false")); + auto v = Slicer::DeserializeAny>(*sel); + BOOST_REQUIRE(!v); } -- cgit v1.2.3