Lightweight 0.20250904.0
Loading...
Searching...
No Matches
StdStringView.hpp
1// SPDX-License-Identifier: Apache-2.0
2
3#pragma once
4
5#include "Core.hpp"
6#include "UnicodeConverter.hpp"
7
8#include <concepts>
9#include <memory>
10#include <string_view>
11
12namespace Lightweight
13{
14
15template <>
16struct SqlDataBinder<std::basic_string_view<char>>
17{
18 static constexpr SQLSMALLINT CType = SQL_C_CHAR;
19 static constexpr SQLSMALLINT SqlType = SQL_VARCHAR;
20
21 static LIGHTWEIGHT_FORCE_INLINE SQLRETURN InputParameter(SQLHSTMT stmt,
22 SQLUSMALLINT column,
23 std::basic_string_view<char> value,
24 SqlDataBinderCallback& /*cb*/) noexcept
25 {
26 return SQLBindParameter(
27 stmt, column, SQL_PARAM_INPUT, CType, SqlType, value.size(), 0, (SQLPOINTER) value.data(), 0, nullptr);
28 }
29
30 static LIGHTWEIGHT_FORCE_INLINE std::string_view Inspect(std::basic_string_view<char> value) noexcept
31 {
32 return { value.data(), value.size() };
33 }
34};
35
36template <typename Char16Type>
37 requires std::same_as<Char16Type, char16_t> || (std::same_as<Char16Type, wchar_t> && sizeof(wchar_t) == 2)
38struct SqlDataBinder<std::basic_string_view<Char16Type>>
39{
40 static constexpr SQLSMALLINT CType = SQL_C_WCHAR;
41 static constexpr SQLSMALLINT SqlType = SQL_WVARCHAR;
42
43 static LIGHTWEIGHT_FORCE_INLINE SQLRETURN InputParameter(SQLHSTMT stmt,
44 SQLUSMALLINT column,
45 std::basic_string_view<Char16Type> value,
46 SqlDataBinderCallback& /*cb*/) noexcept
47 {
48 return SQLBindParameter(
49 stmt, column, SQL_PARAM_INPUT, CType, SqlType, value.size(), 0, (SQLPOINTER) value.data(), 0, nullptr);
50 }
51
52 static LIGHTWEIGHT_FORCE_INLINE std::string Inspect(std::basic_string_view<Char16Type> value) noexcept
53 {
54 auto u8String = ToUtf8(value);
55 return std::string((char const*) u8String.data(), u8String.size());
56 }
57};
58
59template <typename Char32Type>
60 requires std::same_as<Char32Type, char32_t> || (std::same_as<Char32Type, wchar_t> && sizeof(wchar_t) == 4)
61struct SqlDataBinder<std::basic_string_view<Char32Type>>
62{
63 static constexpr SQLSMALLINT CType = SQL_C_WCHAR;
64 static constexpr SQLSMALLINT SqlType = SQL_WVARCHAR;
65
66 static LIGHTWEIGHT_FORCE_INLINE SQLRETURN InputParameter(SQLHSTMT stmt,
67 SQLUSMALLINT column,
68 std::basic_string_view<Char32Type> value,
69 SqlDataBinderCallback& cb) noexcept
70 {
71 auto u16String = std::make_shared<std::u16string>(ToUtf16(value));
72 cb.PlanPostExecuteCallback([u16String = u16String]() {}); // Keep the string alive
73 auto const* data = u16String->data();
74 auto const sizeInBytes = u16String->size() * sizeof(Char32Type);
75 return SQLBindParameter(
76 stmt, column, SQL_PARAM_INPUT, CType, SqlType, sizeInBytes, 0, (SQLPOINTER) data, 0, nullptr);
77 }
78
79 static LIGHTWEIGHT_FORCE_INLINE std::string Inspect(std::basic_string_view<Char32Type> value) noexcept
80 {
81 auto u8String = ToUtf8(value);
82 return std::string((char const*) u8String.data(), u8String.size());
83 }
84};
85
86template <>
87struct SqlDataBinder<std::u8string_view>
88{
89 static constexpr SQLSMALLINT CType = SQL_C_WCHAR;
90 static constexpr SQLSMALLINT SqlType = SQL_WVARCHAR;
91
92 static LIGHTWEIGHT_FORCE_INLINE SQLRETURN InputParameter(SQLHSTMT stmt,
93 SQLUSMALLINT column,
94 std::u8string_view value,
95 SqlDataBinderCallback& cb) noexcept
96 {
97 auto u16String = std::make_shared<std::u16string>(ToUtf16(value));
98 cb.PlanPostExecuteCallback([u16String = u16String]() {}); // Keep the string alive
99 auto const* data = u16String->data();
100 auto const sizeInBytes = u16String->size() * sizeof(char8_t);
101 return SQLBindParameter(
102 stmt, column, SQL_PARAM_INPUT, CType, SqlType, sizeInBytes, 0, (SQLPOINTER) data, 0, nullptr);
103 }
104
105 static LIGHTWEIGHT_FORCE_INLINE std::string Inspect(std::basic_string_view<char8_t> value) noexcept
106 {
107 return std::string { (char const*) value.data(), value.size() };
108 }
109};
110
111} // namespace Lightweight
LIGHTWEIGHT_API std::u8string ToUtf8(std::u32string_view u32InputString)
std::u16string ToUtf16(std::basic_string_view< T > const u32InputString)