158 bool _modified {
false };
166struct IsAutoAssignPrimaryKeyField: std::false_type {};
168template <
typename T, auto P>
169struct IsAutoAssignPrimaryKeyField<
Field<T, PrimaryKey::AutoAssign, P>>: std::true_type {};
171template <
typename T, auto P>
172struct IsAutoAssignPrimaryKeyField<
Field<T, P, PrimaryKey::AutoAssign>>: std::true_type {};
175struct IsAutoIncrementPrimaryKeyField: std::false_type {};
177template <
typename T, auto P>
178struct IsAutoIncrementPrimaryKeyField<
Field<T, PrimaryKey::ServerSideAutoIncrement, P>>: std::true_type {};
180template <
typename T, auto P>
181struct IsAutoIncrementPrimaryKeyField<
Field<T, P, PrimaryKey::ServerSideAutoIncrement>>: std::true_type {};
184struct IsFieldType: std::false_type {};
186template <
typename T, auto P1, auto P2>
187struct IsFieldType<
Field<T, P1, P2>>: std::true_type {};
194constexpr bool IsPrimaryKey =
195 detail::IsAutoAssignPrimaryKeyField<T>::value || detail::IsAutoIncrementPrimaryKeyField<T>::value;
199constexpr bool IsAutoIncrementPrimaryKey = detail::IsAutoIncrementPrimaryKeyField<T>::value;
202constexpr bool IsField = detail::IsFieldType<std::remove_cvref_t<T>>::value;
204template <detail::FieldElementType T, auto P1, auto P2>
205template <
typename... S>
206 requires std::constructible_from<T, S...>
208 _value(std::forward<S>(value)...)
212template <detail::FieldElementType T, auto P1, auto P2>
214 requires std::constructible_from<T, S> && (!std::same_as<std::remove_cvref_t<S>,
Field<T, P1, P2>>)
217 _value = std::forward<S>(value);
222template <detail::FieldElementType T, auto P1, auto P2>
225 return _value <=> other._value;
228template <detail::FieldElementType T, auto P1, auto P2>
230 requires std::convertible_to<S, T>
233 return _value == value;
236template <detail::FieldElementType T, auto P1, auto P2>
238 requires std::convertible_to<S, T>
241 return _value != value;
244template <detail::FieldElementType T, auto P1, auto P2>
247 if constexpr (std::is_same_v<T, std::string>)
249 std::stringstream result;
250 result << std::quoted(_value,
'\'');
253 else if constexpr (std::is_same_v<T, SqlText>)
255 std::stringstream result;
256 result << std::quoted(_value.value,
'\'');
259 else if constexpr (std::is_same_v<T, SqlDate>)
260 return std::format(
"\'{}\'", _value.value);
261 else if constexpr (std::is_same_v<T, SqlTime>)
262 return std::format(
"\'{}\'", _value.value);
263 else if constexpr (std::is_same_v<T, SqlDateTime>)
264 return std::format(
"\'{}\'", _value.value());
265 else if constexpr (
requires { _value.has_value(); })
267 if (_value.has_value())
268 return std::format(
"{}", _value.value());
273 return std::format(
"{}", _value);
278template <detail::FieldElementType T, auto P1, auto P2>
284template <detail::FieldElementType T, auto P1, auto P2>
290template <detail::FieldElementType T, auto P1, auto P2>
296template <detail::FieldElementType T, auto P1, auto P2>
320 return SqlDataBinder<T>::OutputColumn(stmt, column, &result->MutableValue(), indicator, cb);
326 return SqlDataBinder<T>::GetColumn(stmt, column, &result->emplace(), indicator, cb);