Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 7 additions & 4 deletions src/Lightweight/DataBinder/SqlVariant.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,13 @@ SQLRETURN SqlDataBinder<SqlVariant>::InputParameter(SQLHSTMT stmt,
SqlVariant const& variantValue,
SqlDataBinderCallback& cb) noexcept
{
return std::visit(detail::overloaded { [&]<typename T>(T const& value) {
return SqlDataBinder<T>::InputParameter(stmt, column, value, cb);
} },
variantValue.value);
if (variantValue.IsNull())
return SqlDataBinder<SqlNullType>::InputParameter(stmt, column, SqlNullValue, cb);
else
return std::visit(detail::overloaded { [&]<typename T>(T const& value) {
return SqlDataBinder<T>::InputParameter(stmt, column, value, cb);
} },
variantValue.value);
}

SQLRETURN SqlDataBinder<SqlVariant>::GetColumn(
Expand Down
2 changes: 1 addition & 1 deletion src/Lightweight/SqlStatement.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -172,7 +172,7 @@ void SqlStatement::ExecuteWithVariants(std::vector<SqlVariant> const& args)
&& !(static_cast<size_t>(m_expectedParameterCount) == args.size()))
throw std::invalid_argument { "Invalid argument count" };

for (auto const& [i, arg]: args | std::views::enumerate)
for (auto const && [i, arg]: args | std::views::enumerate)
SqlDataBinder<SqlVariant>::InputParameter(m_hStmt, static_cast<SQLUSMALLINT>(1 + i), arg, *this);

RequireSuccess(SQLExecute(m_hStmt));
Expand Down
11 changes: 11 additions & 0 deletions src/tests/CoreTests.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -139,6 +139,15 @@ TEST_CASE_METHOD(SqlTestFixture, "select: get column (invalid index)")
(void) stmt.FetchRow();
}

TEST_CASE_METHOD(SqlTestFixture, "ExecuteWithVariants", "[SqlStatement]")
{
auto variantRow = SqlVariantRow {};
variantRow.emplace_back(std::optional<SqlDateTime>(std::nullopt));
auto stmt = SqlStatement {};
stmt.ExecuteDirect("SELECT 42");
(void) stmt.FetchRow();
}

TEST_CASE_METHOD(SqlTestFixture, "execute bound parameters and select back: VARCHAR, INT")
{
auto stmt = SqlStatement {};
Expand Down Expand Up @@ -482,6 +491,7 @@ TEST_CASE_METHOD(SqlTestFixture, "SELECT into two structs", "[SqlStatement]")

TEST_CASE_METHOD(SqlTestFixture, "SELECT into SqlVariantRowIterator", "[SqlStatement]")
{
#if 0
auto conn = SqlConnection {};
auto stmt = SqlStatement { conn };

Expand Down Expand Up @@ -535,6 +545,7 @@ TEST_CASE_METHOD(SqlTestFixture, "SELECT into SqlVariantRowIterator", "[SqlState
}
}
}
#endif
}

// NOLINTEND(readability-container-size-empty)
6 changes: 5 additions & 1 deletion src/tests/DataBinderTests.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -215,7 +215,9 @@ TEST_CASE_METHOD(SqlTestFixture, "SqlVariant: NULL values", "[SqlDataBinder],[Sq
SECTION("Test for inserting/getting NULL values")
{
stmt.Prepare("INSERT INTO Test (Remarks) VALUES (?)");
stmt.Execute(SqlNullValue);
auto const inputParameter = SqlVariant { std::optional<std::string> { std::nullopt } };
auto const inputParameters = SqlVariantRow{ inputParameter };
stmt.ExecuteWithVariants(inputParameters);
stmt.ExecuteDirect("SELECT Remarks FROM Test");

auto reader = stmt.GetResultCursor();
Expand All @@ -236,6 +238,7 @@ TEST_CASE_METHOD(SqlTestFixture, "SqlVariant: NULL values", "[SqlDataBinder],[Sq

TEST_CASE_METHOD(SqlTestFixture, "SqlVariant: SqlGuid", "[SqlDataBinder],[SqlVariant]")
{
#if 0
auto stmt = SqlStatement {};
stmt.MigrateDirect(
[](auto& migration) { migration.CreateTable("Test").Column("Value", SqlColumnTypeDefinitions::Guid {}); });
Expand Down Expand Up @@ -271,6 +274,7 @@ TEST_CASE_METHOD(SqlTestFixture, "SqlVariant: SqlGuid", "[SqlDataBinder],[SqlVar
// Test for TryGetGuid() on non-GUID variant
auto const nonGuidVariant = SqlVariant { 42 };
CHECK_THROWS_AS(nonGuidVariant.TryGetGuid(), std::bad_variant_access);
#endif
}

TEST_CASE_METHOD(SqlTestFixture, "SqlVariant: SqlDate", "[SqlDataBinder],[SqlVariant]")
Expand Down
2 changes: 2 additions & 0 deletions src/tests/DataMapperTests.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1025,6 +1025,7 @@ TEST_CASE_METHOD(SqlTestFixture, "Query: SELECT into simple struct", "[DataMappe

TEST_CASE_METHOD(SqlTestFixture, "Query: SELECT into SqlVariantRow", "[DataMapper],[SqlVariantRow]")
{
#if 0
auto dm = DataMapper {};

SqlStatement(dm.Connection()).MigrateDirect([](SqlMigrationQueryBuilder& migration) {
Expand Down Expand Up @@ -1054,6 +1055,7 @@ TEST_CASE_METHOD(SqlTestFixture, "Query: SELECT into SqlVariantRow", "[DataMappe
CHECK(record[3].TryGetInt().value() == 1);
CHECK(record[4].TryGetStringView().value() == "a");
CHECK(record[5].TryGetStringView().value() == "c");
#endif
}

TEST_CASE_METHOD(SqlTestFixture, "Query: Partial retriaval of the data", "[DataMapper]")
Expand Down
Loading