/**************************************************************************** ** ** https://www.qxorm.com/ ** Copyright (C) 2013 XDL Team (ic-east.com) ** ** This file is part of the QxOrm library ** ** This software is provided 'as-is', without any express or implied ** warranty. In no event will the authors be held liable for any ** damages arising from the use of this software ** ** Commercial Usage ** Licensees holding valid commercial QxOrm licenses may use this file in ** accordance with the commercial license agreement provided with the ** Software or, alternatively, in accordance with the terms contained in ** a written agreement between you and XDL Team ** ** GNU General Public License Usage ** Alternatively, this file may be used under the terms of the GNU ** General Public License version 3.0 as published by the Free Software ** Foundation and appearing in the file 'license.gpl3.txt' included in the ** packaging of this file. Please review the following information to ** ensure the GNU General Public License version 3.0 requirements will be ** met : http://www.gnu.org/copyleft/gpl.html ** ** If you are unsure which license is appropriate for your use, or ** if you have questions regarding the use of this file, please contact : ** ic-east.com ** ****************************************************************************/ #ifndef _IX_SQL_RELATION_H_ #define _IX_SQL_RELATION_H_ #ifdef _MSC_VER #pragma once #endif /*! * \file IxSqlRelation.h * \author XDL Team * \ingroup QxDao * \brief Common interface for all relationships defined between 2 classes (or between 2 tables in database) */ #include #include #include #include #include namespace qx { class IxClass; class IxDataMember; class IxDataMemberX; class IxSqlRelation; typedef QxCollection IxSqlRelationX; typedef std::shared_ptr IxSqlRelationX_ptr; /*! * \ingroup QxDao * \brief qx::IxSqlRelation : common interface for all relationships defined between 2 classes (or between 2 tables in database) */ class QX_DLL_EXPORT IxSqlRelation : public qx::QxPropertyBag { private: struct IxSqlRelationImpl; std::unique_ptr m_pImpl; //!< Private implementation idiom public: enum relation_type { no_relation, one_to_one, one_to_many, many_to_one, many_to_many }; IxSqlRelation(IxDataMember *p); virtual ~IxSqlRelation() = 0; QxCollection *getLstDataMember() const; IxSqlRelationX *getLstRelation() const; void setSqlJoinType(qx::dao::sql_join::join_type e); qx::dao::sql_join::join_type getSqlJoinType() const; relation_type getRelationType() const; IxClass *getClass() const; IxClass *getClassOwner() const; IxDataMember *getDataMember() const; IxDataMemberX *getDataMemberX() const; IxDataMember *getDataId() const; IxDataMember *getDataIdOwner() const; void linkRelationKeyTo(IxDataMember *p); IxDataMember *getLinkRelationKey() const; QString getKey() const; QString getForeignKey() const; QString getForeignKeyOwner() const; QString getForeignKeyDataType() const; QString getExtraTable() const; long getDataCount() const; long getRelationCount() const; IxDataMember *getDataByKey(const QString &sKey) const; IxDataMember *nextData(long &lIndex) const; IxSqlRelation *nextRelation(long &lIndex) const; QString table() const; QString tableAlias(QxSqlRelationParams ¶ms) const; QString tableAliasOwner(QxSqlRelationParams ¶ms) const; QString getSqlJoin(qx::dao::sql_join::join_type e = qx::dao::sql_join::no_join) const; bool traceSqlQuery() const; virtual void init(); virtual QString getDescription() const = 0; virtual QString createExtraTable() const = 0; virtual bool getCartesianProduct() const = 0; virtual QVariant getIdFromQuery(bool bEager, QxSqlRelationParams ¶ms, int iOffset, int iNameIndex) const = 0; virtual void updateOffset(bool bEager, QxSqlRelationParams ¶ms) const = 0; virtual void createTable(QxSqlRelationParams ¶ms) const = 0; virtual void lazySelect(QxSqlRelationParams ¶ms) const = 0; virtual void eagerSelect(QxSqlRelationParams ¶ms) const = 0; virtual void lazyFrom(QxSqlRelationParams ¶ms) const = 0; virtual void eagerFrom(QxSqlRelationParams ¶ms) const = 0; virtual void lazyJoin(QxSqlRelationParams ¶ms) const = 0; virtual void eagerJoin(QxSqlRelationParams ¶ms) const = 0; virtual void lazyWhere(QxSqlRelationParams ¶ms) const = 0; virtual void eagerWhere(QxSqlRelationParams ¶ms) const = 0; virtual void lazyWhereSoftDelete(QxSqlRelationParams ¶ms) const = 0; virtual void eagerWhereSoftDelete(QxSqlRelationParams ¶ms) const = 0; virtual void lazyFetch_ResolveInput(QxSqlRelationParams ¶ms) const = 0; virtual void eagerFetch_ResolveInput(QxSqlRelationParams ¶ms) const = 0; virtual void lazyFetch_ResolveOutput(QxSqlRelationParams ¶ms) const = 0; virtual void *eagerFetch_ResolveOutput(QxSqlRelationParams ¶ms) const = 0; virtual void lazyInsert(QxSqlRelationParams ¶ms) const = 0; virtual void lazyInsert_Values(QxSqlRelationParams ¶ms) const = 0; virtual void lazyUpdate(QxSqlRelationParams ¶ms) const = 0; virtual void lazyInsert_ResolveInput(QxSqlRelationParams ¶ms) const = 0; virtual void lazyUpdate_ResolveInput(QxSqlRelationParams ¶ms) const = 0; virtual QSqlError onBeforeSave(QxSqlRelationParams ¶ms) const = 0; virtual QSqlError onAfterSave(QxSqlRelationParams ¶ms) const = 0; bool verifyOffset(QxSqlRelationParams ¶ms, bool bId) const QX_USED; static void setTraceRelationInit(bool bTrace); protected: QVariant getIdFromQuery_ManyToMany(bool bEager, QxSqlRelationParams ¶ms, int iOffset, int iNameIndex) const; QVariant getIdFromQuery_ManyToOne(bool bEager, QxSqlRelationParams ¶ms, int iOffset, int iNameIndex) const; QVariant getIdFromQuery_OneToMany(bool bEager, QxSqlRelationParams ¶ms, int iOffset, int iNameIndex) const; QVariant getIdFromQuery_OneToOne(bool bEager, QxSqlRelationParams ¶ms, int iOffset, int iNameIndex) const; void updateOffset_ManyToMany(bool bEager, QxSqlRelationParams ¶ms) const; void updateOffset_ManyToOne(bool bEager, QxSqlRelationParams ¶ms) const; void updateOffset_OneToMany(bool bEager, QxSqlRelationParams ¶ms) const; void updateOffset_OneToOne(bool bEager, QxSqlRelationParams ¶ms) const; void eagerSelect_ManyToMany(QxSqlRelationParams ¶ms) const; void eagerSelect_ManyToOne(QxSqlRelationParams ¶ms) const; void eagerSelect_OneToMany(QxSqlRelationParams ¶ms) const; void eagerSelect_OneToOne(QxSqlRelationParams ¶ms) const; void eagerJoin_ManyToMany(QxSqlRelationParams ¶ms) const; void eagerJoin_ManyToOne(QxSqlRelationParams ¶ms) const; void eagerJoin_OneToMany(QxSqlRelationParams ¶ms) const; void eagerJoin_OneToOne(QxSqlRelationParams ¶ms) const; void eagerWhereSoftDelete_ManyToMany(QxSqlRelationParams ¶ms) const; void eagerWhereSoftDelete_ManyToOne(QxSqlRelationParams ¶ms) const; void eagerWhereSoftDelete_OneToMany(QxSqlRelationParams ¶ms) const; void eagerWhereSoftDelete_OneToOne(QxSqlRelationParams ¶ms) const; void lazySelect_ManyToOne(QxSqlRelationParams ¶ms) const; void lazyInsert_ManyToOne(QxSqlRelationParams ¶ms) const; void lazyInsert_Values_ManyToOne(QxSqlRelationParams ¶ms) const; void lazyUpdate_ManyToOne(QxSqlRelationParams ¶ms) const; void createTable_ManyToOne(QxSqlRelationParams ¶ms) const; QSqlError deleteFromExtraTable_ManyToMany(QxSqlRelationParams ¶ms) const; QString createExtraTable_ManyToMany() const; bool addLazyRelation(QxSqlRelationParams ¶ms, IxSqlRelation *pRelation) const; bool canInit() const; void setIsSameDataOwner(int i); void setClass(IxClass *pClass, IxClass *pClassOwner); void setRelationType(relation_type e); void setForeignKey(const QString &s) const; void setForeignKeyOwner(const QString &s) const; void setForeignKeyDataType(const QString &s) const; void setExtraTable(const QString &s) const; }; } // namespace qx #endif // _IX_SQL_RELATION_H_