17 #ifndef __UT_ORMMODELMETA_H__
18 #define __UT_ORMMODELMETA_H__
42 template <
typename Owner,
typename OtherModel>
69 if (!myPluralVerboseName)
70 myPluralVerboseName =
name;
78 myPluralVerboseName =
name;
86 virtual void collectMigrations(
93 template <
typename Cls,
typename FieldT>
99 myColumns.emplace_back(
103 template <
typename Cls,
typename FieldT>
109 myColumns.emplace_back(
111 name, field,
props));
113 template <
typename Cls,
typename ForeignModel>
119 = UT_ORMColumn::OnDelete::Cascade,
126 myColumns.emplace_back(adapter_t::createColumn(
127 foreign_meta, name, field,
props, ondelete_type, related_name));
129 template <
typename Owner,
typename OtherModel>
136 UT_ASSERT(modelName() == Owner::metaInfo().modelName());
137 auto self = lookupMetaFromORM_(modelName());
138 auto other = lookupMetaFromORM_(OtherModel::metaInfo().modelName());
139 registerM2M_(
self, other, name, related_name);
147 return myPluralVerboseName;
153 return myForeignKeys;
157 return myUniqueColumns;
160 template <
typename T>
164 bool force_insert =
false,
165 bool force_update =
false)
const;
166 template <
typename T>
168 template <
typename T>
170 const std::initializer_list<UT::orm::FilterArg>&
args,
172 template <
typename T,
typename PK>
174 template <
typename T>
176 const std::initializer_list<UT::orm::FilterArg>&
args,
178 template <
typename T>
180 template <
typename T>
182 const std::initializer_list<UT::orm::FilterArg>&
args,
184 template <
typename T>
185 std::pair<T, bool> getOrCreate(
186 const std::initializer_list<UT::orm::FilterArg>&
args,
188 template <
typename T>
190 const std::initializer_list<UT::orm::FilterArg>&
args,
192 template <
typename T,
typename ArrayT>
198 template <
typename T>
200 template <
typename T,
typename... Args>
203 T obj(std::forward<Args>(
args)...);
204 obj.myOrmAdding =
false;
207 template <
typename T>
209 const std::initializer_list<UT::orm::FilterArg>&
args,
217 template <
typename T>
220 for (
int i = 0; i < myColumns.size(); i++)
227 adapter->load(&obj, stmt, i, ec);
242 obj.myOrmAdding =
false;
246 template <
typename T>
253 if (loadObject(obj, stmt, ec))
268 myHasPostBuilt =
false;
269 myHasPostMigrate =
false;
270 myIsThroughTable =
false;
272 myForeignKeys.clear();
273 myUniqueColumns.clear();
275 myPrimaryKey =
nullptr;
281 for (
auto&& col : myColumns)
291 for (
auto&& col : myColumns)
304 if (local_field !=
nullptr)
308 if (foreign_model !=
nullptr)
313 = foreign_model->findField(foreign_related_field_name);
314 return foreign_field;
320 bool registerRelated(
332 void lookupTableColumns(
351 , myForeignKeyName(fk_name)
352 , myForeignMeta(foreign_meta)
367 virtual void doBuild() = 0;
369 virtual void doPostMigrate();
372 void configureConcrete_();
383 template <
typename T>
385 template <
typename T>
395 bool myHasBuilt =
false;
396 bool myHasPostBuilt =
false;
397 bool myHasPostMigrate =
false;
398 bool myIsThroughTable =
false;
411 template <
typename T>
417 bool force_update)
const
421 if (!force_insert && !force_update && obj.myOrmAdding)
424 bool updated =
false;
429 if (force_update && !updated)
441 obj.myOrmAdding =
false;
446 template <
typename T>
453 if (!col.isPrimaryKey() && !col.isManyToMany())
469 template <
typename T>
480 if (!col.isManyToMany())
482 if (col.isAutoIncrement())
493 for (
exint i = 0; i < values.
size(); i++)
506 sql_query.
append(
" VALUES (");
507 for (
exint i = 0; i < values.
size(); i++)
519 if (outputs.
size() > 0)
521 sql_query.
append(
" RETURNING ");
541 if (!stmt.
prepare(sql_query, ec))
545 for (
int i = 0; i < values.
size(); i++)
551 adapter->bind(&obj, stmt, i+1, ec);
566 if (changes > 0 && outputs.
size() > 0)
573 adapter->load(&obj, stmt, i, ec);
586 template <
typename T>
608 adapter->
onDelete(&obj, meta_column.onDelete(), ec);
615 template <
typename T>
618 const std::initializer_list<UT::orm::FilterArg>&
args,
626 template <
typename T>
629 const std::initializer_list<UT::orm::FilterArg>&
args,
636 for (
auto&& record : result)
645 if (result.getError())
646 ec = result.getError();
651 template <
typename T,
typename PK>
665 return std::make_optional<T>(item);
671 template <
typename T>
679 for (
auto&& record : result)
688 if (result.getError())
689 ec = result.getError();
694 template <
typename T>
697 const std::initializer_list<UT::orm::FilterArg>&
args,
713 template <
typename T>
716 const std::initializer_list<UT::orm::FilterArg>&
args,
729 if (result.
load(obj, ec))
736 template <
typename T>
739 const std::initializer_list<UT::orm::FilterArg>&
args,
742 if (
auto&& found_obj =
filter<T>(args, ec); found_obj)
744 return std::make_pair(std::move(found_obj.value()),
false);
748 return std::make_pair(
T(),
false);
752 if (
auto&& created_obj = create<T>(args, ec); created_obj)
755 return std::make_pair(std::move(created_obj.value()),
true);
760 return std::make_pair(
T(),
false);
762 if (
auto&& found_obj =
filter<T>(args, ec); found_obj)
764 return std::make_pair(std::move(found_obj.value()),
false);
773 return std::make_pair(
T(),
false);
776 template <
typename T,
typename ArrayT>
811 for (
int i = 0,
c=pks.size(); i<
c; i++)
825 for (
auto&& pk : pks)
827 stmt.
bind(index, pk);
844 template <
typename T>
851 wbuf.
append(
"INSERT INTO ");
873 for (
int i = 0, c = items.
size(); i <
c; i++)
885 for (
auto&& item : items)
889 if (!col.isAutoIncrement())
913 template <
typename T>
916 const std::initializer_list<UT::orm::FilterArg>&
args,
923 #endif // __UT_ORMMODELMETA_H__
const UT_StringHolder & name() const
const UT_ErrorCode & getError() const
bool bind(int idx, null_tag_t)
bool isManyToMany() const
SYS_FORCE_INLINE T * SYSconst_cast(const T *foo)
virtual void onDelete(void *obj, UT_ORMColumn::OnDelete ondelete, UT_ErrorCode &ec)
**But if you need a result
UT_ORMQuerySet filter(const std::initializer_list< UT::orm::FilterArg > &args)
std::optional< T > UT_Optional
A utility class to do read-only operations on a subset of an existing string.
size_t appendFormat(const char *fmt, const Args &...args)
UT_IORMFieldAdapter * adapter()
exint emplace_back(S &&...s)
bool isAutoIncrement() const
std::shared_ptr< T > UT_SharedPtr
Wrapper around std::shared_ptr.
GA_API const UT_StringHolder trans
static const UT_StringHolder theEmptyString
#define UT_NON_COPYABLE(CLASS)
Define deleted copy constructor and assignment operator inside a class.
UT_SharedPtr< UT_ORMModelMeta > foreignModel() const
const UT_ErrorCode & getError() const
bool load(T &obj, UT_ErrorCode &ec)
OIIO_UTIL_API bool exists(string_view path) noexcept
GLuint const GLchar * name
void commit(UT_ErrorCode *ec=nullptr)
UT_ORMQuerySetResult remove()
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.
const UT_StringHolder & foreignFieldName() const
UT_ORMQuerySetResult get()
GLenum GLsizei GLsizei GLint * values
UT_ORMQuerySetResult create(const std::initializer_list< UT::orm::FilterArg > &args, bool ignore_conflicts=false, bool no_return=false)
SYS_FORCE_INLINE void append(char character)
**If you just want to fire and args
UT_ORMQuerySet limit(int limit)
void clear()
Resets list to an empty list.
GLenum GLenum GLsizei void GLsizei void * column
std::weak_ptr< T > UT_WeakPtr
bool exists(UT_ErrorCode &ec)
GLenum GLuint GLsizei const GLenum * props
GLint GLint GLint GLint GLint GLint GLint GLbitfield GLenum filter
bool prepare(const UT_StringRef &sql, UT_ErrorCode &ec)