163 bool _modified {
false };
171struct IsAutoAssignPrimaryKeyField: std::false_type {};
173template <
typename T, auto P>
174struct IsAutoAssignPrimaryKeyField<Field<T, PrimaryKey::AutoAssign, P>>: std::true_type {};
176template <
typename T, auto P>
177struct IsAutoAssignPrimaryKeyField<Field<T, P, PrimaryKey::AutoAssign>>: std::true_type {};
180struct IsAutoIncrementPrimaryKeyField: std::false_type {};
182template <
typename T, auto P>
183struct IsAutoIncrementPrimaryKeyField<Field<T, PrimaryKey::ServerSideAutoIncrement, P>>: std::true_type {};
185template <
typename T, auto P>
186struct IsAutoIncrementPrimaryKeyField<Field<T, P, PrimaryKey::ServerSideAutoIncrement>>: std::true_type {};
189struct IsFieldType: std::false_type {};
191template <
typename T, auto P1, auto P2>
192struct IsFieldType<Field<T, P1, P2>>: std::true_type {};
199constexpr bool IsPrimaryKey =
200 detail::IsAutoAssignPrimaryKeyField<T>::value || detail::IsAutoIncrementPrimaryKeyField<T>::value;
204constexpr bool IsAutoIncrementPrimaryKey = detail::IsAutoIncrementPrimaryKeyField<T>::value;
207constexpr bool IsField = detail::IsFieldType<std::remove_cvref_t<T>>::value;
209template <detail::FieldElementType T, auto P1, auto P2>
210template <
typename... S>
211 requires std::constructible_from<T, S...>
212constexpr LIGHTWEIGHT_FORCE_INLINE Field<T, P1, P2>::Field(S&&... value)
noexcept:
213 _value(std::forward<S>(value)...)
217template <detail::FieldElementType T, auto P1, auto P2>
219 requires std::constructible_from<T, S> && (!std::same_as<std::remove_cvref_t<S>, Field<T, P1, P2>>)
220constexpr LIGHTWEIGHT_FORCE_INLINE Field<T, P1, P2>& Field<T, P1, P2>::operator=(S&& value)
noexcept
222 _value = std::forward<S>(value);
227template <detail::FieldElementType T, auto P1, auto P2>
230 return _value <=> other._value;
233template <detail::FieldElementType T, auto P1, auto P2>
235 requires std::convertible_to<S, T>
238 return _value == value;
241template <detail::FieldElementType T, auto P1, auto P2>
243 requires std::convertible_to<S, T>
246 return _value != value;
249template <detail::FieldElementType T, auto P1, auto P2>
252 if constexpr (std::is_same_v<T, std::string>)
254 std::stringstream result;
255 result << std::quoted(_value,
'\'');
258 else if constexpr (std::is_same_v<T, SqlText>)
260 std::stringstream result;
261 result << std::quoted(_value.value,
'\'');
264 else if constexpr (std::is_same_v<T, SqlDate>)
265 return std::format(
"\'{}\'", _value.value);
266 else if constexpr (std::is_same_v<T, SqlTime>)
267 return std::format(
"\'{}\'", _value.value);
268 else if constexpr (std::is_same_v<T, SqlDateTime>)
269 return std::format(
"\'{}\'", _value.value());
270 else if constexpr (SqlNumericType<T>)
271 return std::format(
"{}", _value.ToString());
272 else if constexpr (
requires { _value.has_value(); })
274 if (_value.has_value())
275 return std::format(
"{}", _value.value());
280 return std::format(
"{}", _value);
285template <detail::FieldElementType T, auto P1, auto P2>
291template <detail::FieldElementType T, auto P1, auto P2>
297template <detail::FieldElementType T, auto P1, auto P2>
303template <detail::FieldElementType T, auto P1, auto P2>