Lightweight 0.20250904.0
Loading...
Searching...
No Matches
StdOptional.hpp
1// SPDX-License-Identifier: Apache-2.0
2
3#pragma once
4
5#include "Core.hpp"
6#include "SqlNullValue.hpp"
7
8#include <format>
9#include <optional>
10
11namespace Lightweight
12{
13
14template <typename T>
15struct SqlDataBinder<std::optional<T>>
16{
17 using OptionalValue = std::optional<T>;
18
19 static constexpr auto ColumnType = SqlDataBinder<T>::ColumnType;
20
21 static LIGHTWEIGHT_FORCE_INLINE SQLRETURN InputParameter(SQLHSTMT stmt,
22 SQLUSMALLINT column,
23 OptionalValue const& value,
24 SqlDataBinderCallback& cb) noexcept
25 {
26 if (value.has_value())
27 return SqlDataBinder<T>::InputParameter(stmt, column, *value, cb);
28 else
29 return SqlDataBinder<SqlNullType>::InputParameter(stmt, column, SqlNullValue, cb);
30 }
31
32 static LIGHTWEIGHT_FORCE_INLINE SQLRETURN OutputColumn(
33 SQLHSTMT stmt, SQLUSMALLINT column, OptionalValue* result, SQLLEN* indicator, SqlDataBinderCallback& cb) noexcept
34 {
35 if (!result)
36 return SQL_ERROR;
37
38 auto const sqlReturn = SqlDataBinder<T>::OutputColumn(stmt, column, &result->emplace(), indicator, cb);
39 cb.PlanPostProcessOutputColumn([result, indicator]() {
40 if (indicator && *indicator == SQL_NULL_DATA)
41 *result = std::nullopt;
42 });
43 return sqlReturn;
44 }
45
46 static LIGHTWEIGHT_FORCE_INLINE SQLRETURN GetColumn(SQLHSTMT stmt,
47 SQLUSMALLINT column,
48 OptionalValue* result,
49 SQLLEN* indicator,
50 SqlDataBinderCallback const& cb) noexcept
51 {
52 auto const sqlReturn = SqlDataBinder<T>::GetColumn(stmt, column, &result->emplace(), indicator, cb);
53 if (indicator && *indicator == SQL_NULL_DATA)
54 *result = std::nullopt;
55 return sqlReturn;
56 }
57
58 static LIGHTWEIGHT_FORCE_INLINE std::string Inspect(OptionalValue const& value) noexcept
59 {
60 if (!value)
61 return "NULL";
62 else
63 return std::string(SqlDataBinder<T>::Inspect(*value));
64 }
65};
66
67} // namespace Lightweight
constexpr auto SqlNullValue