From 9110b3e690723cd8b6b74bec1d6bfdf0ced008af Mon Sep 17 00:00:00 2001 From: SJunkies <41368976+SJunkies@users.noreply.github.com> Date: Sun, 12 Jul 2020 11:04:16 +0200 Subject: [PATCH] DBManager: ORDER BY parameter added to getRecord(s) (#770) -> All instances are now sorted in ascending order using the instance ID -> The web interface gets an incorrect instance order, which causes further problems --- include/db/DBManager.h | 8 +++++--- include/db/InstanceTable.h | 2 +- libsrc/db/DBManager.cpp | 23 ++++++++++++++++++----- 3 files changed, 24 insertions(+), 9 deletions(-) diff --git a/include/db/DBManager.h b/include/db/DBManager.h index 5a74dbc0..724a3ae7 100644 --- a/include/db/DBManager.h +++ b/include/db/DBManager.h @@ -83,18 +83,20 @@ public: /// @param[in] conditions condition to search for (WHERE) /// @param[out] results results of query /// @param[in] tColumns target columns to search in (optional) if not provided returns all columns + /// @param[in] tOrder target order columns with order by ASC/DESC (optional) /// @return True on success else false /// - bool getRecord(const VectorPair& conditions, QVariantMap& results, const QStringList& tColumns = QStringList()) const; + bool getRecord(const VectorPair& conditions, QVariantMap& results, const QStringList& tColumns = QStringList(), const QStringList& tOrder = QStringList()) const; /// /// @brief Get data of multiple records, you need to specify the columns. This search is without conditions. Good to grab all data from db /// @param[in] conditions condition to search for (WHERE) /// @param[out] results results of query - /// @param[in] tColumns target columns to search in (optional) if not provided returns all columns + /// @param[in] tColumns target columns to search in (optional) if not provided returns all columns + /// @param[in] tOrder target order columns with order by ASC/DESC (optional) /// @return True on success else false /// - bool getRecords(QVector& results, const QStringList& tColumns = QStringList()) const; + bool getRecords(QVector& results, const QStringList& tColumns = QStringList(), const QStringList& tOrder = QStringList()) const; /// /// @brief Delete a record determined by conditions diff --git a/include/db/InstanceTable.h b/include/db/InstanceTable.h index 1b7d880c..52f4a280 100644 --- a/include/db/InstanceTable.h +++ b/include/db/InstanceTable.h @@ -122,7 +122,7 @@ public: inline QVector getAllInstances(const bool& justEnabled = false) { QVector results; - getRecords(results); + getRecords(results, QStringList(), QStringList() << "instance ASC"); if(justEnabled) { for (auto it = results.begin(); it != results.end();) diff --git a/libsrc/db/DBManager.cpp b/libsrc/db/DBManager.cpp index 729e448a..8e0ea575 100644 --- a/libsrc/db/DBManager.cpp +++ b/libsrc/db/DBManager.cpp @@ -185,7 +185,7 @@ bool DBManager::updateRecord(const VectorPair& conditions, const QVariantMap& co return true; } -bool DBManager::getRecord(const VectorPair& conditions, QVariantMap& results, const QStringList& tColumns) const +bool DBManager::getRecord(const VectorPair& conditions, QVariantMap& results, const QStringList& tColumns, const QStringList& tOrder) const { QSqlDatabase idb = getDB(); QSqlQuery query(idb); @@ -195,18 +195,24 @@ bool DBManager::getRecord(const VectorPair& conditions, QVariantMap& results, co if(!tColumns.isEmpty()) sColumns = tColumns.join(", "); + QString sOrder(""); + if(!tOrder.isEmpty()) + { + sOrder = " ORDER BY "; + sOrder.append(tOrder.join(", ")); + } // prep conditions QStringList prepCond; QVariantList bindVal; if(!conditions.isEmpty()) - prepCond << "WHERE"; + prepCond << " WHERE"; for(const auto& pair : conditions) { prepCond << pair.first+"=?"; bindVal << pair.second; } - query.prepare(QString("SELECT %1 FROM %2 %3").arg(sColumns,_table).arg(prepCond.join(" "))); + query.prepare(QString("SELECT %1 FROM %2%3%4").arg(sColumns,_table).arg(prepCond.join(" ")).arg(sOrder)); doAddBindValue(query, bindVal); if(!query.exec()) @@ -227,7 +233,7 @@ bool DBManager::getRecord(const VectorPair& conditions, QVariantMap& results, co return true; } -bool DBManager::getRecords(QVector& results, const QStringList& tColumns) const +bool DBManager::getRecords(QVector& results, const QStringList& tColumns, const QStringList& tOrder) const { QSqlDatabase idb = getDB(); QSqlQuery query(idb); @@ -237,7 +243,14 @@ bool DBManager::getRecords(QVector& results, const QStringList& tCo if(!tColumns.isEmpty()) sColumns = tColumns.join(", "); - query.prepare(QString("SELECT %1 FROM %2").arg(sColumns,_table)); + QString sOrder(""); + if(!tOrder.isEmpty()) + { + sOrder = " ORDER BY "; + sOrder.append(tOrder.join(", ")); + } + + query.prepare(QString("SELECT %1 FROM %2%3").arg(sColumns,_table,sOrder)); if(!query.exec()) {