浏览代码

Refactored databaseSummary to return a QMap, split summary columns

George 4 年之前
父节点
当前提交
1975ad00a3
共有 3 个文件被更改,包括 52 次插入27 次删除
  1. 28 18
      src/database/adatabase.cpp
  2. 8 1
      src/database/adatabase.h
  3. 16 8
      src/gui/widgets/backupwidget.cpp

+ 28 - 18
src/database/adatabase.cpp

@@ -653,49 +653,59 @@ QVector<QVariant> ADatabase::customQuery(QString statement, int return_values)
     }
     }
 }
 }
 
 
-QStringList ADatabase::databaseSummary(const QString &db_path)
+QMap<QString, QString> ADatabase::databaseSummary(const QString &db_path)
 {
 {
-    const QString connection_name = QStringLiteral("summary_connection");
-    QStringList return_values;
     // List layout: {"# Flights", "# Aircraft", "# Pilots", "ISODate last flight", "Total Time hh:mm"}
     // List layout: {"# Flights", "# Aircraft", "# Pilots", "ISODate last flight", "Total Time hh:mm"}
-
+    const QString connection_name = QStringLiteral("summary_connection");
+    QMap<QString, QString> return_values;
     { // scope for a temporary database connection, ensures proper cleanup when removeDatabase() is called.
     { // scope for a temporary database connection, ensures proper cleanup when removeDatabase() is called.
         DEB << "Adding temporary connection to database:" << db_path;
         DEB << "Adding temporary connection to database:" << db_path;
         QSqlDatabase temp_database = QSqlDatabase::addDatabase(SQLITE_DRIVER, connection_name); // Don't use default connection
         QSqlDatabase temp_database = QSqlDatabase::addDatabase(SQLITE_DRIVER, connection_name); // Don't use default connection
         temp_database.setDatabaseName(db_path);
         temp_database.setDatabaseName(db_path);
         if (!temp_database.open())
         if (!temp_database.open())
-            return QStringList();
+            return {};
+
+        QSqlQuery query(temp_database);
+        QString key;  // Used among the queries for verbosity... and sanity
 
 
         const QStringList table_list = QStringList {
         const QStringList table_list = QStringList {
                 QStringLiteral("flights"),
                 QStringLiteral("flights"),
                 QStringLiteral("tails"),
                 QStringLiteral("tails"),
                 QStringLiteral("pilots")};
                 QStringLiteral("pilots")};
-        QSqlQuery query(temp_database);
         for (const auto & table : table_list) {
         for (const auto & table : table_list) {
             query.prepare(QLatin1String("SELECT COUNT (*) FROM ") + table);
             query.prepare(QLatin1String("SELECT COUNT (*) FROM ") + table);
+            key = QStringLiteral("total_") + table;
             query.exec();
             query.exec();
-            if (query.first())
-                return_values.append(query.value(0).toString());
-            else
-                return_values.append(QString());
+            if (query.first()){
+                return_values[key] = query.value(0).toString();
+            }
+            else{
+                return_values[key] = QString();
+            }
         }
         }
 
 
         query.prepare(QStringLiteral("SELECT MAX(doft) FROM flights"));
         query.prepare(QStringLiteral("SELECT MAX(doft) FROM flights"));
+        key = QStringLiteral("max_doft");
         query.exec();
         query.exec();
-        if (query.first())
-            return_values.append(query.value(0).toString());
-        else
-            return_values.append(QString());
+        if (query.first()){
+            return_values[key] = query.value(0).toString();
+        }
+        else {
+            return_values[key] = QString();
+        }
 
 
         query.prepare(QStringLiteral("SELECT "
         query.prepare(QStringLiteral("SELECT "
                                      "printf(\"%02d\",CAST(SUM(tblk) AS INT)/60)"
                                      "printf(\"%02d\",CAST(SUM(tblk) AS INT)/60)"
                                      "||':'||"
                                      "||':'||"
                                      "printf(\"%02d\",CAST(SUM(tblk) AS INT)%60) FROM flights"));
                                      "printf(\"%02d\",CAST(SUM(tblk) AS INT)%60) FROM flights"));
+        key = QStringLiteral("total_time");
         query.exec();
         query.exec();
-        if (query.first())
-            return_values.append(query.value(0).toString());
-        else
-            return_values.append(QString());
+        if (query.first()){
+            return_values[key] = query.value(0).toString();
+        }
+        else {
+            return_values[key] = QString();
+        }
     }
     }
 
 
     QSqlDatabase::removeDatabase(connection_name); // cleanly removes temp connection without leaks since query+db are out of scope
     QSqlDatabase::removeDatabase(connection_name); // cleanly removes temp connection without leaks since query+db are out of scope

+ 8 - 1
src/database/adatabase.h

@@ -259,7 +259,14 @@ public:
      */
      */
     ATailEntry resolveForeignTail(RowId_T foreign_key);
     ATailEntry resolveForeignTail(RowId_T foreign_key);
 
 
-    QStringList databaseSummary(const QString& db_path);
+    /*!
+     * \brief Return the summary of the DB_PATH as a stringlist
+     * \todo Contemplate whether it should be a more generic function
+     * that may be used for different elements to summarize.
+     * and ADD DOCUMENTATION, theres some specific sql stuff going on.
+     * \return
+     */
+    QMap<QString, QString> databaseSummary(const QString& db_path);
 
 
 
 
 
 

+ 16 - 8
src/gui/widgets/backupwidget.cpp

@@ -79,7 +79,7 @@ void BackupWidget::fillTableWithSampleData()
 {
 {
     // First column in table, would be created by listing the files in backupdir
     // First column in table, would be created by listing the files in backupdir
     QDir backup_dir = QDir(AStandardPaths::directory(AStandardPaths::Backup));
     QDir backup_dir = QDir(AStandardPaths::directory(AStandardPaths::Backup));
-    QStringList entries = backup_dir.entryList(QStringList{"*.db"});  // [G]: TODO make const but where?
+    QStringList entries = backup_dir.entryList(QStringList{"*.db"});
     QList<QStandardItem*> filenames;
     QList<QStandardItem*> filenames;
     QFileIconProvider provider;
     QFileIconProvider provider;
 
 
@@ -89,12 +89,15 @@ void BackupWidget::fillTableWithSampleData()
         filenames.append(item);
         filenames.append(item);
     }
     }
 
 
-    // Second column, would be created by reading the details from each file and creating the description string
-    QList<QStandardItem *> descriptions;
+    // Get summary of each db file and populate lists (columns) of data
+    QList<QStandardItem *> total_flights, total_tails, total_pilots, max_doft, total_time;
     for (const auto &entry : entries) {
     for (const auto &entry : entries) {
-        QStringList summary = aDB->databaseSummary(entry);
-        auto item = new QStandardItem(summary.join(", "));
-        descriptions.prepend(item);  // Make a O(1) op here and deal with sorting later
+        QMap<QString, QString> summary = aDB->databaseSummary(backup_dir.absoluteFilePath(entry));
+        total_flights.prepend(new QStandardItem(summary["total_flights"]));
+        total_tails.prepend(new QStandardItem(summary["total_tails"]));
+        total_pilots.prepend(new QStandardItem(summary["total_pilots"]));
+        max_doft.prepend(new QStandardItem(summary["max_doft"]));
+        total_time.prepend(new QStandardItem(summary["total_time"]));
     }
     }
 
 
     // [G]: Sort entries? based on what? the files are abit inconsistent in their naming atm
     // [G]: Sort entries? based on what? the files are abit inconsistent in their naming atm
@@ -102,8 +105,13 @@ void BackupWidget::fillTableWithSampleData()
 
 
     model = new QStandardItemModel(this);
     model = new QStandardItemModel(this);
     model->insertColumn(0, filenames);
     model->insertColumn(0, filenames);
-    model->insertColumn(1, descriptions);
-    model->setHorizontalHeaderLabels(QStringList{"Backup File","Summary"});  // [G]: TODO make const but where?
+    model->insertColumn(1, total_flights);  // flight
+    model->insertColumn(2, total_tails);  // tails
+    model->insertColumn(3, total_pilots);  // pilots
+    model->insertColumn(4, max_doft);  // doft
+    model->insertColumn(5, total_time);  // time
+    model->setHorizontalHeaderLabels(QStringList{"Backup File","Total Flights", "Total Tails",
+                                                 "Total Pilots", "Max Doft", "Total Time"});  // [G]: TODO make const but where?
     ui->tableView->setModel(model);
     ui->tableView->setModel(model);
     ui->tableView->resizeColumnsToContents();  // [G]: Bit hacky couldnt do it by default
     ui->tableView->resizeColumnsToContents();  // [G]: Bit hacky couldnt do it by default
 }
 }