5#include "../SqlColumnTypeDefinitions.hpp"
19 SQL_DATE_STRUCT sqlValue {};
21 constexpr SqlDate()
noexcept =
default;
26 constexpr ~SqlDate()
noexcept =
default;
29 [[nodiscard]] LIGHTWEIGHT_FORCE_INLINE
constexpr std::chrono::year_month_day
value() const noexcept
31 return ConvertToNative(sqlValue);
34 LIGHTWEIGHT_FORCE_INLINE
constexpr bool operator==(
SqlDate const& other)
const noexcept
36 return sqlValue.year == other.sqlValue.year && sqlValue.month == other.sqlValue.month
37 && sqlValue.day == other.sqlValue.day;
40 LIGHTWEIGHT_FORCE_INLINE
constexpr bool operator!=(SqlDate
const& other)
const noexcept
42 return !(*
this == other);
47 sqlValue { SqlDate::ConvertToSqlValue(
value) }
52 constexpr SqlDate(std::chrono::year year, std::chrono::month month, std::chrono::day day)
noexcept:
53 SqlDate(std::chrono::year_month_day { year, month, day })
58 [[nodiscard]]
static LIGHTWEIGHT_FORCE_INLINE
SqlDate Today() noexcept
60 return SqlDate { std::chrono::year_month_day {
61 std::chrono::floor<std::chrono::days>(std::chrono::system_clock::now()),
65 static LIGHTWEIGHT_FORCE_INLINE
constexpr SQL_DATE_STRUCT ConvertToSqlValue(std::chrono::year_month_day
value)
noexcept
67 return SQL_DATE_STRUCT {
68 .year = (SQLSMALLINT) (
int)
value.year(),
69 .month = (SQLUSMALLINT) (
unsigned)
value.month(),
70 .day = (SQLUSMALLINT) (
unsigned)
value.day(),
74 static LIGHTWEIGHT_FORCE_INLINE
constexpr std::chrono::year_month_day ConvertToNative(
75 SQL_DATE_STRUCT
const&
value)
noexcept
77 return std::chrono::year_month_day { std::chrono::year {
value.year },
78 std::chrono::month {
static_cast<unsigned>(
value.month) },
79 std::chrono::day {
static_cast<unsigned>(
value.day) } };
86struct std::formatter<Lightweight::SqlDate>: std::formatter<std::string>
88 auto format(
Lightweight::SqlDate const& value, std::format_context& ctx)
const -> std::format_context::iterator
90 return std::formatter<std::string>::format(
91 std::format(
"{:04}-{:02}-{:02}", value.sqlValue.year, value.sqlValue.month, value.sqlValue.day), ctx);
99struct SqlDataBinder<SqlDate>
101 static constexpr auto ColumnType = SqlColumnTypeDefinitions::Date {};
103 static LIGHTWEIGHT_FORCE_INLINE SQLRETURN InputParameter(SQLHSTMT stmt,
105 SqlDate
const& value,
106 SqlDataBinderCallback& )
noexcept
108 return SQLBindParameter(
109 stmt, column, SQL_PARAM_INPUT, SQL_C_TYPE_DATE, SQL_TYPE_DATE, 0, 0, (SQLPOINTER) &value.sqlValue, 0,
nullptr);
112 static LIGHTWEIGHT_FORCE_INLINE SQLRETURN OutputColumn(
113 SQLHSTMT stmt, SQLUSMALLINT column, SqlDate* result, SQLLEN* indicator, SqlDataBinderCallback& )
noexcept
115 return SQLBindCol(stmt, column, SQL_C_TYPE_DATE, &result->sqlValue,
sizeof(result->sqlValue), indicator);
118 static LIGHTWEIGHT_FORCE_INLINE SQLRETURN GetColumn(
119 SQLHSTMT stmt, SQLUSMALLINT column, SqlDate* result, SQLLEN* indicator, SqlDataBinderCallback
const& )
noexcept
121 return SQLGetData(stmt, column, SQL_C_TYPE_DATE, &result->sqlValue,
sizeof(result->sqlValue), indicator);
124 static LIGHTWEIGHT_FORCE_INLINE std::string Inspect(SqlDate
const& value)
noexcept
126 return std::format(
"{}", value);
constexpr SqlDate(std::chrono::year_month_day value) noexcept
Constructs a date from individual std::chrono::year_month_day.
LIGHTWEIGHT_FORCE_INLINE constexpr std::chrono::year_month_day value() const noexcept
Returns the current date.
static LIGHTWEIGHT_FORCE_INLINE SqlDate Today() noexcept
Returns the current date.
constexpr SqlDate(std::chrono::year year, std::chrono::month month, std::chrono::day day) noexcept
Constructs a date from individual components.