170 bool _modified {
true };
178struct IsAutoAssignPrimaryKeyField: std::false_type {};
180template <
typename T, auto P>
181struct IsAutoAssignPrimaryKeyField<Field<T, PrimaryKey::AutoAssign, P>>: std::true_type {};
183template <
typename T, auto P>
184struct IsAutoAssignPrimaryKeyField<Field<T, P, PrimaryKey::AutoAssign>>: std::true_type {};
187struct IsAutoIncrementPrimaryKeyField: std::false_type {};
189template <
typename T, auto P>
190struct IsAutoIncrementPrimaryKeyField<Field<T, PrimaryKey::ServerSideAutoIncrement, P>>: std::true_type {};
192template <
typename T, auto P>
193struct IsAutoIncrementPrimaryKeyField<Field<T, P, PrimaryKey::ServerSideAutoIncrement>>: std::true_type {};
196struct IsFieldType: std::false_type {};
198template <
typename T, auto P1, auto P2>
199struct IsFieldType<Field<T, P1, P2>>: std::true_type {};
206constexpr bool IsPrimaryKey =
207 detail::IsAutoAssignPrimaryKeyField<T>::value || detail::IsAutoIncrementPrimaryKeyField<T>::value;
211constexpr bool IsAutoIncrementPrimaryKey = detail::IsAutoIncrementPrimaryKeyField<T>::value;
214constexpr bool IsField = detail::IsFieldType<std::remove_cvref_t<T>>::value;
216template <detail::FieldElementType T, auto P1, auto P2>
217template <
typename... S>
218 requires std::constructible_from<T, S...>
219constexpr LIGHTWEIGHT_FORCE_INLINE Field<T, P1, P2>::Field(S&&... value)
noexcept:
220 _value(std::forward<S>(value)...)
224template <detail::FieldElementType T, auto P1, auto P2>
226 requires std::constructible_from<T, S> && (!std::same_as<std::remove_cvref_t<S>, Field<T, P1, P2>>)
227constexpr LIGHTWEIGHT_FORCE_INLINE Field<T, P1, P2>& Field<T, P1, P2>::operator=(S&& value)
noexcept
229 _value = std::forward<S>(value);
234template <detail::FieldElementType T, auto P1, auto P2>
237 return _value <=> other._value;
240template <detail::FieldElementType T, auto P1, auto P2>
243 return _value == other._value;
246template <detail::FieldElementType T, auto P1, auto P2>
249 return _value != other._value;
252template <detail::FieldElementType T, auto P1, auto P2>
254 requires std::convertible_to<S, T>
257 return _value == value;
260template <detail::FieldElementType T, auto P1, auto P2>
262 requires std::convertible_to<S, T>
265 return _value != value;
268template <detail::FieldElementType T, auto P1, auto P2>
271 if constexpr (std::is_same_v<T, std::string>)
273 std::stringstream result;
274 result << std::quoted(_value,
'\'');
277 else if constexpr (std::is_same_v<T, SqlText>)
279 std::stringstream result;
280 result << std::quoted(_value.value,
'\'');
283 else if constexpr (std::is_same_v<T, SqlDate>)
284 return std::format(
"\'{}\'", _value.value);
285 else if constexpr (std::is_same_v<T, SqlTime>)
286 return std::format(
"\'{}\'", _value.value);
287 else if constexpr (std::is_same_v<T, SqlDateTime>)
288 return std::format(
"\'{}\'", _value.value());
289 else if constexpr (SqlNumericType<T>)
290 return std::format(
"{}", _value.ToString());
291 else if constexpr (
requires { _value.has_value(); })
293 if (_value.has_value())
294 return std::format(
"{}", _value.value());
299 return std::format(
"{}", _value);
304template <detail::FieldElementType T, auto P1, auto P2>
310template <detail::FieldElementType T, auto P1, auto P2>
316template <detail::FieldElementType T, auto P1, auto P2>
322template <detail::FieldElementType T, auto P1, auto P2>