170 bool _modified {
false };
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>
242 requires std::convertible_to<S, T>
245 return _value == value;
248template <detail::FieldElementType T, auto P1, auto P2>
250 requires std::convertible_to<S, T>
253 return _value != value;
256template <detail::FieldElementType T, auto P1, auto P2>
259 if constexpr (std::is_same_v<T, std::string>)
261 std::stringstream result;
262 result << std::quoted(_value,
'\'');
265 else if constexpr (std::is_same_v<T, SqlText>)
267 std::stringstream result;
268 result << std::quoted(_value.value,
'\'');
271 else if constexpr (std::is_same_v<T, SqlDate>)
272 return std::format(
"\'{}\'", _value.value);
273 else if constexpr (std::is_same_v<T, SqlTime>)
274 return std::format(
"\'{}\'", _value.value);
275 else if constexpr (std::is_same_v<T, SqlDateTime>)
276 return std::format(
"\'{}\'", _value.value());
277 else if constexpr (SqlNumericType<T>)
278 return std::format(
"{}", _value.ToString());
279 else if constexpr (
requires { _value.has_value(); })
281 if (_value.has_value())
282 return std::format(
"{}", _value.value());
287 return std::format(
"{}", _value);
292template <detail::FieldElementType T, auto P1, auto P2>
298template <detail::FieldElementType T, auto P1, auto P2>
304template <detail::FieldElementType T, auto P1, auto P2>
310template <detail::FieldElementType T, auto P1, auto P2>
332 OutputColumn(SQLHSTMT stmt, SQLUSMALLINT column, ValueType* result, SQLLEN* indicator, SqlDataBinderCallback& cb)