![]() |
QxOrm
1.4.3
C++ Object Relational Mapping library
|
00001 /**************************************************************************** 00002 ** 00003 ** http://www.qxorm.com/ 00004 ** Copyright (C) 2013 Lionel Marty (contact@qxorm.com) 00005 ** 00006 ** This file is part of the QxOrm library 00007 ** 00008 ** This software is provided 'as-is', without any express or implied 00009 ** warranty. In no event will the authors be held liable for any 00010 ** damages arising from the use of this software 00011 ** 00012 ** Commercial Usage 00013 ** Licensees holding valid commercial QxOrm licenses may use this file in 00014 ** accordance with the commercial license agreement provided with the 00015 ** Software or, alternatively, in accordance with the terms contained in 00016 ** a written agreement between you and Lionel Marty 00017 ** 00018 ** GNU General Public License Usage 00019 ** Alternatively, this file may be used under the terms of the GNU 00020 ** General Public License version 3.0 as published by the Free Software 00021 ** Foundation and appearing in the file 'license.gpl3.txt' included in the 00022 ** packaging of this file. Please review the following information to 00023 ** ensure the GNU General Public License version 3.0 requirements will be 00024 ** met : http://www.gnu.org/copyleft/gpl.html 00025 ** 00026 ** If you are unsure which license is appropriate for your use, or 00027 ** if you have questions regarding the use of this file, please contact : 00028 ** contact@qxorm.com 00029 ** 00030 ****************************************************************************/ 00031 00032 #ifndef _QX_SQL_QUERY_BUILDER_H_ 00033 #define _QX_SQL_QUERY_BUILDER_H_ 00034 00035 #ifdef _MSC_VER 00036 #pragma once 00037 #endif 00038 00046 #include <boost/static_assert.hpp> 00047 00048 #include <QxDao/IxSqlQueryBuilder.h> 00049 #include <QxDao/QxSqlQueryHelper.h> 00050 00051 #include <QxRegister/QxClass.h> 00052 00053 #include <QxTraits/remove_attr.h> 00054 #include <QxTraits/remove_smart_ptr.h> 00055 #include <QxTraits/is_qx_registered.h> 00056 00057 #define QX_SQL_ERR_NO_DATA_MEMBER_REGISTERED "'QxSqlQueryBuilder<T>' error : 'qx::register_class()' not called or no data member registered" 00058 #define QX_SQL_ERR_NO_ID_REGISTERED "'QxSqlQueryBuilder<T>' error : no id registered" 00059 00060 #define QX_SQL_BUILDER_INIT_FCT(oper) \ 00061 QString key = QxClass<type_sql>::getSingleton()->getKey() + oper; \ 00062 QString sql = IxSqlQueryBuilder::m_lstSqlQuery.value(key); \ 00063 if (! sql.isEmpty()) { this->setSqlQuery(sql); return (* this); } 00064 00065 #define QX_SQL_BUILDER_INIT_FCT_WITH_RELATION(oper) \ 00066 QString key = QxClass<type_sql>::getSingleton()->getKey() + this->m_sHashRelation + oper; \ 00067 QString sql = IxSqlQueryBuilder::m_lstSqlQuery.value(key); \ 00068 if (! sql.isEmpty()) { this->setSqlQuery(sql); this->m_lstSqlQueryAlias = IxSqlQueryBuilder::m_lstSqlAlias.value(key); return (* this); } 00069 00070 namespace qx { 00071 00076 template <class T> 00077 class QxSqlQueryBuilder : public IxSqlQueryBuilder 00078 { 00079 00080 private: 00081 00082 typedef typename qx::trait::remove_attr<T>::type type_sql_tmp_1; 00083 typedef typename qx::trait::remove_smart_ptr<type_sql_tmp_1>::type type_sql_tmp_2; 00084 00085 public: 00086 00087 typedef typename qx::QxSqlQueryBuilder<T>::type_sql_tmp_2 type_sql; 00088 00089 public: 00090 00091 QxSqlQueryBuilder() : IxSqlQueryBuilder() { ; } 00092 virtual ~QxSqlQueryBuilder() { BOOST_STATIC_ASSERT(qx::trait::is_qx_registered<type_sql>::value); } 00093 00094 virtual void init() 00095 { 00096 if (m_bInitDone) { return; } 00097 m_pDataMemberX = QxClass<type_sql>::getSingleton()->dataMemberX(); 00098 m_oSoftDelete = QxClass<type_sql>::getSingleton()->getSoftDelete(); 00099 IxSqlQueryBuilder::init(); 00100 } 00101 00102 }; 00103 00108 template <class T> 00109 class QxSqlQueryBuilder_Count : public QxSqlQueryBuilder<T> 00110 { 00111 00112 public: 00113 00114 typedef typename QxSqlQueryBuilder<T>::type_sql type_sql; 00115 00116 QxSqlQueryBuilder_Count() : QxSqlQueryBuilder<T>() { ; } 00117 virtual ~QxSqlQueryBuilder_Count() { ; } 00118 00119 virtual IxSqlQueryBuilder & buildSql(const QStringList & columns = QStringList(), QxSqlRelationLinked * pRelationX = NULL) 00120 { 00121 Q_UNUSED(columns); Q_UNUSED(pRelationX); 00122 QX_SQL_BUILDER_INIT_FCT("Count") 00123 sql = "SELECT COUNT(*) FROM " + qx::IxDataMember::getSqlFromTable(this->m_sTableName); 00124 if (! this->m_oSoftDelete.isEmpty()) { sql += " WHERE " + this->m_oSoftDelete.buildSqlQueryToFetch(); } 00125 this->setSqlQuery(sql, key); 00126 return (* this); 00127 } 00128 00129 }; 00130 00135 template <class T> 00136 class QxSqlQueryBuilder_Exist : public QxSqlQueryBuilder<T> 00137 { 00138 00139 public: 00140 00141 typedef typename QxSqlQueryBuilder<T>::type_sql type_sql; 00142 00143 QxSqlQueryBuilder_Exist() : QxSqlQueryBuilder<T>() { ; } 00144 virtual ~QxSqlQueryBuilder_Exist() { ; } 00145 00146 virtual IxSqlQueryBuilder & buildSql(const QStringList & columns = QStringList(), QxSqlRelationLinked * pRelationX = NULL) 00147 { 00148 Q_UNUSED(columns); Q_UNUSED(pRelationX); 00149 QX_SQL_BUILDER_INIT_FCT("Exist") 00150 if (! this->getDataId()) { qDebug("[QxOrm] %s", QX_SQL_ERR_NO_ID_REGISTERED); qAssert(false); return (* this); } 00151 qx::dao::detail::QxSqlQueryHelper_Exist<type_sql>::sql(sql, (* this)); 00152 this->setSqlQuery(sql, key); 00153 return (* this); 00154 } 00155 00156 }; 00157 00162 template <class T> 00163 class QxSqlQueryBuilder_FetchAll : public QxSqlQueryBuilder<T> 00164 { 00165 00166 public: 00167 00168 typedef typename QxSqlQueryBuilder<T>::type_sql type_sql; 00169 00170 QxSqlQueryBuilder_FetchAll() : QxSqlQueryBuilder<T>() { ; } 00171 virtual ~QxSqlQueryBuilder_FetchAll() { ; } 00172 00173 virtual IxSqlQueryBuilder & buildSql(const QStringList & columns = QStringList(), QxSqlRelationLinked * pRelationX = NULL) 00174 { 00175 Q_UNUSED(pRelationX); 00176 00177 if ((columns.count() <= 0) || (columns.at(0) == "*")) 00178 { 00179 QX_SQL_BUILDER_INIT_FCT("FetchAll") 00180 qx::dao::detail::QxSqlQueryHelper_FetchAll<type_sql>::sql(sql, (* this)); 00181 this->setSqlQuery(sql, key); 00182 } 00183 else 00184 { 00185 QString sql; 00186 if (! this->verifyColumns(columns)) { return (* this); } 00187 qx::dao::detail::QxSqlQueryHelper_FetchAll<type_sql>::sql(sql, (* this), columns); 00188 this->setSqlQuery(sql); 00189 } 00190 00191 return (* this); 00192 } 00193 00194 }; 00195 00200 template <class T> 00201 class QxSqlQueryBuilder_FetchById : public QxSqlQueryBuilder<T> 00202 { 00203 00204 public: 00205 00206 typedef typename QxSqlQueryBuilder<T>::type_sql type_sql; 00207 00208 QxSqlQueryBuilder_FetchById() : QxSqlQueryBuilder<T>() { ; } 00209 virtual ~QxSqlQueryBuilder_FetchById() { ; } 00210 00211 virtual IxSqlQueryBuilder & buildSql(const QStringList & columns = QStringList(), QxSqlRelationLinked * pRelationX = NULL) 00212 { 00213 Q_UNUSED(pRelationX); 00214 if (! this->getDataId()) { qDebug("[QxOrm] %s", QX_SQL_ERR_NO_ID_REGISTERED); qAssert(false); return (* this); } 00215 QxSqlQueryBuilder_FetchAll<type_sql> builder; builder.clone(* this); 00216 00217 if ((columns.count() <= 0) || (columns.at(0) == "*")) 00218 { 00219 QX_SQL_BUILDER_INIT_FCT("FetchById") 00220 qx::dao::detail::QxSqlQueryHelper_FetchById<type_sql>::sql(sql, builder); 00221 this->setSqlQuery(sql, key); 00222 } 00223 else 00224 { 00225 QString sql; 00226 if (! this->verifyColumns(columns)) { return (* this); } 00227 qx::dao::detail::QxSqlQueryHelper_FetchById<type_sql>::sql(sql, builder, columns); 00228 this->setSqlQuery(sql); 00229 } 00230 00231 return (* this); 00232 } 00233 00234 }; 00235 00240 template <class T> 00241 class QxSqlQueryBuilder_Insert : public QxSqlQueryBuilder<T> 00242 { 00243 00244 public: 00245 00246 typedef typename QxSqlQueryBuilder<T>::type_sql type_sql; 00247 00248 QxSqlQueryBuilder_Insert() : QxSqlQueryBuilder<T>() { ; } 00249 virtual ~QxSqlQueryBuilder_Insert() { ; } 00250 00251 virtual IxSqlQueryBuilder & buildSql(const QStringList & columns = QStringList(), QxSqlRelationLinked * pRelationX = NULL) 00252 { 00253 Q_UNUSED(columns); Q_UNUSED(pRelationX); 00254 QX_SQL_BUILDER_INIT_FCT("Insert") 00255 qx::dao::detail::QxSqlQueryHelper_Insert<type_sql>::sql(sql, (* this)); 00256 this->setSqlQuery(sql, key); 00257 return (* this); 00258 } 00259 00260 }; 00261 00266 template <class T> 00267 class QxSqlQueryBuilder_Update : public QxSqlQueryBuilder<T> 00268 { 00269 00270 public: 00271 00272 typedef typename QxSqlQueryBuilder<T>::type_sql type_sql; 00273 00274 QxSqlQueryBuilder_Update() : QxSqlQueryBuilder<T>() { ; } 00275 virtual ~QxSqlQueryBuilder_Update() { ; } 00276 00277 virtual IxSqlQueryBuilder & buildSql(const QStringList & columns = QStringList(), QxSqlRelationLinked * pRelationX = NULL) 00278 { 00279 Q_UNUSED(pRelationX); 00280 if (! this->getDataId()) { qDebug("[QxOrm] %s", QX_SQL_ERR_NO_ID_REGISTERED); qAssert(false); return (* this); } 00281 00282 if ((columns.count() <= 0) || (columns.at(0) == "*")) 00283 { 00284 QX_SQL_BUILDER_INIT_FCT("Update") 00285 qx::dao::detail::QxSqlQueryHelper_Update<type_sql>::sql(sql, (* this)); 00286 this->setSqlQuery(sql, key); 00287 } 00288 else 00289 { 00290 QString sql; 00291 if (! this->verifyColumns(columns)) { return (* this); } 00292 qx::dao::detail::QxSqlQueryHelper_Update<type_sql>::sql(sql, (* this), columns); 00293 this->setSqlQuery(sql); 00294 } 00295 00296 return (* this); 00297 } 00298 00299 }; 00300 00305 template <class T> 00306 class QxSqlQueryBuilder_DeleteAll : public QxSqlQueryBuilder<T> 00307 { 00308 00309 public: 00310 00311 typedef typename QxSqlQueryBuilder<T>::type_sql type_sql; 00312 00313 QxSqlQueryBuilder_DeleteAll() : QxSqlQueryBuilder<T>() { ; } 00314 virtual ~QxSqlQueryBuilder_DeleteAll() { ; } 00315 00316 virtual IxSqlQueryBuilder & buildSql(const QStringList & columns = QStringList(), QxSqlRelationLinked * pRelationX = NULL) 00317 { 00318 Q_UNUSED(columns); Q_UNUSED(pRelationX); 00319 QX_SQL_BUILDER_INIT_FCT("DeleteAll") 00320 sql = "DELETE FROM " + this->m_sTableName; 00321 this->setSqlQuery(sql, key); 00322 return (* this); 00323 } 00324 00325 }; 00326 00331 template <class T> 00332 class QxSqlQueryBuilder_SoftDeleteAll : public QxSqlQueryBuilder<T> 00333 { 00334 00335 public: 00336 00337 typedef typename QxSqlQueryBuilder<T>::type_sql type_sql; 00338 00339 QxSqlQueryBuilder_SoftDeleteAll() : QxSqlQueryBuilder<T>() { ; } 00340 virtual ~QxSqlQueryBuilder_SoftDeleteAll() { ; } 00341 00342 virtual IxSqlQueryBuilder & buildSql(const QStringList & columns = QStringList(), QxSqlRelationLinked * pRelationX = NULL) 00343 { 00344 Q_UNUSED(columns); Q_UNUSED(pRelationX); 00345 QX_SQL_BUILDER_INIT_FCT("SoftDeleteAll") 00346 if (! this->m_oSoftDelete.isEmpty()) { sql = "UPDATE " + this->m_sTableName + " SET " + this->m_oSoftDelete.buildSqlQueryToUpdate(); } 00347 else { qAssert(false); } 00348 this->setSqlQuery(sql, key); 00349 return (* this); 00350 } 00351 00352 }; 00353 00358 template <class T> 00359 class QxSqlQueryBuilder_DeleteById : public QxSqlQueryBuilder<T> 00360 { 00361 00362 public: 00363 00364 typedef typename QxSqlQueryBuilder<T>::type_sql type_sql; 00365 00366 QxSqlQueryBuilder_DeleteById() : QxSqlQueryBuilder<T>() { ; } 00367 virtual ~QxSqlQueryBuilder_DeleteById() { ; } 00368 00369 virtual IxSqlQueryBuilder & buildSql(const QStringList & columns = QStringList(), QxSqlRelationLinked * pRelationX = NULL) 00370 { 00371 Q_UNUSED(columns); Q_UNUSED(pRelationX); 00372 QX_SQL_BUILDER_INIT_FCT("DeleteById") 00373 if (! this->getDataId()) { qDebug("[QxOrm] %s", QX_SQL_ERR_NO_ID_REGISTERED); qAssert(false); return (* this); } 00374 qx::dao::detail::QxSqlQueryHelper_DeleteById<type_sql>::sql(sql, (* this), false); 00375 this->setSqlQuery(sql, key); 00376 return (* this); 00377 } 00378 00379 }; 00380 00385 template <class T> 00386 class QxSqlQueryBuilder_SoftDeleteById : public QxSqlQueryBuilder<T> 00387 { 00388 00389 public: 00390 00391 typedef typename QxSqlQueryBuilder<T>::type_sql type_sql; 00392 00393 QxSqlQueryBuilder_SoftDeleteById() : QxSqlQueryBuilder<T>() { ; } 00394 virtual ~QxSqlQueryBuilder_SoftDeleteById() { ; } 00395 00396 virtual IxSqlQueryBuilder & buildSql(const QStringList & columns = QStringList(), QxSqlRelationLinked * pRelationX = NULL) 00397 { 00398 Q_UNUSED(columns); Q_UNUSED(pRelationX); 00399 QX_SQL_BUILDER_INIT_FCT("SoftDeleteById") 00400 if (! this->getDataId()) { qDebug("[QxOrm] %s", QX_SQL_ERR_NO_ID_REGISTERED); qAssert(false); return (* this); } 00401 if (this->m_oSoftDelete.isEmpty()) { qAssert(false); return (* this); } 00402 qx::dao::detail::QxSqlQueryHelper_DeleteById<type_sql>::sql(sql, (* this), true); 00403 this->setSqlQuery(sql, key); 00404 return (* this); 00405 } 00406 00407 }; 00408 00413 template <class T> 00414 class QxSqlQueryBuilder_CreateTable : public QxSqlQueryBuilder<T> 00415 { 00416 00417 public: 00418 00419 typedef typename QxSqlQueryBuilder<T>::type_sql type_sql; 00420 00421 QxSqlQueryBuilder_CreateTable() : QxSqlQueryBuilder<T>() { ; } 00422 virtual ~QxSqlQueryBuilder_CreateTable() { ; } 00423 00424 virtual IxSqlQueryBuilder & buildSql(const QStringList & columns = QStringList(), QxSqlRelationLinked * pRelationX = NULL) 00425 { 00426 Q_UNUSED(columns); Q_UNUSED(pRelationX); 00427 QX_SQL_BUILDER_INIT_FCT("CreateTable") 00428 qx::dao::detail::QxSqlQueryHelper_CreateTable<type_sql>::sql(sql, (* this)); 00429 this->setSqlQuery(sql, key); 00430 return (* this); 00431 } 00432 00433 }; 00434 00439 template <class T> 00440 class QxSqlQueryBuilder_FetchAll_WithRelation : public QxSqlQueryBuilder<T> 00441 { 00442 00443 public: 00444 00445 typedef typename QxSqlQueryBuilder<T>::type_sql type_sql; 00446 00447 QxSqlQueryBuilder_FetchAll_WithRelation() : QxSqlQueryBuilder<T>() { ; } 00448 virtual ~QxSqlQueryBuilder_FetchAll_WithRelation() { ; } 00449 00450 virtual IxSqlQueryBuilder & buildSql(const QStringList & columns = QStringList(), QxSqlRelationLinked * pRelationX = NULL) 00451 { 00452 Q_UNUSED(columns); 00453 QX_SQL_BUILDER_INIT_FCT_WITH_RELATION("FetchAll_WithRelation") 00454 qx::dao::detail::QxSqlQueryHelper_FetchAll_WithRelation<type_sql>::sql(pRelationX, sql, (* this)); 00455 IxSqlQueryBuilder::m_lstSqlAlias.insert(key, this->m_lstSqlQueryAlias); 00456 this->setSqlQuery(sql, key); 00457 return (* this); 00458 } 00459 00460 }; 00461 00466 template <class T> 00467 class QxSqlQueryBuilder_FetchById_WithRelation : public QxSqlQueryBuilder<T> 00468 { 00469 00470 public: 00471 00472 typedef typename QxSqlQueryBuilder<T>::type_sql type_sql; 00473 00474 QxSqlQueryBuilder_FetchById_WithRelation() : QxSqlQueryBuilder<T>() { ; } 00475 virtual ~QxSqlQueryBuilder_FetchById_WithRelation() { ; } 00476 00477 virtual IxSqlQueryBuilder & buildSql(const QStringList & columns = QStringList(), QxSqlRelationLinked * pRelationX = NULL) 00478 { 00479 Q_UNUSED(columns); 00480 QX_SQL_BUILDER_INIT_FCT_WITH_RELATION("FetchById_WithRelation") 00481 if (! this->getDataId()) { qDebug("[QxOrm] %s", QX_SQL_ERR_NO_ID_REGISTERED); qAssert(false); return (* this); } 00482 QxSqlQueryBuilder_FetchAll_WithRelation<type_sql> builder; builder.clone(* this); 00483 qx::dao::detail::QxSqlQueryHelper_FetchById_WithRelation<type_sql>::sql(pRelationX, sql, builder); 00484 IxSqlQueryBuilder::m_lstSqlAlias.insert(key, this->m_lstSqlQueryAlias); 00485 this->setSqlQuery(sql, key); 00486 return (* this); 00487 } 00488 00489 }; 00490 00491 } // namespace qx 00492 00493 #endif // _QX_SQL_QUERY_BUILDER_H_