58 #ifndef __UT_ORMMANYTOMANYFIELD_H__
59 #define __UT_ORMMANYTOMANYFIELD_H__
79 explicit inline operator bool()
const {
return isValid(); }
83 return myThrough !=
nullptr;
86 template <
typename LObjT,
typename RObjT>
94 template <
typename LObjT,
typename RObjT>
100 = myThrough->findForeignRelatedField(mySourceFieldName);
102 = myThrough->findForeignRelatedField(myTargetFieldName);
103 if (source_obj_field !=
nullptr && target_obj_field !=
nullptr)
107 meta.
db(), [ec]() {
return !ec; },
111 for (
auto&& new_item : new_list_obj)
116 mySourceFieldName, source_obj_field,
119 myTargetFieldName, target_obj_field,
129 ec = tran.entryFailure();
139 template <
typename LObjT,
typename RObjT>
145 = myThrough->findForeignRelatedField(myTargetFieldName);
147 if (target_obj_field !=
nullptr)
149 using r_pk_obj_t =
typename RObjT::Meta::primary_key_t;
159 removeIds(obj, values, ec);
168 template <
typename LObjT,
typename RObjValueT>
177 = myThrough->findForeignRelatedField(mySourceFieldName);
180 remove_in_str.
format(
"{}__in", myTargetFieldName);
184 mySourceFieldName, source_obj_field, &obj),
194 template <
typename LObjT,
typename RObjT>
205 meta.
db(), [&ec]() {
return !ec; },
214 add(obj, new_items, ec);
219 = myThrough->findForeignRelatedField(
222 = myThrough->findForeignRelatedField(
224 if (source_obj_field !=
nullptr && target_obj_field)
227 typename RObjT::Meta::primary_key_t;
233 source_obj_field, &obj)})
234 .
values({myTargetFieldName})
244 for (
auto&&
value : result)
247 =
value.stmt().get<r_pk_field_t>(0);
252 for (
auto&& new_item : new_items)
265 if (old_ids[i] == fk_v)
279 removeIds(obj, old_ids, ec);
280 add(obj, add_items, ec);
286 ec = tran.entryFailure();
295 template <
typename LObjT>
301 = myThrough->findForeignRelatedField(mySourceFieldName);
302 if (source_obj_field !=
nullptr)
308 source_obj_field, &obj)})
320 template <
typename LObjT,
typename RObjT>
331 for (
auto&&
value : result)
334 if (
value.load(obj, ec))
342 template <
typename LObjT,
typename RObjT>
349 = myThrough->findForeignRelatedField(mySourceFieldName);
351 if (source_obj_field !=
nullptr)
355 "{}__{}", myQueryFieldName, source_obj_field->
name());
358 filter_name, source_obj_field, &obj)});
385 template <
typename Owner,
typename OtherModel>
393 : myOwner(owner), myFieldName(field_name), myRightMeta(rmeta)
406 bool do_clear =
false);
415 if (!myHasLookedForManager)
417 myHasLookedForManager =
true;
419 myOwner.get().meta(), myRightMeta, myFieldName);
421 return myManyManager;
428 bool myHasLookedForManager =
false;
431 std::reference_wrapper<Owner> myOwner;
435 template <
typename Owner,
typename Model>
439 return manager().template add<Owner, Model>(myOwner, rmodel, ec);
442 template <
typename Owner,
typename Model>
448 return manager().template add<Owner, Model>(myOwner, rmodels, ec);
451 template <
typename Owner,
typename Model>
455 return manager().template all<Owner, Model>(myOwner, ec, myRightMeta);
458 template <
typename Owner,
typename Model>
462 return manager().template all<Owner, Model>(myOwner, myRightMeta);
465 template <
typename Owner,
typename Model>
471 return manager().template remove<Owner, Model>(myOwner, model, ec);
474 template <
typename Owner,
typename Model>
478 return manager().template clear<Owner>(myOwner, ec);
481 template <
typename Owner,
typename OtherModel>
488 return manager().template set<Owner, OtherModel>(
489 myOwner, items, do_clear, ec);
492 #endif // __UT_ORMMANYTOMANYFIELD_H__
void getValue(const Cls &obj, MemberT &member_value, UT_ErrorCode &ec)
const UT_StringHolder & name() const
void clear(UT_ErrorCode &ec)
UT_ORMQuerySetResult error(UT_ErrorCode ec)
void set(LObjT &obj, const UT_Array< RObjT > &new_items, bool do_clear, UT_ErrorCode &ec)
GLsizei const GLfloat * value
SYS_FORCE_INLINE T * SYSconst_cast(const T *foo)
void removeIds(LObjT &obj, const UT_Array< RObjValueT > &values, UT_ErrorCode &ec)
exint removeIndex(exint index)
void remove(const OtherModel &model, UT_ErrorCode &ec)
static UT_ORMManyToManyManager lookupM2MManager(const UT_ORMModelMeta &meta, const UT_ORMModelMeta &other_meta, const UT_StringHolder &field_name)
UT_ORMManyToManyField(Owner &owner, const UT_StringHolder &field_name=UT_StringHolder::theEmptyString, const UT_ORMModelMeta &rmeta=OtherModel::metaInfo())
**But if you need a result
UT_ORMQuerySet filter(const std::initializer_list< UT::orm::FilterArg > &args)
UT_ORMQuerySet all() const
UT_IORMFieldAdapter * adapter()
exint emplace_back(S &&...s)
std::shared_ptr< T > UT_SharedPtr
Wrapper around std::shared_ptr.
static const UT_StringHolder theEmptyString
UT_ORMQuerySet all(LObjT &obj, const UT_ORMModelMeta &rmeta) const
void addBulk(const UT_Array< OtherModel > &rmodels, UT_ErrorCode &ec)
const UT_ErrorCode & getError() const
void set(const UT_Array< OtherModel > &rmodels, UT_ErrorCode &ec, bool do_clear=false)
size_t format(const char *fmt, const Args &...args)
Format a string using the same formatting codes as UTformat.
std::error_code UT_ErrorCode
auto UTmakeErrorCode(EnumT e) -> decltype(make_error_code(e))
Make a UT_ErrorCode based on the provided namespaced enum class.
void add(LObjT &obj, const UT_Array< RObjT > &new_list_obj, UT_ErrorCode &ec)
UT_ORMQuerySetResult get()
void add(const OtherModel &rmodel, UT_ErrorCode &ec)
GLenum GLsizei GLsizei GLint * values
UT_ORMQuerySetResult create(const std::initializer_list< UT::orm::FilterArg > &args, bool ignore_conflicts=false, bool no_return=false)
void add(LObjT &obj, const RObjT &new_list_obj, UT_ErrorCode &ec)
void clear(LObjT &obj, UT_ErrorCode &ec)
void setOwner(Owner &owner)
ImageBuf OIIO_API add(Image_or_Const A, Image_or_Const B, ROI roi={}, int nthreads=0)
UT_Array< RObjT > all(LObjT &obj, UT_ErrorCode &ec, const UT_ORMModelMeta &rmeta) const