5#include "../SqlColumnTypeDefinitions.hpp"
27 static std::optional<
SqlGuid> TryParse(std::string_view const& text) noexcept;
30 static
SqlGuid constexpr UnsafeParse(std::string_view const& text) noexcept;
32 constexpr std::weak_ordering operator<=>(
SqlGuid const& other) const noexcept = default;
34 constexpr
bool operator==(
SqlGuid const& other) const noexcept
36 return (*this <=> other) == std::weak_ordering::equivalent;
39 constexpr bool operator!=(
SqlGuid const& other)
const noexcept
41 return !(*
this == other);
45 constexpr explicit operator bool() const noexcept
47 return *
this != SqlGuid {};
51 constexpr bool operator!() const noexcept
53 return !
static_cast<bool>(*this);
65 if (text.size() != 36)
69 if (text[8] !=
'-' || text[13] !=
'-' || text[18] !=
'-' || text[23] !=
'-')
73 auto const version = text[14];
74 if (!(
'1' <= version && version <=
'5'))
79 auto const variant = text[19];
80 auto const isHexDigit = (variant >=
'0' && variant <=
'9') || (variant >=
'A' && variant <=
'F')
81 || (variant >=
'a' && variant <=
'f');
87 for (
auto const index: { 0, 2, 4, 6,
91 24, 26, 28, 30, 32, 34 })
93 if (std::from_chars(text.data() + index, text.data() + index + 2, guid.data[i], 16).ec != std::errc())
105struct std::formatter<Lightweight::SqlGuid>: std::formatter<std::string>
107 LIGHTWEIGHT_FORCE_INLINE
auto format(
Lightweight::SqlGuid const& guid, format_context& ctx)
const
108 -> format_context::iterator
111 return formatter<std::string>::format(std::format(
112 "{:08X}-{:04X}-{:04X}-{:04X}-{:012X}",
113 (uint32_t) guid.data[3] | (uint32_t) guid.data[2] << 8 |
114 (uint32_t) guid.data[1] << 16 | (uint32_t) guid.data[0] << 24,
115 (uint16_t) guid.data[5] | (uint16_t) guid.data[4] << 8,
116 (uint16_t) guid.data[7] | (uint16_t) guid.data[6] << 8,
117 (uint16_t) guid.data[9] | (uint16_t) guid.data[8] << 8,
118 (uint64_t) guid.data[15] | (uint64_t) guid.data[14] << 8 |
119 (uint64_t) guid.data[13] << 16 | (uint64_t) guid.data[12] << 24 |
120 (uint64_t) guid.data[11] << 32 | (uint64_t) guid.data[10] << 40
131inline LIGHTWEIGHT_FORCE_INLINE std::string to_string(SqlGuid
const& guid)
133 return std::format(
"{}", guid);
137struct LIGHTWEIGHT_API SqlDataBinder<SqlGuid>
139 static constexpr auto ColumnType = SqlColumnTypeDefinitions::Guid {};
141 static SQLRETURN InputParameter(SQLHSTMT stmt,
143 SqlGuid
const& value,
144 SqlDataBinderCallback& cb)
noexcept;
146 static SQLRETURN OutputColumn(
147 SQLHSTMT stmt, SQLUSMALLINT column, SqlGuid* result, SQLLEN* indicator, SqlDataBinderCallback& cb)
noexcept;
149 static SQLRETURN GetColumn(
150 SQLHSTMT stmt, SQLUSMALLINT column, SqlGuid* result, SQLLEN* indicator, SqlDataBinderCallback
const& cb)
noexcept;
152 static LIGHTWEIGHT_FORCE_INLINE std::string Inspect(SqlGuid
const& value)
noexcept
154 return std::format(
"{}", value);
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.
static SqlGuid Create() noexcept
Creates a new non-empty GUID.