5#include "../SqlColumnTypeDefinitions.hpp"
6#include "BasicStringBinder.hpp"
26 using std::vector<uint8_t>::vector;
32 return static_cast<std::vector<uint8_t> const&
>(*this) <=>
static_cast<std::vector<uint8_t> const&
>(other);
38 return static_cast<std::vector<uint8_t> const&
>(*this) ==
static_cast<std::vector<uint8_t> const&
>(other);
44 mutable SQLLEN _indicator = 0;
48struct SqlDataBinder<SqlBinary>
50 static constexpr auto ColumnType = SqlColumnTypeDefinitions::Binary { 255 };
52 static LIGHTWEIGHT_FORCE_INLINE SQLRETURN InputParameter(SQLHSTMT stmt,
54 SqlBinary
const& value,
55 SqlDataBinderCallback& )
noexcept
57 value._indicator =
static_cast<SQLLEN
>(value.size());
62 static constexpr std::uint8_t emptySentinel = 0;
63 bool const isEmpty = value.empty();
64 auto const* dataPtr = isEmpty ? &emptySentinel : value.data();
65 SQLULEN
const columnSize = isEmpty ? SQLULEN { 1 } :
static_cast<SQLULEN
>(value.size());
69 constexpr std::size_t MaxVarBinaryBytes = 8000;
70 auto const sqlType =
static_cast<SQLSMALLINT
>(value.size() > MaxVarBinaryBytes ? SQL_LONGVARBINARY : SQL_VARBINARY);
71 return SQLBindParameter(
72 stmt, column, SQL_PARAM_INPUT, SQL_C_BINARY, sqlType, columnSize, 0, (SQLPOINTER) dataPtr, 0, &value._indicator);
75 static LIGHTWEIGHT_FORCE_INLINE SQLRETURN OutputColumn(
76 SQLHSTMT stmt, SQLUSMALLINT column, SqlBinary* result, SQLLEN* indicator, SqlDataBinderCallback& cb)
noexcept
81 cb.PlanPostProcessOutputColumn([stmt, column, result, indicator]() {
82 if (*indicator == SQL_NULL_DATA)
85 else if (*indicator == SQL_NO_TOTAL)
87 result->resize(result->size() - 1);
88 else if (std::cmp_less_equal(*indicator,
static_cast<SQLLEN
>(result->size())))
89 result->resize(
static_cast<size_t>(*indicator));
95 auto const totalCharsRequired = *indicator;
96 result->resize(
static_cast<size_t>(totalCharsRequired) + 1);
97 auto const sqlResult =
98 SQLGetData(stmt, column, SQL_C_BINARY, (SQLPOINTER) result->data(), totalCharsRequired + 1, indicator);
100 assert(SQL_SUCCEEDED(sqlResult));
101 assert(*indicator == totalCharsRequired);
102 result->resize(
static_cast<size_t>(totalCharsRequired));
106 return SQLBindCol(stmt, column, SQL_C_BINARY, (SQLPOINTER) result->data(), 255, indicator);
109 static LIGHTWEIGHT_FORCE_INLINE SQLRETURN GetColumn(SQLHSTMT stmt,
113 SqlDataBinderCallback
const& )
noexcept
118 return detail::GetRawColumnArrayData<SQL_C_BINARY>(stmt, column, result, indicator);
121 static LIGHTWEIGHT_FORCE_INLINE std::string Inspect(SqlBinary
const& value)
123 return std::format(
"SqlBinary(size={})", value.size());
Represents a binary data type.
constexpr auto operator<=>(SqlBinary const &other) const noexcept
constexpr bool operator==(SqlBinary const &other) const noexcept
Equality operator derived from the spaceship comparison above.