TreeFrogFramework  2.8
tsqlormapper.h
Go to the documentation of this file.
1 #pragma once
2 #include "tsystemglobal.h"
3 #include <QList>
4 #include <QMap>
5 #include <QtSql>
6 #include <TCriteria>
7 #include <TCriteriaConverter>
8 #include <TGlobal>
9 #include <TSqlJoin>
10 #include <TSqlObject>
11 #include <TSqlQuery>
12 
20 class TAbstractSqlORMapper : public QSqlTableModel {
21 public:
22  TAbstractSqlORMapper(const QSqlDatabase &db) : QSqlTableModel(nullptr, db) {}
23  virtual ~TAbstractSqlORMapper() {}
24 
25  virtual void setLimit(int limit) = 0;
26  virtual void setOffset(int offset) = 0;
27  virtual void setSortOrder(int column, Tf::SortOrder order = Tf::AscendingOrder) = 0;
28  virtual void setSortOrder(const QString &column, Tf::SortOrder order = Tf::AscendingOrder) = 0;
29  virtual void reset() = 0;
30 
31  virtual int find(const TCriteria &cri = TCriteria()) = 0;
32  virtual int findBy(int column, const QVariant &value) = 0;
33  virtual int findIn(int column, const QVariantList &values) = 0;
34 
35  virtual int findCount(const TCriteria &cri = TCriteria()) = 0;
36  virtual int findCountBy(int column, const QVariant &value) = 0;
37  virtual int updateAll(const TCriteria &cri, int column, const QVariant &value) = 0;
38  virtual int updateAll(const TCriteria &cri, const QMap<int, QVariant> &values) = 0;
39  virtual int removeAll(const TCriteria &cri = TCriteria()) = 0;
40 };
41 
42 
52 template <class T>
54 public:
55  TSqlORMapper();
56  virtual ~TSqlORMapper();
57 
58  // Method chaining
62  TSqlORMapper<T> &orderBy(const QString &column, Tf::SortOrder order = Tf::AscendingOrder);
63  template <class C>
64  TSqlORMapper<T> &join(int column, const TSqlJoin<C> &join);
65 
66  void setLimit(int limit);
67  void setOffset(int offset);
68  void setSortOrder(int column, Tf::SortOrder order = Tf::AscendingOrder);
69  void setSortOrder(const QString &column, Tf::SortOrder order = Tf::AscendingOrder);
70  template <class C>
71  void setJoin(int column, const TSqlJoin<C> &join);
72  void reset();
73 
74  T findFirst(const TCriteria &cri = TCriteria());
75  T findFirstBy(int column, const QVariant &value);
76  T findByPrimaryKey(const QVariant &pk);
77  int find(const TCriteria &cri = TCriteria());
78  int findBy(int column, const QVariant &value);
79  int findIn(int column, const QVariantList &values);
80  int rowCount() const;
81  T first() const;
82  T last() const;
83  T value(int i) const;
84 
85  int findCount(const TCriteria &cri = TCriteria());
86  int findCountBy(int column, const QVariant &value);
87  int updateAll(const TCriteria &cri, int column, const QVariant &value);
88  int updateAll(const TCriteria &cri, const QMap<int, QVariant> &values);
89  int removeAll(const TCriteria &cri = TCriteria());
90 
91  class ConstIterator;
92  inline ConstIterator begin() const { return ConstIterator(this, 0); }
93  inline ConstIterator end() const { return ConstIterator(this, rowCount()); }
94 
98  class ConstIterator {
99  public:
100  const TSqlORMapper<T> *m {nullptr};
101  int it {0};
102 
103  inline ConstIterator() {}
104  inline ConstIterator(const ConstIterator &o) :
105  m(o.m), it(o.it) {}
107  {
108  m = o.m;
109  it = o.it;
110  return *this;
111  }
112  inline const T operator*() const { return m->value(it); }
113  inline bool operator==(const ConstIterator &o) const { return m == o.m && it == o.it; }
114  inline bool operator!=(const ConstIterator &o) const { return m != o.m || it != o.it; }
116  {
117  it = std::min(it + 1, m->rowCount());
118  return *this;
119  }
121  {
122  int i = it;
123  it = std::min(it + 1, m->rowCount());
124  return ConstIterator(m, i);
125  }
127  {
128  --it;
129  return *this;
130  }
132  {
133  int i = it++;
134  return ConstIterator(m, i);
135  }
136 
137  private:
138  inline ConstIterator(const TSqlORMapper<T> *mapper, int i) :
139  m(mapper), it(i) {}
140  friend class TSqlORMapper;
141  };
142 
143 protected:
144  void setFilter(const QString &filter);
145  QString orderBy() const;
146  virtual QString orderByClause() const { return QString(); }
147  virtual void clear();
148  virtual QString selectStatement() const;
149  virtual int rowCount(const QModelIndex &parent) const;
150 
151 private:
152  QString queryFilter;
153  QList<QPair<QString, Tf::SortOrder>> sortColumns;
154  int queryLimit {0};
155  int queryOffset {0};
156  int joinCount {0};
157  QStringList joinClauses;
158  QStringList joinWhereClauses;
159 
162 };
163 
167 template <class T>
169  TAbstractSqlORMapper(Tf::currentSqlDatabase(T().databaseId()))
170 {
171  setTable(T().tableName());
172 }
173 
177 template <class T>
179 {
180 }
181 
186 template <class T>
188 {
189  if (!cri.isEmpty()) {
190  TCriteriaConverter<T> conv(cri, database(), QStringLiteral("t0"));
191  setFilter(conv.toString());
192  } else {
193  setFilter(QString());
194  }
195 
196  QElapsedTimer time;
197  time.start();
198  int oldLimit = queryLimit;
199  queryLimit = 1;
200  bool ret = select();
201  Tf::writeQueryLog(query().lastQuery(), ret, lastError(), time.elapsed());
202  queryLimit = oldLimit;
203 
204  //tSystemDebug("findFirst() rowCount: %d", rowCount());
205  return first();
206 }
207 
212 template <class T>
213 inline T TSqlORMapper<T>::findFirstBy(int column, const QVariant &value)
214 {
215  return findFirst(TCriteria(column, value));
216 }
217 
222 template <class T>
223 inline T TSqlORMapper<T>::findByPrimaryKey(const QVariant &pk)
224 {
225  int idx = T().primaryKeyIndex();
226  if (idx < 0) {
227  tSystemDebug("Primary key not found, table name: %s", qUtf8Printable(T().tableName()));
228  return T();
229  }
230 
231  return findFirst(TCriteria(idx, pk));
232 }
233 
240 template <class T>
241 inline int TSqlORMapper<T>::find(const TCriteria &cri)
242 {
243  if (!cri.isEmpty()) {
244  TCriteriaConverter<T> conv(cri, database(), QStringLiteral("t0"));
245  setFilter(conv.toString());
246  } else {
247  setFilter(QString());
248  }
249 
250  QElapsedTimer time;
251  time.start();
252  bool ret = select();
253  while (canFetchMore()) { // For SQLite, not report back the size of a query
254  fetchMore();
255  }
256  Tf::writeQueryLog(query().lastQuery(), ret, lastError(), time.elapsed());
257  //tSystemDebug("find() rowCount: %d", rowCount());
258  return ret ? rowCount() : -1;
259 }
260 
267 template <class T>
268 inline int TSqlORMapper<T>::findBy(int column, const QVariant &value)
269 {
270  return find(TCriteria(column, value));
271 }
272 
279 template <class T>
280 inline int TSqlORMapper<T>::findIn(int column, const QVariantList &values)
281 {
282  return find(TCriteria(column, TSql::In, values));
283 }
284 
288 template <class T>
289 inline int TSqlORMapper<T>::rowCount() const
290 {
291  return QSqlTableModel::rowCount();
292 }
293 
297 template <class T>
298 inline int TSqlORMapper<T>::rowCount(const QModelIndex &parent) const
299 {
300  return QSqlTableModel::rowCount(parent);
301 }
302 
307 template <class T>
308 inline T TSqlORMapper<T>::first() const
309 {
310  return value(0);
311 }
312 
317 template <class T>
318 inline T TSqlORMapper<T>::last() const
319 {
320  return value(rowCount() - 1);
321 }
322 
328 template <class T>
329 inline T TSqlORMapper<T>::value(int i) const
330 {
331  T rec;
332  if (i >= 0 && i < rowCount()) {
333  rec.setRecord(record(i), QSqlError());
334  } else {
335  tSystemDebug("no such record, index: %d rowCount:%d", i, rowCount());
336  }
337  return rec;
338 }
339 
344 template <class T>
346 {
347  queryLimit = limit;
348 }
349 
354 template <class T>
356 {
357  queryOffset = offset;
358 }
359 
363 template <class T>
364 inline void TSqlORMapper<T>::setSortOrder(int column, Tf::SortOrder order)
365 {
366  if (column >= 0) {
367  QString columnName = TCriteriaConverter<T>::getPropertyName(column, QSqlTableModel::database().driver());
368  if (!columnName.isEmpty()) {
369  sortColumns << qMakePair(columnName, order);
370  }
371  }
372 }
373 
377 template <class T>
378 inline void TSqlORMapper<T>::setSortOrder(const QString &column, Tf::SortOrder order)
379 {
380  if (!column.isEmpty()) {
381  T obj;
382  if (obj.propertyNames().contains(column, Qt::CaseInsensitive)) {
383  sortColumns << qMakePair(column, order);
384  } else {
385  tWarn("Unable to set sort order : '%s' column not found in '%s' table",
386  qUtf8Printable(column), qUtf8Printable(obj.tableName()));
387  }
388  }
389 }
390 
395 template <class T>
397 {
398  setLimit(l);
399  return *this;
400 }
401 
406 template <class T>
408 {
409  setOffset(o);
410  return *this;
411 }
412 
416 template <class T>
418 {
419  setSortOrder(column, order);
420  return *this;
421 }
422 
426 template <class T>
427 inline TSqlORMapper<T> &TSqlORMapper<T>::orderBy(const QString &column, Tf::SortOrder order)
428 {
429  setSortOrder(column, order);
430  return *this;
431 }
432 
439 template <class T>
440 inline void TSqlORMapper<T>::setFilter(const QString &filter)
441 {
442  queryFilter = filter;
443 }
444 
449 template <class T>
450 inline QString TSqlORMapper<T>::selectStatement() const
451 {
452  QString query;
453  bool joinFlag = !joinClauses.isEmpty();
454  bool valid = false;
455  auto rec = record();
456 
457  query.reserve(1024);
458  query += QLatin1String("SELECT ");
459 
460  for (int i = 0; i < rec.count(); ++i) {
461  if (rec.isGenerated(i)) {
462  if (joinFlag) {
463  query += QLatin1String("t0.");
464  }
465  query += TSqlQuery::escapeIdentifier(rec.fieldName(i), QSqlDriver::FieldName, database().driver());
466  query += QLatin1Char(',');
467  valid = true;
468  }
469  }
470 
471  if (Q_UNLIKELY(!valid)) {
472  return QString();
473  }
474 
475  query.chop(1);
476  query += QLatin1String(" FROM ");
477  query += TSqlQuery::escapeIdentifier(tableName(), QSqlDriver::TableName, database().driver());
478  query += QLatin1String(" t0"); // alias needed
479 
480  if (joinFlag) {
481  for (auto &join : (const QStringList &)joinClauses) {
482  query += join;
483  }
484  }
485 
486  QString filter = queryFilter;
487  if (!joinWhereClauses.isEmpty()) {
488  for (auto &wh : (const QStringList &)joinWhereClauses) {
489  if (!filter.isEmpty()) {
490  filter += QLatin1String(" AND ");
491  }
492  filter += wh;
493  }
494  }
495 
496  if (Q_LIKELY(!filter.isEmpty())) {
497  query.append(QLatin1String(" WHERE ")).append(filter);
498  }
499 
500  QString orderby = orderBy();
501  if (!orderby.isEmpty()) {
502  query.append(orderby);
503  }
504 
505  if (queryLimit > 0) {
506  query.append(QLatin1String(" LIMIT ")).append(QString::number(queryLimit));
507  }
508 
509  if (queryOffset > 0) {
510  query.append(QLatin1String(" OFFSET ")).append(QString::number(queryOffset));
511  }
512 
513  return query;
514 }
515 
520 template <class T>
521 inline int TSqlORMapper<T>::findCount(const TCriteria &cri)
522 {
523  if (!cri.isEmpty()) {
524  TCriteriaConverter<T> conv(cri, database(), "t0");
525  setFilter(conv.toString());
526  } else {
527  setFilter(QString());
528  }
529 
530  QString query;
531  query.reserve(1024);
532  query += QLatin1String("SELECT COUNT(*) FROM (");
533  query += selectStatement();
534  query += QLatin1String(") t");
535 
536  int cnt = -1;
537  TSqlQuery q(database());
538  bool res = q.exec(query);
539  if (res) {
540  q.next();
541  cnt = q.value(0).toInt();
542  }
543  return cnt;
544 }
545 
550 template <class T>
551 inline int TSqlORMapper<T>::findCountBy(int column, const QVariant &value)
552 {
553  return findCount(TCriteria(column, value));
554 }
555 
561 template <class T>
562 int TSqlORMapper<T>::updateAll(const TCriteria &cri, const QMap<int, QVariant> &values)
563 {
564  static const QByteArray UpdatedAt("updated_at");
565  static const QByteArray ModifiedAt("modified_at");
566 
567  QString upd; // UPDATE Statement
568  upd.reserve(256);
569  upd.append(QLatin1String("UPDATE ")).append(tableName()).append(QLatin1String(" SET "));
570 
571  QSqlDatabase db = database();
572  TCriteriaConverter<T> conv(cri, db);
573  QString where = conv.toString();
574 
575  if (values.isEmpty()) {
576  tSystemError("Update Parameter Error");
577  return -1;
578  }
579 
580  T obj;
581  for (int i = obj.metaObject()->propertyOffset(); i < obj.metaObject()->propertyCount(); ++i) {
582  const char *propName = obj.metaObject()->property(i).name();
583  QByteArray prop = QByteArray(propName).toLower();
584  if (Tf::strcmp(prop, UpdatedAt) || Tf::strcmp(prop, ModifiedAt)) {
585  upd += TSqlQuery::escapeIdentifier(QLatin1String(propName), QSqlDriver::FieldName, db.driver());
586  upd += QLatin1Char('=');
587 #if QT_VERSION < 0x060000
588  constexpr auto metaType = QVariant::DateTime;
589 #else
590  static const QMetaType metaType(QMetaType::QDateTime);
591 #endif
592  upd += TSqlQuery::formatValue(QDateTime::currentDateTime(), metaType, db);
593  upd += QLatin1Char(',');
594  break;
595  }
596  }
597 
598  auto it = values.begin();
599  while (true) {
600  upd += conv.propertyName(it.key(), db.driver());
601  upd += QLatin1Char('=');
602  upd += TSqlQuery::formatValue(it.value(), conv.variantType(it.key()), db);
603 
604  if (++it == values.end()) {
605  break;
606  }
607  upd += QLatin1Char(',');
608  }
609 
610  if (!where.isEmpty()) {
611  upd.append(QLatin1String(" WHERE ")).append(where);
612  }
613 
614  TSqlQuery sqlQuery(db);
615  bool res = sqlQuery.exec(upd);
616  return res ? sqlQuery.numRowsAffected() : -1;
617 }
618 
623 template <class T>
624 inline int TSqlORMapper<T>::updateAll(const TCriteria &cri, int column, const QVariant &value)
625 {
626  QMap<int, QVariant> map;
627  map.insert(column, value);
628  return updateAll(cri, map);
629 }
630 
635 template <class T>
636 inline int TSqlORMapper<T>::removeAll(const TCriteria &cri)
637 {
638  QSqlDatabase db = database();
639  QString del = db.driver()->sqlStatement(QSqlDriver::DeleteStatement,
640  T().tableName(), QSqlRecord(), false);
641  TCriteriaConverter<T> conv(cri, db);
642  QString where = conv.toString();
643 
644  if (del.isEmpty()) {
645  tSystemError("Statement Error");
646  return -1;
647  }
648  if (!where.isEmpty()) {
649  del.append(QLatin1String(" WHERE ")).append(where);
650  }
651 
652  TSqlQuery sqlQuery(db);
653  bool res = sqlQuery.exec(del);
654  return res ? sqlQuery.numRowsAffected() : -1;
655 }
656 
660 template <class T>
661 template <class C>
662 inline void TSqlORMapper<T>::setJoin(int column, const TSqlJoin<C> &join)
663 {
664  if (column < 0 || join.joinColumn() < 0) {
665  return;
666  }
667 
668  QString clause;
669 
670  switch (join.joinMode()) {
671  case TSql::InnerJoin:
672  clause = QLatin1String(" INNER JOIN ");
673  break;
674 
675  case TSql::LeftJoin:
676  clause = QLatin1String(" LEFT OUTER JOIN ");
677  break;
678 
679  case TSql::RightJoin:
680  clause = QLatin1String(" RIGHT OUTER JOIN ");
681  break;
682 
683  default:
684  break;
685  }
686 
687  int joinCount = joinClauses.count();
688  QString alias = QLatin1Char('t') + QString::number(joinCount + 1);
689  QSqlDatabase db = database();
690 
691  clause += C().tableName();
692  clause += QLatin1Char(' ');
693  clause += alias;
694  clause += QLatin1String(" ON ");
695  clause += TCriteriaConverter<T>::getPropertyName(column, db.driver(), "t0");
696  clause += QLatin1Char('=');
697  clause += TCriteriaConverter<C>::getPropertyName(join.joinColumn(), db.driver(), alias);
698  joinClauses << clause;
699 
700  if (!join.criteria().isEmpty()) {
701  TCriteriaConverter<C> conv(join.criteria(), db, alias);
702  joinWhereClauses << conv.toString();
703  }
704 }
705 
706 template <class T>
707 template <class C>
708 inline TSqlORMapper<T> &TSqlORMapper<T>::join(int column, const TSqlJoin<C> &j)
709 {
710  setJoin(column, j);
711  return *this;
712 }
713 
717 template <class T>
719 {
720  setTable(tableName());
721 }
722 
726 template <class T>
728 {
729  QSqlTableModel::clear();
730  queryFilter.clear();
731  sortColumns.clear();
732  queryLimit = 0;
733  queryOffset = 0;
734  joinCount = 0;
735  joinClauses.clear();
736  joinWhereClauses.clear();
737 
738  // Don't call the setTable() here,
739  // or it causes a segmentation fault.
740 }
741 
745 template <class T>
746 inline QString TSqlORMapper<T>::orderBy() const
747 {
748  QString str;
749 
750  if (!sortColumns.isEmpty()) {
751  str.reserve(64);
752  str += QLatin1String(" ORDER BY ");
753  for (auto &p : sortColumns) {
754  str += QLatin1String("t0.");
755  str += TSqlQuery::escapeIdentifier(p.first, QSqlDriver::FieldName, database().driver());
756  str += (p.second == Tf::AscendingOrder) ? QLatin1String(" ASC,") : QLatin1String(" DESC,");
757  }
758  str.chop(1);
759  }
760  return str;
761 }
762 
The TAbstractSqlORMapper class is the abstract base class of functionality to object-relational mappi...
Definition: tsqlormapper.h:20
virtual int findCount(const TCriteria &cri=TCriteria())=0
virtual void setOffset(int offset)=0
virtual int findCountBy(int column, const QVariant &value)=0
virtual int updateAll(const TCriteria &cri, const QMap< int, QVariant > &values)=0
virtual int updateAll(const TCriteria &cri, int column, const QVariant &value)=0
virtual void reset()=0
virtual int find(const TCriteria &cri=TCriteria())=0
virtual void setLimit(int limit)=0
virtual ~TAbstractSqlORMapper()
Definition: tsqlormapper.h:23
TAbstractSqlORMapper(const QSqlDatabase &db)
Definition: tsqlormapper.h:22
virtual void setSortOrder(const QString &column, Tf::SortOrder order=Tf::AscendingOrder)=0
virtual int removeAll(const TCriteria &cri=TCriteria())=0
virtual void setSortOrder(int column, Tf::SortOrder order=Tf::AscendingOrder)=0
virtual int findIn(int column, const QVariantList &values)=0
virtual int findBy(int column, const QVariant &value)=0
The TCriteria class represents a WHERE clause without SQL for the sake of database abstraction.
Definition: tcriteria.h:6
bool isEmpty() const
Returns true if the criteria has no data; otherwise returns false.
Definition: tcriteria.cpp:345
The TSqlJoin class represents JOIN clause for combination to a record of other table.
Definition: tsqljoin.h:14
Const iterator.
Definition: tsqlormapper.h:98
bool operator!=(const ConstIterator &o) const
Definition: tsqlormapper.h:114
ConstIterator & operator--()
Definition: tsqlormapper.h:126
ConstIterator operator--(int)
Definition: tsqlormapper.h:131
bool operator==(const ConstIterator &o) const
Definition: tsqlormapper.h:113
ConstIterator operator++(int)
Definition: tsqlormapper.h:120
const T operator*() const
Definition: tsqlormapper.h:112
ConstIterator(const ConstIterator &o)
Definition: tsqlormapper.h:104
ConstIterator & operator=(const ConstIterator &o)
Definition: tsqlormapper.h:106
ConstIterator & operator++()
Definition: tsqlormapper.h:115
const TSqlORMapper< T > * m
Definition: tsqlormapper.h:100
int it
Definition: tsqlormapper.h:101
ConstIterator()
Definition: tsqlormapper.h:103
The TSqlORMapper class is a template class that provides concise functionality to object-relational m...
Definition: tsqlormapper.h:53
int findIn(int column, const QVariantList &values)
Retrieves with the criteria that the column is within the list of values values returns the number of...
Definition: tsqlormapper.h:280
virtual void clear()
Clears and releases any acquired resource.
Definition: tsqlormapper.h:727
int find(const TCriteria &cri=TCriteria())
Retrieves with the criteria cri from the table and returns the number of the ORM objects.
Definition: tsqlormapper.h:241
TSqlORMapper()
Constructor.
Definition: tsqlormapper.h:168
virtual QString selectStatement() const
Returns a SELECT statement generated from the specified parameters.
Definition: tsqlormapper.h:450
T value(int i) const
Returns the ORM object in the results retrieved by find() function.
Definition: tsqlormapper.h:329
T findFirst(const TCriteria &cri=TCriteria())
Returns the first ORM object retrieved with the criteria cri from the table.
Definition: tsqlormapper.h:187
void setJoin(int column, const TSqlJoin< C > &join)
Sets a JOIN clause for column to join.
Definition: tsqlormapper.h:662
void setSortOrder(int column, Tf::SortOrder order=Tf::AscendingOrder)
Sets the sort order for column to order.
Definition: tsqlormapper.h:364
T last() const
Returns the last ORM object in the results retrieved by find() function.
Definition: tsqlormapper.h:318
int findBy(int column, const QVariant &value)
Retrieves with the criteria for the column as the value in the table and returns the number of the OR...
Definition: tsqlormapper.h:268
int findCount(const TCriteria &cri=TCriteria())
Returns the number of records retrieved with the criteria cri from the table.
Definition: tsqlormapper.h:521
T findFirstBy(int column, const QVariant &value)
Returns the first ORM object retrieved with the criteria for the column as the value in the table.
Definition: tsqlormapper.h:213
int rowCount() const
Returns the number of rows of the current query.
Definition: tsqlormapper.h:289
void setOffset(int offset)
Sets the offset to offset, which is the number of rows to skip for execution of SELECT statement.
Definition: tsqlormapper.h:355
TSqlORMapper< T > & join(int column, const TSqlJoin< C > &join)
Definition: tsqlormapper.h:708
int findCountBy(int column, const QVariant &value)
Returns the number of records retrieved with the criteria for the column as the value from the table.
Definition: tsqlormapper.h:551
void setLimit(int limit)
Sets the limit to limit, which is the limited number of rows for execution of SELECT statement.
Definition: tsqlormapper.h:345
virtual ~TSqlORMapper()
Destructor.
Definition: tsqlormapper.h:178
int updateAll(const TCriteria &cri, int column, const QVariant &value)
Updates the value of the specified column in all rows that satisfy the criteria cri and returns the n...
Definition: tsqlormapper.h:624
ConstIterator end() const
Definition: tsqlormapper.h:93
void reset()
Reset the internal state of the mapper object.
Definition: tsqlormapper.h:718
int removeAll(const TCriteria &cri=TCriteria())
Removes all rows based on the criteria cri from the table and returns the number of the rows affected...
Definition: tsqlormapper.h:636
T first() const
Returns the first ORM object in the results retrieved by find() function.
Definition: tsqlormapper.h:308
void setFilter(const QString &filter)
Sets the current filter to filter.
Definition: tsqlormapper.h:440
virtual QString orderByClause() const
Definition: tsqlormapper.h:146
QString orderBy() const
Returns a SQL WHERE clause generated from a criteria.
Definition: tsqlormapper.h:746
T findByPrimaryKey(const QVariant &pk)
Returns the ORM object retrieved with the primary key pk from the table.
Definition: tsqlormapper.h:223
ConstIterator begin() const
Definition: tsqlormapper.h:92
TSqlORMapper< T > & offset(int offset)
Sets the offset to offset, which is the number of rows to skip for execution of SELECT statement.
Definition: tsqlormapper.h:407
TSqlORMapper< T > & limit(int limit)
Sets the limit to limit, which is the limited number of rows for execution of SELECT statement.
Definition: tsqlormapper.h:396
The TSqlQuery class provides a means of executing and manipulating SQL statements.
Definition: tsqlquery.h:6
QVariant value(int index) const
Returns the value of field index in the current record.
Definition: tsqlquery.h:74
bool exec(const QString &query)
Executes the SQL in query.
Definition: tsqlquery.cpp:220
int numRowsAffected() const
Returns the number of rows affected by the result's SQL statement, or -1 if it cannot be determined.
Definition: tsqlquery.h:56
static QString formatValue(const QVariant &val, const QMetaType &type, int databaseId=0)
Returns a string representation of the value val for the database databaseId.
Definition: tsqlquery.cpp:128
static QString escapeIdentifier(const QString &identifier, QSqlDriver::IdentifierType type=QSqlDriver::FieldName, int databaseId=0)
Returns the identifier escaped according to the rules of the database databaseId.
Definition: tsqlquery.cpp:102
bool next()
Retrieves the next record in the result, if available, and positions the query on the retrieved recor...
Definition: tsqlquery.h:68
@ In
Definition: tfnamespace.h:292
@ InnerJoin
Definition: tfnamespace.h:301
@ RightJoin
Definition: tfnamespace.h:303
@ LeftJoin
Definition: tfnamespace.h:302
The Tf namespace contains miscellaneous identifiers used throughout the library of TreeFrog Framework...
Definition: tdebug.h:10
SortOrder
Definition: tfnamespace.h:133
@ AscendingOrder
Definition: tfnamespace.h:134
bool strcmp(const QByteArray &str1, const QByteArray &str2)
Definition: tglobal.h:294
T_CORE_EXPORT void writeQueryLog(const QString &query, bool success, const QSqlError &error, int duration)
Definition: tsystemglobal.cpp:202
T_CORE_EXPORT QSqlDatabase & currentSqlDatabase(int id) noexcept
Definition: tglobal.cpp:177
@ CaseInsensitive
Definition: tfnamespace.h:17
@ DateTime
Definition: tfnamespace.h:119
QSqlError lastError()
Returns the VariantMap object of the error status of the last operation.
Definition: tcachesqlitestore.cpp:26
#define T_DISABLE_COPY(Class)
Definition: tdeclexport.h:37
#define T_DISABLE_MOVE(Class)
Definition: tdeclexport.h:41
#define tWarn
Definition: tglobal.h:235
const QByteArray ModifiedAt("modifiedAt")
const QByteArray UpdatedAt("updatedAt")
void tSystemError(const char *msg,...)
Definition: tsystemglobal.cpp:134
void tSystemDebug(const char *msg,...)
Definition: tsystemglobal.cpp:162