QxOrm 1.4.9
C++ Object Relational Mapping library
Loading...
Searching...
No Matches
QxSqlQueryBuilder.h
Go to the documentation of this file.
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
32#ifndef _QX_SQL_QUERY_BUILDER_H_
33#define _QX_SQL_QUERY_BUILDER_H_
34
35#ifdef _MSC_VER
36#pragma once
37#endif
38
48
49#include <QxRegister/QxClass.h>
50
54
55#define QX_SQL_ERR_NO_DATA_MEMBER_REGISTERED "'QxSqlQueryBuilder<T>' error : 'qx::register_class()' not called or no data member registered"
56#define QX_SQL_ERR_NO_ID_REGISTERED "'QxSqlQueryBuilder<T>' error : no id registered"
57
58#define QX_SQL_BUILDER_INIT_FCT(oper) \
59qx::dao::detail::IxDao_Timer timer(this->getDaoHelper(), qx::dao::detail::IxDao_Helper::timer_build_sql); \
60QString joinQueryHash = (this->getDaoHelper() ? this->getDaoHelper()->qxQuery().getJoinQueryHash() : QString()); \
61QString ignoreSoftDeleteHash = (this->getDaoHelper() ? this->getDaoHelper()->getIgnoreSoftDeleteHash() : QString()); \
62QString key = QxClass<type_sql>::getSingleton()->getKey() + joinQueryHash + ignoreSoftDeleteHash + oper; \
63if ((joinQueryHash.isEmpty()) && (this->findSqlQuery(key))) { return (* this); } \
64QString & sql = this->getCurrentBuildingSql(); sql = "";
65
66#define QX_SQL_BUILDER_INIT_FCT_WITH_RELATION(oper) \
67qx::dao::detail::IxDao_Timer timer(this->getDaoHelper(), qx::dao::detail::IxDao_Helper::timer_build_sql); \
68QString joinQueryHash = (this->getDaoHelper() ? this->getDaoHelper()->qxQuery().getJoinQueryHash() : QString()); \
69QString ignoreSoftDeleteHash = (this->getDaoHelper() ? this->getDaoHelper()->getIgnoreSoftDeleteHash() : QString()); \
70QString key = QxClass<type_sql>::getSingleton()->getKey() + joinQueryHash + this->getHashRelation() + ignoreSoftDeleteHash + oper; \
71if ((joinQueryHash.isEmpty()) && (this->findSqlQuery(key))) { this->findSqlAlias(key); return (* this); } \
72QString & sql = this->getCurrentBuildingSql(); sql = "";
73
74namespace qx {
75
80template <class T>
82{
83
84private:
85
88
89public:
90
92
93public:
94
96 virtual ~QxSqlQueryBuilder() { static_assert(qx::trait::is_qx_registered<type_sql>::value, "qx::trait::is_qx_registered<type_sql>::value"); }
97
98 virtual void init()
99 {
100 if (isInitDone()) { return; }
104 }
105
106};
107
112template <class T>
114{
115
116public:
117
119
122
123 virtual IxSqlQueryBuilder & buildSql(const QStringList & columns = QStringList(), QxSqlRelationLinked * pRelationX = NULL)
124 {
125 Q_UNUSED(columns); Q_UNUSED(pRelationX);
127 sql = "SELECT COUNT(*) FROM " + qx::IxDataMember::getSqlFromTable(this->table());
128 if (! this->softDelete().isEmpty()) { sql += " WHERE " + this->softDelete().buildSqlQueryToFetch(); }
129 this->setSqlQuery(sql, key);
130 return (* this);
131 }
132
133};
134
139template <class T>
141{
142
143public:
144
146
149
150 virtual IxSqlQueryBuilder & buildSql(const QStringList & columns = QStringList(), QxSqlRelationLinked * pRelationX = NULL)
151 {
152 Q_UNUSED(columns); Q_UNUSED(pRelationX);
154 if (! this->getDataId()) { qDebug("[QxOrm] %s", QX_SQL_ERR_NO_ID_REGISTERED); qAssert(false); return (* this); }
156 this->setSqlQuery(sql, key);
157 return (* this);
158 }
159
160};
161
166template <class T>
168{
169
170public:
171
173
176
177 virtual IxSqlQueryBuilder & buildSql(const QStringList & columns = QStringList(), QxSqlRelationLinked * pRelationX = NULL)
178 {
179 Q_UNUSED(pRelationX);
180
181 if ((columns.count() <= 0) || (columns.at(0) == "*"))
182 {
183 QX_SQL_BUILDER_INIT_FCT("FetchAll")
185 this->setSqlQuery(sql, key);
186 }
187 else
188 {
189 QString sql;
190 if (! this->verifyColumns(columns)) { return (* this); }
192 this->setSqlQuery(sql);
193 }
194
195 return (* this);
196 }
197
198};
199
204template <class T>
206{
207
208public:
209
211
214
215 virtual IxSqlQueryBuilder & buildSql(const QStringList & columns = QStringList(), QxSqlRelationLinked * pRelationX = NULL)
216 {
217 Q_UNUSED(pRelationX);
218 if (! this->getDataId()) { qDebug("[QxOrm] %s", QX_SQL_ERR_NO_ID_REGISTERED); qAssert(false); return (* this); }
219 QxSqlQueryBuilder_FetchAll<type_sql> builder; builder.clone(* this);
220
221 if ((columns.count() <= 0) || (columns.at(0) == "*"))
222 {
223 QX_SQL_BUILDER_INIT_FCT("FetchById")
225 this->setSqlQuery(sql, key);
226 }
227 else
228 {
229 QString sql;
230 if (! this->verifyColumns(columns)) { return (* this); }
232 this->setSqlQuery(sql);
233 }
234
235 return (* this);
236 }
237
238};
239
244template <class T>
246{
247
248public:
249
251
254
255 virtual IxSqlQueryBuilder & buildSql(const QStringList & columns = QStringList(), QxSqlRelationLinked * pRelationX = NULL)
256 {
257 Q_UNUSED(columns); Q_UNUSED(pRelationX);
260 this->setSqlQuery(sql, key);
261 return (* this);
262 }
263
264};
265
270template <class T>
272{
273
274public:
275
277
280
281 virtual IxSqlQueryBuilder & buildSql(const QStringList & columns = QStringList(), QxSqlRelationLinked * pRelationX = NULL)
282 {
283 Q_UNUSED(pRelationX);
284 if (! this->getDataId()) { qDebug("[QxOrm] %s", QX_SQL_ERR_NO_ID_REGISTERED); qAssert(false); return (* this); }
285
286 if ((columns.count() <= 0) || (columns.at(0) == "*"))
287 {
290 this->setSqlQuery(sql, key);
291 }
292 else
293 {
294 QString sql;
295 if (! this->verifyColumns(columns)) { return (* this); }
297 this->setSqlQuery(sql);
298 }
299
300 return (* this);
301 }
302
303};
304
309template <class T>
311{
312
313public:
314
316
319
320 virtual IxSqlQueryBuilder & buildSql(const QStringList & columns = QStringList(), QxSqlRelationLinked * pRelationX = NULL)
321 {
322 Q_UNUSED(columns); Q_UNUSED(pRelationX);
323 QX_SQL_BUILDER_INIT_FCT("DeleteAll")
324 sql = "DELETE FROM " + this->table();
325 this->setSqlQuery(sql, key);
326 return (* this);
327 }
328
329};
330
335template <class T>
337{
338
339public:
340
342
345
346 virtual IxSqlQueryBuilder & buildSql(const QStringList & columns = QStringList(), QxSqlRelationLinked * pRelationX = NULL)
347 {
348 Q_UNUSED(columns); Q_UNUSED(pRelationX);
349 QX_SQL_BUILDER_INIT_FCT("SoftDeleteAll")
350 if (! this->softDelete().isEmpty()) { sql = "UPDATE " + this->table() + " SET " + this->softDelete().buildSqlQueryToUpdate(); }
351 else { qAssert(false); }
352 this->setSqlQuery(sql, key);
353 return (* this);
354 }
355
356};
357
362template <class T>
364{
365
366public:
367
369
372
373 virtual IxSqlQueryBuilder & buildSql(const QStringList & columns = QStringList(), QxSqlRelationLinked * pRelationX = NULL)
374 {
375 Q_UNUSED(columns); Q_UNUSED(pRelationX);
376 QX_SQL_BUILDER_INIT_FCT("DeleteById")
377 if (! this->getDataId()) { qDebug("[QxOrm] %s", QX_SQL_ERR_NO_ID_REGISTERED); qAssert(false); return (* this); }
379 this->setSqlQuery(sql, key);
380 return (* this);
381 }
382
383};
384
389template <class T>
391{
392
393public:
394
396
399
400 virtual IxSqlQueryBuilder & buildSql(const QStringList & columns = QStringList(), QxSqlRelationLinked * pRelationX = NULL)
401 {
402 Q_UNUSED(columns); Q_UNUSED(pRelationX);
403 QX_SQL_BUILDER_INIT_FCT("SoftDeleteById")
404 if (! this->getDataId()) { qDebug("[QxOrm] %s", QX_SQL_ERR_NO_ID_REGISTERED); qAssert(false); return (* this); }
405 if (this->softDelete().isEmpty()) { qAssert(false); return (* this); }
407 this->setSqlQuery(sql, key);
408 return (* this);
409 }
410
411};
412
417template <class T>
419{
420
421public:
422
424
427
428 virtual IxSqlQueryBuilder & buildSql(const QStringList & columns = QStringList(), QxSqlRelationLinked * pRelationX = NULL)
429 {
430 Q_UNUSED(columns); Q_UNUSED(pRelationX);
431 QX_SQL_BUILDER_INIT_FCT("CreateTable")
433 this->setSqlQuery(sql, key);
434 return (* this);
435 }
436
437};
438
443template <class T>
445{
446
447public:
448
450
453
454 virtual IxSqlQueryBuilder & buildSql(const QStringList & columns = QStringList(), QxSqlRelationLinked * pRelationX = NULL)
455 {
456 Q_UNUSED(columns);
457 QX_SQL_BUILDER_INIT_FCT_WITH_RELATION("Count_WithRelation")
458 IxSqlQueryBuilder::sql_Count_WithRelation(pRelationX, sql, (* this));
459 this->setSqlQuery(sql, key);
460 this->insertSqlAlias(key);
461 return (* this);
462 }
463
464};
465
470template <class T>
472{
473
474public:
475
477
480
481 virtual IxSqlQueryBuilder & buildSql(const QStringList & columns = QStringList(), QxSqlRelationLinked * pRelationX = NULL)
482 {
483 Q_UNUSED(columns);
484 QX_SQL_BUILDER_INIT_FCT_WITH_RELATION("FetchAll_WithRelation")
486 this->setSqlQuery(sql, key);
487 this->insertSqlAlias(key);
488 return (* this);
489 }
490
491};
492
497template <class T>
499{
500
501public:
502
504
507
508 virtual IxSqlQueryBuilder & buildSql(const QStringList & columns = QStringList(), QxSqlRelationLinked * pRelationX = NULL)
509 {
510 Q_UNUSED(columns);
511 QX_SQL_BUILDER_INIT_FCT_WITH_RELATION("FetchById_WithRelation")
512 if (! this->getDataId()) { qDebug("[QxOrm] %s", QX_SQL_ERR_NO_ID_REGISTERED); qAssert(false); return (* this); }
515 this->setSqlQuery(sql, key);
516 this->insertSqlAlias(key);
517 return (* this);
518 }
519
520};
521
522} // namespace qx
523
524#endif // _QX_SQL_QUERY_BUILDER_H_
Common interface to build SQL queries to communicate with database.
Concrete class registered into QxOrm context.
#define qAssert(x)
Definition QxMacro.h:52
#define QX_SQL_BUILDER_INIT_FCT(oper)
#define QX_SQL_BUILDER_INIT_FCT_WITH_RELATION(oper)
#define QX_SQL_ERR_NO_ID_REGISTERED
static QString getSqlFromTable(const QString &sTable, const QString &sCustomAlias=QString())
qx::IxSqlQueryBuilder : common interface to build SQL queries to communicate with database
virtual void init()
void insertSqlAlias(const QString &key)
QxSoftDelete & softDelete()
static void sql_Count_WithRelation(qx::QxSqlRelationLinked *pRelationX, QString &sql, IxSqlQueryBuilder &builder)
bool isInitDone() const
QxSoftDelete getSoftDelete() const
IxDataMember * getDataId() const
void setDataMemberX(IxDataMemberX *p)
QString table() const
virtual void clone(const IxSqlQueryBuilder &other)
void setSoftDelete(const QxSoftDelete &o)
void setSqlQuery(const QString &sql, const QString &key=QString())
bool verifyColumns(const QStringList &columns) const QX_USED
qx::QxClass<T> : concrete class of type T registered into QxOrm context (this class is a singleton an...
Definition QxClass.h:79
QString buildSqlQueryToFetch(const QString &sTable=QString()) const
QString buildSqlQueryToUpdate() const
qx::QxSqlQueryBuilder_Count_WithRelation<T> : concrete SQL query builder for class T to build a COUNT...
QxSqlQueryBuilder< T >::type_sql type_sql
virtual IxSqlQueryBuilder & buildSql(const QStringList &columns=QStringList(), QxSqlRelationLinked *pRelationX=NULL)
qx::QxSqlQueryBuilder_Count<T> : concrete SQL query builder for class T to build a COUNT SQL query
QxSqlQueryBuilder< T >::type_sql type_sql
virtual IxSqlQueryBuilder & buildSql(const QStringList &columns=QStringList(), QxSqlRelationLinked *pRelationX=NULL)
qx::QxSqlQueryBuilder_CreateTable<T> : concrete SQL query builder for class T to build a CREATE TABLE...
virtual IxSqlQueryBuilder & buildSql(const QStringList &columns=QStringList(), QxSqlRelationLinked *pRelationX=NULL)
QxSqlQueryBuilder< T >::type_sql type_sql
qx::QxSqlQueryBuilder_DeleteAll<T> : concrete SQL query builder for class T to build a DELETE ALL SQL...
QxSqlQueryBuilder< T >::type_sql type_sql
virtual IxSqlQueryBuilder & buildSql(const QStringList &columns=QStringList(), QxSqlRelationLinked *pRelationX=NULL)
qx::QxSqlQueryBuilder_DeleteById<T> : concrete SQL query builder for class T to build a DELETE BY ID ...
QxSqlQueryBuilder< T >::type_sql type_sql
virtual IxSqlQueryBuilder & buildSql(const QStringList &columns=QStringList(), QxSqlRelationLinked *pRelationX=NULL)
qx::QxSqlQueryBuilder_Exist<T> : concrete SQL query builder for class T to build an EXIST SQL query
QxSqlQueryBuilder< T >::type_sql type_sql
virtual IxSqlQueryBuilder & buildSql(const QStringList &columns=QStringList(), QxSqlRelationLinked *pRelationX=NULL)
qx::QxSqlQueryBuilder_FetchAll_WithRelation<T> : concrete SQL query builder for class T to build a FE...
QxSqlQueryBuilder< T >::type_sql type_sql
virtual IxSqlQueryBuilder & buildSql(const QStringList &columns=QStringList(), QxSqlRelationLinked *pRelationX=NULL)
qx::QxSqlQueryBuilder_FetchAll<T> : concrete SQL query builder for class T to build a FETCH ALL SQL q...
QxSqlQueryBuilder< T >::type_sql type_sql
virtual IxSqlQueryBuilder & buildSql(const QStringList &columns=QStringList(), QxSqlRelationLinked *pRelationX=NULL)
qx::QxSqlQueryBuilder_FetchById_WithRelation<T> : concrete SQL query builder for class T to build a F...
virtual IxSqlQueryBuilder & buildSql(const QStringList &columns=QStringList(), QxSqlRelationLinked *pRelationX=NULL)
QxSqlQueryBuilder< T >::type_sql type_sql
qx::QxSqlQueryBuilder_FetchById<T> : concrete SQL query builder for class T to build a FETCH BY ID SQ...
QxSqlQueryBuilder< T >::type_sql type_sql
virtual IxSqlQueryBuilder & buildSql(const QStringList &columns=QStringList(), QxSqlRelationLinked *pRelationX=NULL)
qx::QxSqlQueryBuilder_Insert<T> : concrete SQL query builder for class T to build an INSERT SQL query
virtual IxSqlQueryBuilder & buildSql(const QStringList &columns=QStringList(), QxSqlRelationLinked *pRelationX=NULL)
QxSqlQueryBuilder< T >::type_sql type_sql
qx::QxSqlQueryBuilder_SoftDeleteAll<T> : concrete SQL query builder for class T to build a SOFT DELET...
QxSqlQueryBuilder< T >::type_sql type_sql
virtual IxSqlQueryBuilder & buildSql(const QStringList &columns=QStringList(), QxSqlRelationLinked *pRelationX=NULL)
qx::QxSqlQueryBuilder_SoftDeleteById<T> : concrete SQL query builder for class T to build a SOFT DELE...
virtual IxSqlQueryBuilder & buildSql(const QStringList &columns=QStringList(), QxSqlRelationLinked *pRelationX=NULL)
QxSqlQueryBuilder< T >::type_sql type_sql
qx::QxSqlQueryBuilder_Update<T> : concrete SQL query builder for class T to build an UPDATE SQL query
virtual IxSqlQueryBuilder & buildSql(const QStringList &columns=QStringList(), QxSqlRelationLinked *pRelationX=NULL)
QxSqlQueryBuilder< T >::type_sql type_sql
qx::QxSqlQueryBuilder<T> : concrete SQL query builder for class T with a cache mechanism to backup an...
qx::trait::remove_smart_ptr< type_sql_tmp_1 >::type type_sql_tmp_2
qx::trait::remove_attr< T >::type type_sql_tmp_1
qx::QxSqlQueryBuilder< T >::type_sql_tmp_2 type_sql
qx::QxSqlRelationLinked : hierarchy of relationships to build SQL query
qx::trait::is_qx_registered<T>::value : return true if T is registered into QxOrm context to provide ...
Root namespace for all QxOrm library features.
qx::trait::remove_attr<T>::type : return a type without pointer, const, reference and/or volatile att...
qx::trait::remove_smart_ptr<T>::type : return a type without smart-pointer attribute from boost,...
qx::trait::is_qx_registered<T>::value : return true if T is registered into QxOrm context to provide ...