7#include "../SqlOdbcPrelude.hpp"
8#include "../SqlServerType.hpp"
98 [[nodiscard]]
virtual SqlServerType
ServerType() const noexcept = 0;
101 [[nodiscard]] virtual std::
string const& DriverName() const noexcept = 0;
111 [[nodiscard]] virtual std::optional<SQLSMALLINT> DescribeInputParameterType(SQLUSMALLINT column) noexcept
126struct SqlBasicStringOperations;
137 [[nodiscard]]
constexpr SQLULEN NonZeroColumnSize(std::size_t length)
noexcept
139 return std::max<SQLULEN>(
static_cast<SQLULEN
>(length), 1);
146 template <
typename T,
typename... Us>
147 concept IsAnyOf = (std::same_as<T, Us> || ...);
158 template <
typename T>
159 [[nodiscard]]
inline std::size_t OptionalValueOffset() noexcept
161 std::optional<T>
const probe { T {} };
162 return static_cast<std::size_t
>(
reinterpret_cast<std::uintptr_t
>(std::addressof(*probe))
163 -
reinterpret_cast<std::uintptr_t
>(std::addressof(probe)));
168concept HasGetStringAndGetLength =
requires(T
const& t) {
169 { t.GetLength() } -> std::same_as<int>;
170 { t.GetString() } -> std::same_as<char const*>;
174concept HasGetStringAndLength =
requires(T
const& t)
176 { t.Length() } -> std::same_as<int>;
177 { t.GetString() } -> std::same_as<char const*>;
182 struct SqlViewHelper;
184 template <
typename T>
185 concept HasSqlViewHelper =
requires(T
const& t) {
186 { SqlViewHelper<T>::View(t) } -> std::convertible_to<std::string_view>;
189 template <
typename CharT>
190 struct SqlViewHelper<std::basic_string<CharT>>
192 static LIGHTWEIGHT_FORCE_INLINE std::basic_string_view<CharT> View(std::basic_string<CharT>
const& str)
noexcept
194 return { str.data(), str.size() };
198 template <detail::HasGetStringAndGetLength CStringLike>
199 struct SqlViewHelper<CStringLike>
201 static LIGHTWEIGHT_FORCE_INLINE std::string_view View(CStringLike
const& str)
noexcept
203 return { str.GetString(),
static_cast<size_t>(str.GetLength()) };
207 template <detail::HasGetStringAndLength StringLike>
208 struct SqlViewHelper<StringLike>
210 static LIGHTWEIGHT_FORCE_INLINE std::string_view View(StringLike
const& str)
noexcept
212 return { str.GetString(),
static_cast<size_t>(str.Length()) };
221concept SqlInputParameterBinder =
requires(SQLHSTMT hStmt, SQLUSMALLINT column, T
const& value, SqlDataBinderCallback& cb) {
222 { SqlDataBinder<T>::InputParameter(hStmt, column, value, cb) } -> std::same_as<SQLRETURN>;
226concept SqlOutputColumnBinder =
227 requires(SQLHSTMT hStmt, SQLUSMALLINT column, T* result, SQLLEN* indicator, SqlDataBinderCallback& cb) {
228 { SqlDataBinder<T>::OutputColumn(hStmt, column, result, indicator, cb) } -> std::same_as<SQLRETURN>;
232concept SqlInputParameterBatchBinder =
233 requires(SQLHSTMT hStmt, SQLUSMALLINT column, std::ranges::range_value_t<T>* result, SqlDataBinderCallback& cb) {
235 SqlDataBinder<std::ranges::range_value_t<T>>::InputParameter(
236 hStmt, column, std::declval<std::ranges::range_value_t<T>>(), cb)
237 } -> std::same_as<SQLRETURN>;
250inline constexpr bool SqlIsNativeRowBindableValue =
false;
258inline constexpr bool SqlIsNumericValue =
false;
266inline constexpr bool SqlIsStdOptional =
false;
269inline constexpr bool SqlIsStdOptional<std::optional<T>> =
true;
272concept SqlGetColumnNativeType =
273 requires(SQLHSTMT hStmt, SQLUSMALLINT column, T* result, SQLLEN* indicator, SqlDataBinderCallback
const& cb) {
274 { SqlDataBinder<T>::GetColumn(hStmt, column, result, indicator, cb) } -> std::same_as<SQLRETURN>;
278concept SqlDataBinderSupportsInspect =
requires(T
const& value) {
279 { SqlDataBinder<std::remove_cvref_t<T>>::Inspect(value) } -> std::convertible_to<std::string>;
283template <
typename StringType,
typename CharType>
284concept SqlBasicStringBinderConcept =
requires(StringType* str) {
285 { SqlBasicStringOperations<StringType>::Data(str) } -> std::same_as<CharType*>;
286 { SqlBasicStringOperations<StringType>::Size(str) } -> std::same_as<SQLULEN>;
287 { SqlBasicStringOperations<StringType>::Reserve(str,
size_t {}) } -> std::same_as<void>;
288 { SqlBasicStringOperations<StringType>::Resize(str, SQLLEN {}) } -> std::same_as<void>;
289 { SqlBasicStringOperations<StringType>::Clear(str) } -> std::same_as<void>;
virtual void PlanPostExecuteCallback(std::function< void()> &&)=0
virtual SQLLEN * ProvideInputIndicator()=0
SqlDataBinderCallback(SqlDataBinderCallback &&)=default
Default move constructor.
virtual SqlServerType ServerType() const noexcept=0
virtual void PlanPostProcessOutputColumn(std::function< void()> &&)=0
SqlDataBinderCallback & operator=(SqlDataBinderCallback const &)=default
Default copy assignment operator.
SqlDataBinderCallback & operator=(SqlDataBinderCallback &&)=default
Default move assignment operator.
SqlDataBinderCallback()=default
Default constructor.
virtual SQLLEN * ProvideInputIndicators(size_t rowCount)=0
SqlDataBinderCallback(SqlDataBinderCallback const &)=default
Default copy constructor.
virtual std::byte * ProvideBatchStagingBuffer(std::size_t byteCount)=0