Lightweight 0.20250627.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
11template <typename T>
12struct SqlDataBinder<std::optional<T>>
13{
14 using OptionalValue = std::optional<T>;
15
16 static constexpr auto ColumnType = SqlDataBinder<T>::ColumnType;
17
18 static LIGHTWEIGHT_FORCE_INLINE SQLRETURN InputParameter(SQLHSTMT stmt,
19 SQLUSMALLINT column,
20 OptionalValue const& value,
21 SqlDataBinderCallback& cb) noexcept
22 {
23 if (value.has_value())
24 return SqlDataBinder<T>::InputParameter(stmt, column, *value, cb);
25 else
26 return SqlDataBinder<SqlNullType>::InputParameter(stmt, column, SqlNullValue, cb);
27 }
28
29 static LIGHTWEIGHT_FORCE_INLINE SQLRETURN OutputColumn(
30 SQLHSTMT stmt, SQLUSMALLINT column, OptionalValue* result, SQLLEN* indicator, SqlDataBinderCallback& cb) noexcept
31 {
32 if (!result)
33 return SQL_ERROR;
34
35 auto const sqlReturn = SqlDataBinder<T>::OutputColumn(stmt, column, &result->emplace(), indicator, cb);
36 cb.PlanPostProcessOutputColumn([result, indicator]() {
37 if (indicator && *indicator == SQL_NULL_DATA)
38 *result = std::nullopt;
39 });
40 return sqlReturn;
41 }
42
43 static LIGHTWEIGHT_FORCE_INLINE SQLRETURN GetColumn(SQLHSTMT stmt,
44 SQLUSMALLINT column,
45 OptionalValue* result,
46 SQLLEN* indicator,
47 SqlDataBinderCallback const& cb) noexcept
48 {
49 auto const sqlReturn = SqlDataBinder<T>::GetColumn(stmt, column, &result->emplace(), indicator, cb);
50 if (indicator && *indicator == SQL_NULL_DATA)
51 *result = std::nullopt;
52 return sqlReturn;
53 }
54
55 static LIGHTWEIGHT_FORCE_INLINE std::string Inspect(OptionalValue const& value) noexcept
56 {
57 if (!value)
58 return "NULL";
59 else
60 return std::string(SqlDataBinder<T>::Inspect(*value));
61 }
62};
constexpr auto SqlNullValue