QxDataMemberX.inl 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  1. /****************************************************************************
  2. **
  3. ** https://www.qxorm.com/
  4. ** Copyright (C) 2013 Lionel Marty (contact@qxorm.com)
  5. **
  6. ** This file is part of the QxOrm library
  7. **
  8. ** This software is provided 'as-is', without any express or implied
  9. ** warranty. In no event will the authors be held liable for any
  10. ** damages arising from the use of this software
  11. **
  12. ** Commercial Usage
  13. ** Licensees holding valid commercial QxOrm licenses may use this file in
  14. ** accordance with the commercial license agreement provided with the
  15. ** Software or, alternatively, in accordance with the terms contained in
  16. ** a written agreement between you and Lionel Marty
  17. **
  18. ** GNU General Public License Usage
  19. ** Alternatively, this file may be used under the terms of the GNU
  20. ** General Public License version 3.0 as published by the Free Software
  21. ** Foundation and appearing in the file 'license.gpl3.txt' included in the
  22. ** packaging of this file. Please review the following information to
  23. ** ensure the GNU General Public License version 3.0 requirements will be
  24. ** met : http://www.gnu.org/copyleft/gpl.html
  25. **
  26. ** If you are unsure which license is appropriate for your use, or
  27. ** if you have questions regarding the use of this file, please contact :
  28. ** contact@qxorm.com
  29. **
  30. ****************************************************************************/
  31. namespace qx {
  32. template <class T>
  33. IxDataMember * QxDataMemberX<T>::initId(IxDataMember * pId, long lVersion)
  34. {
  35. if (! pId) { qAssert(false); return NULL; }
  36. qAssert(lVersion <= getVersion());
  37. QString sKey = pId->getKey();
  38. pId->setSqlType(qx::trait::get_sql_type<typename QxDataMemberX<T>::type_primary_key>::get());
  39. pId->setAutoIncrement(std::is_integral<typename QxDataMemberX<T>::type_primary_key>::value);
  40. pId->setNameParent(getName());
  41. pId->setIsPrimaryKey(true);
  42. pId->setNotNull(true);
  43. pId->setVersion(lVersion);
  44. pId->setParent(this);
  45. this->setId(pId);
  46. this->getListDataMemberRef().insert(sKey, pId);
  47. return pId;
  48. }
  49. template <class T>
  50. IxDataMember * QxDataMemberX<T>::initData(IxDataMember * pData, long lVersion)
  51. {
  52. if (! pData) { qAssert(false); return NULL; }
  53. qAssert(lVersion <= getVersion());
  54. QString sKey = pData->getKey();
  55. pData->setVersion(lVersion);
  56. pData->setNameParent(getName());
  57. pData->setParent(this);
  58. this->getListDataMemberRef().insert(sKey, pData);
  59. return pData;
  60. }
  61. template <class T>
  62. template <typename V, typename U>
  63. IxDataMember * QxDataMemberX<T>::add(V U::* pData, const QString & sKey, long lVersion /* = 0 */, bool bSerialize /* = true */, bool bDao /* = true */)
  64. {
  65. typedef std::is_base_of<U, T> is_valid_class_tmp;
  66. static_assert(is_valid_class_tmp::value, "is_valid_class_tmp::value");
  67. if (exist_WithDaoStrategy(sKey)) { qAssert(false); return NULL; }
  68. IxDataMember * pNewDataMember = new QxDataMember<V, T>(pData, sKey, lVersion, bSerialize, bDao);
  69. pNewDataMember->setSqlType(qx::trait::get_sql_type<V>::get());
  70. return this->initData(pNewDataMember, lVersion);
  71. }
  72. template <class T>
  73. IxDataMember * QxDataMemberX<T>::add(const QString & sKey, long lVersion)
  74. {
  75. if (! qx::trait::qt_meta_object<T>::is_valid) { qDebug("[QxOrm] qx::QxDataMemberX<T>::add() : '%s'", "Qt introspection engine works only with QObject class"); qAssert(false); return NULL; }
  76. if (exist_WithDaoStrategy(sKey)) { qAssert(false); return NULL; }
  77. return this->initData(new QxDataMember_QObject(qx::trait::qt_meta_object<T>::get(), sKey), lVersion);
  78. }
  79. template <class T>
  80. IxDataMember * QxDataMemberX<T>::id(typename QxDataMemberX<T>::type_primary_key T::* pDataMemberId, const QString & sKey, long lVersion /* = 0 */)
  81. {
  82. if (getId_WithDaoStrategy()) { qDebug("[QxOrm] qx::QxDataMemberX<T> id (primary key) already defined '%s'", qPrintable(getId_WithDaoStrategy()->getName())); }
  83. if (exist_WithDaoStrategy(sKey) || getId_WithDaoStrategy()) { qAssert(false); return getId_WithDaoStrategy(); }
  84. return this->initId(new QxDataMember<typename QxDataMemberX<T>::type_primary_key, T>(pDataMemberId, sKey), lVersion);
  85. }
  86. template <class T>
  87. IxDataMember * QxDataMemberX<T>::id(const QString & sKey, long lVersion)
  88. {
  89. if (! qx::trait::qt_meta_object<T>::is_valid) { qDebug("[QxOrm] qx::QxDataMemberX<T>::id() : '%s'", "Qt introspection engine works only with QObject class"); qAssert(false); return NULL; }
  90. if (getId_WithDaoStrategy()) { qDebug("[QxOrm] qx::QxDataMemberX<T> id (primary key) already defined '%s'", qPrintable(getId_WithDaoStrategy()->getName())); }
  91. if (exist_WithDaoStrategy(sKey) || getId_WithDaoStrategy()) { qAssert(false); return getId_WithDaoStrategy(); }
  92. return this->initId(new QxDataMember_QObject(qx::trait::qt_meta_object<T>::get(), sKey), lVersion);
  93. }
  94. template <class T>
  95. template <typename V, typename U>
  96. IxSqlRelation * QxDataMemberX<T>::relationOneToOne(V U::* pData, const QString & sKey, long lVersion /* = 0 */)
  97. {
  98. typedef std::is_base_of<U, T> is_valid_class_tmp;
  99. static_assert(is_valid_class_tmp::value, "is_valid_class_tmp::value");
  100. if (exist_WithDaoStrategy(sKey)) { qAssert(false); return NULL; }
  101. IxDataMember * pDataMember = this->add(pData, sKey, lVersion);
  102. IxSqlRelation * pSqlRelation = new QxSqlRelation_OneToOne<V, T>(pDataMember);
  103. pDataMember->setSqlRelation(pSqlRelation);
  104. return pSqlRelation;
  105. }
  106. template <class T>
  107. template <typename V, typename U>
  108. IxSqlRelation * QxDataMemberX<T>::relationManyToOne(V U::* pData, const QString & sKey, long lVersion /* = 0 */)
  109. {
  110. typedef std::is_base_of<U, T> is_valid_class_tmp;
  111. static_assert(is_valid_class_tmp::value, "is_valid_class_tmp::value");
  112. if (exist_WithDaoStrategy(sKey)) { qAssert(false); return NULL; }
  113. IxDataMember * pDataMember = this->add(pData, sKey, lVersion);
  114. IxSqlRelation * pSqlRelation = new QxSqlRelation_ManyToOne<V, T>(pDataMember);
  115. pDataMember->setSqlRelation(pSqlRelation);
  116. return pSqlRelation;
  117. }
  118. template <class T>
  119. template <typename V, typename U>
  120. IxSqlRelation * QxDataMemberX<T>::relationOneToMany(V U::* pData, const QString & sKey, const QString & sForeignKey, long lVersion /* = 0 */)
  121. {
  122. typedef std::is_base_of<U, T> is_valid_class_tmp;
  123. static_assert(is_valid_class_tmp::value, "is_valid_class_tmp::value");
  124. if (exist_WithDaoStrategy(sKey)) { qAssert(false); return NULL; }
  125. IxDataMember * pDataMember = this->add(pData, sKey, lVersion);
  126. IxSqlRelation * pSqlRelation = new QxSqlRelation_OneToMany<V, T>(pDataMember, sForeignKey);
  127. pDataMember->setSqlRelation(pSqlRelation);
  128. return pSqlRelation;
  129. }
  130. template <class T>
  131. template <typename V, typename U>
  132. IxSqlRelation * QxDataMemberX<T>::relationManyToMany(V U::* pData, const QString & sKey, const QString & sExtraTable, const QString & sForeignKeyOwner, const QString & sForeignKeyDataType, long lVersion /* = 0 */)
  133. {
  134. typedef std::is_base_of<U, T> is_valid_class_tmp;
  135. static_assert(is_valid_class_tmp::value, "is_valid_class_tmp::value");
  136. if (exist_WithDaoStrategy(sKey)) { qAssert(false); return NULL; }
  137. IxDataMember * pDataMember = this->add(pData, sKey, lVersion);
  138. IxSqlRelation * pSqlRelation = new QxSqlRelation_ManyToMany<V, T>(pDataMember, sExtraTable, sForeignKeyOwner, sForeignKeyDataType);
  139. pDataMember->setSqlRelation(pSqlRelation);
  140. return pSqlRelation;
  141. }
  142. #ifdef _QX_ENABLE_BOOST_SERIALIZATION
  143. template <class T>
  144. template <class Archive>
  145. inline void QxDataMemberX<T>::toArchive(const T * pOwner, Archive & ar, const unsigned int file_version) const
  146. {
  147. Q_UNUSED(file_version);
  148. const QxCollection<QString, IxDataMember *> & lstDataMember = this->getListDataMemberRef();
  149. _foreach_if(IxDataMember * pDataMember, lstDataMember, (pDataMember->getSerialize()))
  150. pDataMember->toArchive(pOwner, ar);
  151. }
  152. template <class T>
  153. template <class Archive>
  154. inline void QxDataMemberX<T>::fromArchive(T * pOwner, Archive & ar, const unsigned int file_version)
  155. {
  156. Q_UNUSED(file_version);
  157. QxCollection<QString, IxDataMember *> & lstDataMember = this->getListDataMemberRef();
  158. _foreach_if(IxDataMember * pDataMember, lstDataMember, (pDataMember->getSerialize() && (pDataMember->getVersion() <= static_cast<long>(file_version))))
  159. pDataMember->fromArchive(pOwner, ar);
  160. }
  161. #endif // _QX_ENABLE_BOOST_SERIALIZATION
  162. template <> QX_GCC_WORKAROUND_TEMPLATE_SPEC_INLINE
  163. QxDataMemberX<qx::trait::no_base_class_defined>::QxDataMemberX() : IxDataMemberX(), QxSingleton< QxDataMemberX<qx::trait::no_base_class_defined> >("qx::QxDataMemberX_no_base_class_defined") { ; }
  164. template <> QX_GCC_WORKAROUND_TEMPLATE_SPEC_INLINE
  165. QxDataMemberX<QObject>::QxDataMemberX() : IxDataMemberX(), QxSingleton< QxDataMemberX<QObject> >("qx::QxDataMemberX_QObject") { ; }
  166. template <> QX_GCC_WORKAROUND_TEMPLATE_SPEC_INLINE
  167. long QxDataMemberX<qx::trait::no_base_class_defined>::count_WithDaoStrategy_Helper() const { return 0; }
  168. template <> QX_GCC_WORKAROUND_TEMPLATE_SPEC_INLINE
  169. bool QxDataMemberX<qx::trait::no_base_class_defined>::exist_WithDaoStrategy_Helper(const QString & sKey) const { Q_UNUSED(sKey); return false; }
  170. template <> QX_GCC_WORKAROUND_TEMPLATE_SPEC_INLINE
  171. IxDataMember * QxDataMemberX<qx::trait::no_base_class_defined>::get_WithDaoStrategy_Helper(long lIndex) const { Q_UNUSED(lIndex); return NULL; }
  172. template <> QX_GCC_WORKAROUND_TEMPLATE_SPEC_INLINE
  173. IxDataMember * QxDataMemberX<qx::trait::no_base_class_defined>::get_WithDaoStrategy_Helper(const QString & sKey) const { Q_UNUSED(sKey); return NULL; }
  174. template <> QX_GCC_WORKAROUND_TEMPLATE_SPEC_INLINE
  175. IxDataMember * QxDataMemberX<qx::trait::no_base_class_defined>::getId_WithDaoStrategy_Helper() const { return NULL; }
  176. template <> QX_GCC_WORKAROUND_TEMPLATE_SPEC_INLINE
  177. long QxDataMemberX<QObject>::count_WithDaoStrategy_Helper() const { return 0; }
  178. template <> QX_GCC_WORKAROUND_TEMPLATE_SPEC_INLINE
  179. bool QxDataMemberX<QObject>::exist_WithDaoStrategy_Helper(const QString & sKey) const { Q_UNUSED(sKey); return false; }
  180. template <> QX_GCC_WORKAROUND_TEMPLATE_SPEC_INLINE
  181. IxDataMember * QxDataMemberX<QObject>::get_WithDaoStrategy_Helper(long lIndex) const { Q_UNUSED(lIndex); return NULL; }
  182. template <> QX_GCC_WORKAROUND_TEMPLATE_SPEC_INLINE
  183. IxDataMember * QxDataMemberX<QObject>::get_WithDaoStrategy_Helper(const QString & sKey) const { Q_UNUSED(sKey); return NULL; }
  184. template <> QX_GCC_WORKAROUND_TEMPLATE_SPEC_INLINE
  185. IxDataMember * QxDataMemberX<QObject>::getId_WithDaoStrategy_Helper() const { return NULL; }
  186. } // namespace qx