5#if defined(_WIN32) || defined(_WIN64)
10#include "../SqlServerType.hpp"
72 [[nodiscard]]
virtual SqlServerType
ServerType() const noexcept = 0;
75 [[nodiscard]] virtual std::
string const& DriverName() const noexcept = 0;
86struct SqlBasicStringOperations;
95concept HasGetStringAndGetLength =
requires(T
const& t) {
96 { t.GetLength() } -> std::same_as<int>;
97 { t.GetString() } -> std::same_as<char const*>;
101concept HasGetStringAndLength =
requires(T
const& t)
103 { t.Length() } -> std::same_as<int>;
104 { t.GetString() } -> std::same_as<char const*>;
109 struct SqlViewHelper;
111 template <
typename T>
112 concept HasSqlViewHelper =
requires(T
const& t) {
113 { SqlViewHelper<T>::View(t) } -> std::convertible_to<std::string_view>;
116 template <
typename CharT>
117 struct SqlViewHelper<std::basic_string<CharT>>
119 static LIGHTWEIGHT_FORCE_INLINE std::basic_string_view<CharT> View(std::basic_string<CharT>
const& str)
noexcept
121 return { str.data(), str.size() };
125 template <detail::HasGetStringAndGetLength CStringLike>
126 struct SqlViewHelper<CStringLike>
128 static LIGHTWEIGHT_FORCE_INLINE std::string_view View(CStringLike
const& str)
noexcept
130 return { str.GetString(),
static_cast<size_t>(str.GetLength()) };
134 template <detail::HasGetStringAndLength StringLike>
135 struct SqlViewHelper<StringLike>
137 static LIGHTWEIGHT_FORCE_INLINE std::string_view View(StringLike
const& str)
noexcept
139 return { str.GetString(),
static_cast<size_t>(str.Length()) };
148concept SqlInputParameterBinder =
requires(SQLHSTMT hStmt, SQLUSMALLINT column, T
const& value,
SqlDataBinderCallback& cb) {
149 { SqlDataBinder<T>::InputParameter(hStmt, column, value, cb) } -> std::same_as<SQLRETURN>;
153concept SqlOutputColumnBinder =
154 requires(SQLHSTMT hStmt, SQLUSMALLINT column, T* result, SQLLEN* indicator, SqlDataBinderCallback& cb) {
155 { SqlDataBinder<T>::OutputColumn(hStmt, column, result, indicator, cb) } -> std::same_as<SQLRETURN>;
159concept SqlInputParameterBatchBinder =
160 requires(SQLHSTMT hStmt, SQLUSMALLINT column, std::ranges::range_value_t<T>* result, SqlDataBinderCallback& cb) {
162 SqlDataBinder<std::ranges::range_value_t<T>>::InputParameter(
163 hStmt, column, std::declval<std::ranges::range_value_t<T>>(), cb)
164 } -> std::same_as<SQLRETURN>;
168concept SqlGetColumnNativeType =
169 requires(SQLHSTMT hStmt, SQLUSMALLINT column, T* result, SQLLEN* indicator, SqlDataBinderCallback
const& cb) {
170 { SqlDataBinder<T>::GetColumn(hStmt, column, result, indicator, cb) } -> std::same_as<SQLRETURN>;
174concept SqlDataBinderSupportsInspect =
requires(T
const& value) {
175 { SqlDataBinder<std::remove_cvref_t<T>>::Inspect(value) } -> std::convertible_to<std::string>;
179template <
typename StringType,
typename CharType>
180concept SqlBasicStringBinderConcept =
requires(StringType* str) {
181 { SqlBasicStringOperations<StringType>::Data(str) } -> std::same_as<CharType*>;
182 { SqlBasicStringOperations<StringType>::Size(str) } -> std::same_as<SQLULEN>;
183 { SqlBasicStringOperations<StringType>::Reserve(str,
size_t {}) } -> std::same_as<void>;
184 { SqlBasicStringOperations<StringType>::Resize(str, SQLLEN {}) } -> std::same_as<void>;
185 { SqlBasicStringOperations<StringType>::Clear(str) } -> std::same_as<void>;
virtual void PlanPostExecuteCallback(std::function< void()> &&)=0
virtual SQLLEN * ProvideInputIndicator()=0
virtual SqlServerType ServerType() const noexcept=0
virtual void PlanPostProcessOutputColumn(std::function< void()> &&)=0
virtual SQLLEN * ProvideInputIndicators(size_t rowCount)=0