22 #ifndef __UT_ORMFIELD_H__
23 #define __UT_ORMFIELD_H__
74 const void* obj_right,
78 template <
typename Cls,
typename MemberT>
81 mySetter(
this, &obj, &member_value, ec);
84 template <
typename Cls,
typename MemberT>
87 myGetter(
this, &obj, &member_value, ec);
91 typedef void (*setter_func_t)(
96 typedef void (*getter_func_t)(
103 : mySetter(setter), myGetter(getter)
116 unsigned props = UT_ORMColumn::Properties::Empty,
120 , myFieldPtr(std::move(adapter))
136 return myFieldPtr.get();
143 void setAsManyToMany(
158 return myForeignModel.lock();
163 return myM2MFieldName;
167 return myM2MReverseFieldName;
178 template <
typename Cls,
typename MemberT>
182 static void memberSetter(
185 const void* member_value,
188 auto value =
static_cast<const MemberT*
>(member_value);
192 static void memberGetter(
198 auto value =
static_cast<MemberT*
>(member_value);
209 myMemberPtr(member_ptr)
215 MemberT Cls::*member_ptr,
218 auto adapter = UTmakeUnique<UT_ORMBasicFieldAdapter<Cls, MemberT>>(
226 return UTsqlOrmColumnType<MemberT>();
234 const MemberT&
v = this->
field(obj);
241 MemberT&
v = this->
field(obj);
253 const MemberT& left_value =
field(obj_left);
254 const MemberT& right_value =
field(obj_right);
255 return left_value == right_value;
261 Cls* cls =
static_cast<Cls*
>(obj);
262 return (cls->*myMemberPtr);
264 const MemberT&
field(
const void* obj)
const
266 const Cls* cls =
static_cast<const Cls*
>(obj);
267 return (cls->*myMemberPtr);
271 MemberT Cls::*myMemberPtr;
274 template <
typename Cls>
276 template <
typename Cls>
278 template <
typename Cls>
280 template <
typename Cls>
283 template <
typename ModelT>
289 std::default_delete<PointerHolder>,
290 UT_IntrusiveNonThreadSafeCounterPolicy>
292 PointerHolder(
const ModelT& m) :
295 PointerHolder(ModelT&& m) :
296 myModel(std::move(m))
315 return myID == rhs.myID;
319 return !(*
this == rhs);
330 return &(myValue->myModel);
332 const ModelT*
get()
const
352 if (
auto fadp = dynamic_cast<foreign_field_t*>(adapter); fadp)
355 myValue = UTmakeIntrusive<PointerHolder>(
value);
368 if (
auto&& opt = ModelT::fetch(myID, ec); opt)
370 myValue = UTmakeIntrusive<PointerHolder>(opt.value());
378 template <
typename Cls,
typename ForeignKey>
384 using id_t =
typename ForeignKey::foreign_key_t;
388 , myMemberPtr(member_ptr)
395 ForeignKey Cls::*member_ptr,
402 = UTmakeUnique<UT_ORMForeignKeyFieldAdapter<Cls, ForeignKey>>(
405 col.setAsForeignKey(meta, related_name);
406 col.setOnDelete(ondelete);
417 auto member_value =
static_cast<const id_t*
>(
value);
420 .setId(*member_value);
428 auto member_value =
static_cast<id_t*
>(
value);
438 return UTsqlOrmColumnType<id_t>();
458 if (ondelete != UT_ORMColumn::OnDelete::DoNothing)
460 ForeignKey&
f =
field(obj);
467 const ForeignKey&
left =
field(obj_left);
469 return left.id() == right.id();
475 Cls* cls =
static_cast<Cls*
>(obj);
476 return (cls->*myMemberPtr);
478 const ForeignKey&
field(
const void* obj)
const
480 const Cls* cls =
static_cast<const Cls*
>(obj);
481 return (cls->*myMemberPtr);
485 ForeignKey Cls::*myMemberPtr;
488 #endif // __UT_ORMFIELD_H__
ForeignKey & field(void *obj)
void getValue(const Cls &obj, MemberT &member_value, UT_ErrorCode &ec)
UT_IORMFieldAdapter * adapter() const
UT_WeakPtr< UT_ORMModelMeta > myForeignModel
const UT_ErrorCode & getError() const
UT_ORMColumn::Type sqlType() const override
UT_ORMFieldColumn(const UT_StringHolder &name, UT_ORMColumn::Type type, unsigned props=UT_ORMColumn::Empty, UT_ORMColumn::OnDelete ondelete=UT_ORMColumn::OnDelete::DoNothing)
void bind(const void *obj, UT_SqlStatement &stmt, int bind_index, UT_ErrorCode &ec) override
UT_StringHolder myM2MReverseFieldName
typename ModelT::Meta::primary_key_t foreign_key_t
GLsizei const GLfloat * value
bool bind(int idx, null_tag_t)
SYS_FORCE_INLINE T * SYSconst_cast(const T *foo)
UT_IORMFieldAdapter(setter_func_t setter, getter_func_t getter)
virtual void onDelete(void *obj, UT_ORMColumn::OnDelete ondelete, UT_ErrorCode &ec)
UT_ORMFieldColumn(const UT_StringHolder &name, UT_UniquePtr< UT_IORMFieldAdapter > adapter, unsigned props=UT_ORMColumn::Properties::Empty, UT_ORMColumn::OnDelete ondelete=UT_ORMColumn::OnDelete::DoNothing, const UT_StringHolder &related_name=UT_StringHolder::theEmptyString)
UT_ORMForeignKeyField()=default
static UT_ORMFieldColumn createColumn(const UT_ORMModelMeta &meta, const UT_StringHolder &name, ForeignKey Cls::*member_ptr, unsigned props, UT_ORMColumn::OnDelete ondelete, const UT_StringHolder &related_name=UT_StringHolder::theEmptyString)
bool isSame(const void *obj_left, const void *obj_right, UT_ErrorCode &ec) const finaloverride
typename ForeignKey::foreign_key_t id_t
A reference counter base class for use with UT_IntrusivePtr.
const UT_StringHolder & m2mReverseFieldName() const
void setValue(const ModelT &value)
std::unique_ptr< T, Deleter > UT_UniquePtr
A smart pointer for unique ownership of dynamically allocated objects.
bool operator==(const UT_ORMForeignKeyField &rhs) const
UT_ORMColumn::Type sqlType() const override
void load(void *obj, UT_SqlStatement &stmt, int index, UT_ErrorCode &ec) override
UT_ORMForeignKeyField(foreign_key_t pk)
GLint GLint GLsizei GLint GLenum GLenum type
typename ForeignKey::model_t model_t
UT_IORMFieldAdapter * adapter()
UT_StringHolder myM2MFieldName
const UT_StringHolder & m2mFieldName() const
MemberT & field(void *obj)
static void memberSetter(UT_IORMFieldAdapter *me, void *obj, const void *value, UT_ErrorCode &ec)
std::shared_ptr< T > UT_SharedPtr
Wrapper around std::shared_ptr.
bool isSame(const void *obj_left, const void *obj_right, UT_ErrorCode &ec) const finaloverride
static const UT_StringHolder theEmptyString
UT_SharedPtr< UT_ORMModelMeta > foreignModel() const
IMATH_HOSTDEVICE constexpr Color4< T > operator*(S a, const Color4< T > &v) IMATH_NOEXCEPT
Reverse multiplication: S * Color4.
MemberT & getValue(void *obj)
GLuint const GLchar * name
static UT_ORMFieldColumn createColumn(const UT_StringHolder &name, MemberT Cls::*member_ptr, unsigned props)
void bind(const void *obj, UT_SqlStatement &stmt, int index, UT_ErrorCode &ec) override
static void memberGetter(UT_IORMFieldAdapter *me, const void *obj, void *value, UT_ErrorCode &ec)
std::error_code UT_ErrorCode
const ForeignKey & field(const void *obj) const
void setValue(Cls &obj, const MemberT &member_value, UT_ErrorCode &ec)
UT_ORMBasicFieldAdapter(MemberT Cls::*member_ptr)
LeafData & operator=(const LeafData &)=delete
UT_UniquePtr< UT_IORMFieldAdapter > myFieldPtr
Class to store JSON objects as C++ objects.
void setValue(void *obj, const MemberT &t)
bool operator!=(const UT_ORMForeignKeyField &rhs) const
void onDelete(void *obj, UT_ORMColumn::OnDelete ondelete, UT_ErrorCode &ec) override
UT_StringHolder myThroughModelName
UT_ORMForeignKeyFieldAdapter(ForeignKey Cls::*member_ptr)
void setId(const foreign_key_t &id)
const MemberT & field(const void *obj) const
std::weak_ptr< T > UT_WeakPtr
UT_IntrusivePtr< PointerHolder > model_pointer_t
void load(void *obj, UT_SqlStatement &stmt, int index, UT_ErrorCode &ec) override
GLenum GLuint GLsizei const GLenum * props