6#include "UnicodeConverter.hpp"
18 template <
typename CharT>
19 [[nodiscard]]
constexpr CharT
const* NonNullTextData(std::basic_string_view<CharT> text)
noexcept
21 static constexpr CharT emptyText {};
22 return text.data() !=
nullptr ? text.data() : &emptyText;
27struct SqlDataBinder<std::basic_string_view<char>>
29 static constexpr SQLSMALLINT CType = SQL_C_CHAR;
30 static constexpr SQLSMALLINT SqlType = SQL_VARCHAR;
32 static LIGHTWEIGHT_FORCE_INLINE SQLRETURN InputParameter(SQLHSTMT stmt,
34 std::basic_string_view<char> value,
35 SqlDataBinderCallback& cb)
noexcept
37 SQLLEN* indicator = cb.ProvideInputIndicator();
38 *indicator =
static_cast<SQLLEN
>(value.size());
39 return SQLBindParameter(stmt,
44 detail::NonZeroColumnSize(value.size()),
46 (SQLPOINTER) detail::NonNullTextData(value),
51 static LIGHTWEIGHT_FORCE_INLINE std::string_view Inspect(std::basic_string_view<char> value)
noexcept
53 return { value.data(), value.size() };
57template <
typename Char16Type>
58 requires std::same_as<Char16Type, char16_t> || (std::same_as<Char16Type, wchar_t> &&
sizeof(wchar_t) == 2)
59struct SqlDataBinder<std::basic_string_view<Char16Type>>
61 static constexpr SQLSMALLINT CType = SQL_C_WCHAR;
62 static constexpr SQLSMALLINT SqlType = SQL_WVARCHAR;
64 static LIGHTWEIGHT_FORCE_INLINE SQLRETURN InputParameter(SQLHSTMT stmt,
66 std::basic_string_view<Char16Type> value,
67 SqlDataBinderCallback& cb)
noexcept
69 auto const sizeInBytes =
static_cast<SQLLEN
>(value.size() *
sizeof(Char16Type));
70 SQLLEN* indicator = cb.ProvideInputIndicator();
71 *indicator = sizeInBytes;
72 return SQLBindParameter(stmt,
77 detail::NonZeroColumnSize(value.size()),
79 (SQLPOINTER) detail::NonNullTextData(value),
84 static LIGHTWEIGHT_FORCE_INLINE std::string Inspect(std::basic_string_view<Char16Type> value)
noexcept
86 auto u8String =
ToUtf8(value);
87 return std::string((
char const*) u8String.data(), u8String.size());
91template <
typename Char32Type>
92 requires std::same_as<Char32Type, char32_t> || (std::same_as<Char32Type, wchar_t> &&
sizeof(wchar_t) == 4)
93struct SqlDataBinder<std::basic_string_view<Char32Type>>
95 static constexpr SQLSMALLINT CType = SQL_C_WCHAR;
96 static constexpr SQLSMALLINT SqlType = SQL_WVARCHAR;
98 static LIGHTWEIGHT_FORCE_INLINE SQLRETURN InputParameter(SQLHSTMT stmt,
100 std::basic_string_view<Char32Type> value,
101 SqlDataBinderCallback& cb)
noexcept
103 auto u16String = std::make_shared<std::u16string>(
ToUtf16(value));
104 cb.PlanPostExecuteCallback([u16String = u16String]() {});
105 auto const* data = u16String->data();
106 auto const sizeInBytes = u16String->size() *
sizeof(Char32Type);
107 return SQLBindParameter(stmt,
112 detail::NonZeroColumnSize(sizeInBytes),
119 static LIGHTWEIGHT_FORCE_INLINE std::string Inspect(std::basic_string_view<Char32Type> value)
noexcept
121 auto u8String =
ToUtf8(value);
122 return std::string((
char const*) u8String.data(), u8String.size());
127struct SqlDataBinder<std::u8string_view>
129 static constexpr SQLSMALLINT CType = SQL_C_WCHAR;
130 static constexpr SQLSMALLINT SqlType = SQL_WVARCHAR;
132 static LIGHTWEIGHT_FORCE_INLINE SQLRETURN InputParameter(SQLHSTMT stmt,
134 std::u8string_view value,
135 SqlDataBinderCallback& cb)
noexcept
137 auto u16String = std::make_shared<std::u16string>(
ToUtf16(value));
138 cb.PlanPostExecuteCallback([u16String = u16String]() {});
139 auto const* data = u16String->data();
140 auto const sizeInBytes = u16String->size() *
sizeof(char8_t);
141 return SQLBindParameter(stmt,
146 detail::NonZeroColumnSize(sizeInBytes),
153 static LIGHTWEIGHT_FORCE_INLINE std::string Inspect(std::basic_string_view<char8_t> value)
noexcept
155 return std::string { (
char const*) value.data(), value.size() };
LIGHTWEIGHT_API std::u8string ToUtf8(std::u32string_view u32InputString)
std::u16string ToUtf16(std::basic_string_view< T > const u32InputString)