32#ifndef _QX_SQL_RELATION_MANY_TO_MANY_H_
33#define _QX_SQL_RELATION_MANY_TO_MANY_H_
54template <
class DataType,
class Owner>
112 if (! this->
verifyOffset(params,
true)) {
return NULL; }
113 QSqlQuery & query = params.
query();
115 long lIndex = 0;
long lOffsetId = ((pId && (! params.
isDistinct())) ? pId->
getNameCount() : 0);
bool bValidId(
false);
123 if (! bValidId) {
return NULL; }
127 type_data & item_val = item.value_qx();
143 long lOffsetRelation = (lOffsetOld + lOffsetId);
long lCurrIndex = 0;
144 while ((p = this->
nextData(lIndex)))
149 long lOffsetCurrent = (lCurrIndex + lOffsetRelation);
152 void * pOwnerOld = params.
owner(); params.
setOwner(& item_val);
163 if (! type_item::is_value_pointer && pValue) {
return pValue; }
173 if (daoError.isValid()) {
return daoError; }
175 if (daoError.isValid()) {
return daoError; }
177 if (daoError.isValid()) {
return daoError; }
196 if (! pIdOwner || ! pIdData) {
return QSqlError(); }
208 if (this->
traceSqlQuery()) { qDebug(
"[QxOrm] sql query (extra-table) : %s", qPrintable(sql)); }
212 type_iterator itr = type_generic_container::begin(container, item);
213 type_iterator itr_end = type_generic_container::end(container);
214 QSqlQuery queryInsert(params.
database());
215 if (! queryInsert.prepare(sql)) {
return queryInsert.lastError(); }
217 while (itr != itr_end)
220 pIdData->
setSqlPlaceHolder(queryInsert, (& item.value_qx()),
"", this->getForeignKeyDataType());
221 if (! queryInsert.exec()) {
return queryInsert.lastError(); }
222 itr = type_generic_container::next(container, itr, item);
Base class for all relationships defined between 2 classes (or between 2 tables in database)
qx::IxDataMember : common interface for all class properties registered into QxOrm context
QString getSqlPlaceHolder(const QString &sAppend=QString(), int iIndexName=0, const QString &sSep=QString(", "), const QString &sOtherName=QString(), bool bCheckFKPartOfPK=false) const
virtual qx_bool fromVariant(void *pOwner, const QVariant &v, const QString &sFormat, int iIndexName=-1, qx::cvt::context::ctx_type ctx=qx::cvt::context::e_no_context)=0
void setSqlPlaceHolder(QSqlQuery &query, void *pOwner, const QString &sAppend=QString(), const QString &sOtherName=QString(), bool bCheckFKPartOfPK=false, qx::QxCollection< QString, QVariantList > *pLstExecBatch=NULL) const
QString getSqlName(const QString &sSep=QString(", "), const QString &sOtherName=QString(), bool bCheckFKPartOfPK=false, qx::IxSqlQueryBuilder *pSqlQueryBuilder=NULL) const
qx::IxSqlRelation : common interface for all relationships defined between 2 classes (or between 2 ta...
bool addLazyRelation(QxSqlRelationParams ¶ms, IxSqlRelation *pRelation) const
void setForeignKeyDataType(const QString &s) const
QSqlError deleteFromExtraTable_ManyToMany(QxSqlRelationParams ¶ms) const
QString getExtraTable() const
QString createExtraTable_ManyToMany() const
bool traceSqlQuery() const
IxDataMember * getDataId() const
void eagerWhereSoftDelete_ManyToMany(QxSqlRelationParams ¶ms) const
virtual void lazyFetch_ResolveOutput(QxSqlRelationParams ¶ms) const =0
bool verifyOffset(QxSqlRelationParams ¶ms, bool bId) const QX_USED
QString getForeignKeyDataType() const
void setExtraTable(const QString &s) const
QString getForeignKeyOwner() const
IxDataMember * nextData(long &lIndex) const
void eagerSelect_ManyToMany(QxSqlRelationParams ¶ms) const
void updateOffset_ManyToMany(bool bEager, QxSqlRelationParams ¶ms) const
IxSqlRelation * nextRelation(long &lIndex) const
IxDataMember * getDataIdOwner() const
void eagerJoin_ManyToMany(QxSqlRelationParams ¶ms) const
void setRelationType(relation_type e)
QVariant getIdFromQuery_ManyToMany(bool bEager, QxSqlRelationParams ¶ms, int iOffset, int iNameIndex) const
void setForeignKeyOwner(const QString &s) const
qx::QxSqlRelation_ManyToMany<DataType, Owner> : manage a relationship many-to-many defined between 2 ...
virtual void eagerSelect(QxSqlRelationParams ¶ms) const
virtual void updateOffset(bool bEager, QxSqlRelationParams ¶ms) const
virtual void lazyFetch_ResolveInput(QxSqlRelationParams ¶ms) const
QxSqlRelation< DataType, Owner >::type_generic_container type_generic_container
QxSqlRelation< DataType, Owner >::type_container type_container
virtual QSqlError onBeforeSave(QxSqlRelationParams ¶ms) const
virtual void lazyWhereSoftDelete(QxSqlRelationParams ¶ms) const
virtual QVariant getIdFromQuery(bool bEager, QxSqlRelationParams ¶ms, int iOffset, int iNameIndex) const
QxSqlRelation< DataType, Owner >::type_item type_item
virtual void lazyInsert(QxSqlRelationParams ¶ms) const
QxSqlRelation_ManyToMany(IxDataMember *p, const QString &sExtraTable, const QString &sForeignKeyOwner, const QString &sForeignKeyDataType)
virtual QString createExtraTable() const
virtual void * eagerFetch_ResolveOutput(QxSqlRelationParams ¶ms) const
QSqlError deleteFromExtraTable(QxSqlRelationParams ¶ms) const
virtual ~QxSqlRelation_ManyToMany()
virtual void lazyInsert_ResolveInput(QxSqlRelationParams ¶ms) const
virtual void lazySelect(QxSqlRelationParams ¶ms) const
virtual void createTable(QxSqlRelationParams ¶ms) const
virtual void eagerFetch_ResolveInput(QxSqlRelationParams ¶ms) const
virtual void eagerWhere(QxSqlRelationParams ¶ms) const
QSqlError insertIntoExtraTable(QxSqlRelationParams ¶ms) const
virtual void lazyFrom(QxSqlRelationParams ¶ms) const
virtual void lazyUpdate_ResolveInput(QxSqlRelationParams ¶ms) const
virtual void eagerFrom(QxSqlRelationParams ¶ms) const
type_generic_container::type_iterator type_iterator
virtual void eagerJoin(QxSqlRelationParams ¶ms) const
virtual void lazyWhere(QxSqlRelationParams ¶ms) const
virtual void lazyInsert_Values(QxSqlRelationParams ¶ms) const
QxSqlRelation< DataType, Owner >::type_data type_data
type_item::type_value type_value
virtual void eagerWhereSoftDelete(QxSqlRelationParams ¶ms) const
virtual void lazyFetch_ResolveOutput(QxSqlRelationParams ¶ms) const
QxSqlRelation< DataType, Owner >::type_owner type_owner
virtual void lazyJoin(QxSqlRelationParams ¶ms) const
virtual void lazyUpdate(QxSqlRelationParams ¶ms) const
virtual QSqlError onAfterSave(QxSqlRelationParams ¶ms) const
virtual bool getCartesianProduct() const
virtual QString getDescription() const
qx::QxSqlRelation<DataType, Owner> : base class for all relationships defined between 2 classes (or b...
bool callTriggerBeforeFetch(type_data &t, QxSqlRelationParams ¶ms) const
bool isNullData(QxSqlRelationParams ¶ms) const
QxSqlRelation< DataType, Owner >::type_tmp_3 type_data
type_tmp_2 type_container
type_container & getContainer(QxSqlRelationParams ¶ms) const
bool callTriggerAfterFetch(type_data &t, QxSqlRelationParams ¶ms) const
type_item createItem() const
qx::QxSqlRelationParams : define list of parameters to transfer to relationships to manage SQL querie...
void setOwner(void *pOwner)
void setCustomAliasOwner(const QString &s)
void setOffset(long lOffset)
IxSqlQueryBuilder & builder()
void setIndexOwner(long lIndex)
QString getCustomAlias() const
QSqlDatabase & database()
bool checkColumns(const QString &s) const
qx::dao::save_mode::e_save_mode saveMode() const
QString getCustomAliasOwner() const
type_lst_relation_linked * relationX() const
bool recursiveMode() const
QSqlError save(T &t, QSqlDatabase *pDatabase=NULL)
Insert (if no exist) or update (if already exist) an element or a list of elements into database.
QSqlError save_with_relation_recursive(T &t, qx::dao::save_mode::e_save_mode eSaveMode=qx::dao::save_mode::e_check_insert_or_update, QSqlDatabase *pDatabase=NULL, qx::QxSqlRelationParams *pRelationParams=NULL)
Insert (if no exist) or update (if already exist) recursively an element and all levels of relationsh...
qx_bool from_variant(const QVariant &v, T &t, const QString &format=QString(), int index=-1, qx::cvt::context::ctx_type ctx=qx::cvt::context::e_no_context)
bool is_valid_primary_key(const T &t)
Root namespace for all QxOrm library features.
qx::trait::generic_container<T> : provide some tools to manage all containers without knowing its typ...