5#include "../SqlColumnTypeDefinitions.hpp"
28 static std::optional<
SqlGuid> TryParse(std::string_view const& text) noexcept;
31 static
SqlGuid constexpr UnsafeParse(std::string_view const& text) noexcept;
34 constexpr std::weak_ordering operator<=>(
SqlGuid const& other) const noexcept = default;
37 constexpr
bool operator==(
SqlGuid const& other) const noexcept
39 return (*this <=> other) == std::weak_ordering::equivalent;
45 return !(*
this == other);
49 constexpr explicit operator bool() const noexcept
57 return !
static_cast<bool>(*this);
69 if (text.size() != 36)
73 if (text[8] !=
'-' || text[13] !=
'-' || text[18] !=
'-' || text[23] !=
'-')
77 auto const version = text[14];
78 if (!(
'1' <= version && version <=
'5'))
83 auto const variant = text[19];
84 auto const isHexDigit = (variant >=
'0' && variant <=
'9') || (variant >=
'A' && variant <=
'F')
85 || (variant >=
'a' && variant <=
'f');
91 for (
auto const index: { 0, 2, 4, 6,
95 24, 26, 28, 30, 32, 34 })
97 if (std::from_chars(text.data() + index, text.data() + index + 2, guid.data[i], 16).ec != std::errc())
109struct std::formatter<Lightweight::SqlGuid>: std::formatter<std::string>
111 LIGHTWEIGHT_FORCE_INLINE
auto format(
Lightweight::SqlGuid const& guid, format_context& ctx)
const
112 -> format_context::iterator
115 return formatter<std::string>::format(std::format(
116 "{:08X}-{:04X}-{:04X}-{:04X}-{:012X}",
117 (uint32_t) guid.data[3] | (uint32_t) guid.data[2] << 8 |
118 (uint32_t) guid.data[1] << 16 | (uint32_t) guid.data[0] << 24,
119 (uint16_t) guid.data[5] | (uint16_t) guid.data[4] << 8,
120 (uint16_t) guid.data[7] | (uint16_t) guid.data[6] << 8,
121 (uint16_t) guid.data[9] | (uint16_t) guid.data[8] << 8,
122 (uint64_t) guid.data[15] | (uint64_t) guid.data[14] << 8 |
123 (uint64_t) guid.data[13] << 16 | (uint64_t) guid.data[12] << 24 |
124 (uint64_t) guid.data[11] << 32 | (uint64_t) guid.data[10] << 40
135inline LIGHTWEIGHT_FORCE_INLINE std::string to_string(SqlGuid
const& guid)
137 return std::format(
"{}", guid);
141struct LIGHTWEIGHT_API SqlDataBinder<SqlGuid>
143 static constexpr auto ColumnType = SqlColumnTypeDefinitions::Guid {};
145 static SQLRETURN InputParameter(SQLHSTMT stmt,
147 SqlGuid
const& value,
148 SqlDataBinderCallback& cb)
noexcept;
150 static SQLRETURN OutputColumn(
151 SQLHSTMT stmt, SQLUSMALLINT column, SqlGuid* result, SQLLEN* indicator, SqlDataBinderCallback& cb)
noexcept;
153 static SQLRETURN GetColumn(
154 SQLHSTMT stmt, SQLUSMALLINT column, SqlGuid* result, SQLLEN* indicator, SqlDataBinderCallback
const& cb)
noexcept;
156 static LIGHTWEIGHT_FORCE_INLINE std::string Inspect(SqlGuid
const& value)
noexcept
158 return std::format(
"{}", value);
constexpr bool operator!=(SqlGuid const &other) const noexcept
Inequality comparison operator.
static SqlGuid constexpr UnsafeParse(std::string_view const &text) noexcept
Parses a GUID from a string. Use with caution and always prefer TryParse at all cost.
constexpr bool operator!() const noexcept
Tests if the GUID is empty.
static SqlGuid Create() noexcept
Creates a new non-empty GUID.