Ver código fonte

Refactored databaseSummary to be less stringy

Georgios Kotzampopoulos 4 anos atrás
pai
commit
131a6fa38d

+ 15 - 14
src/database/adatabase.cpp

@@ -655,11 +655,11 @@ QVector<QVariant> ADatabase::customQuery(QString statement, int return_values)
     }
 }
 
-QMap<QString, QString> ADatabase::databaseSummary(const QString &db_path)
+QMap<ADatabaseSummaryKey, QString> ADatabase::databaseSummary(const QString &db_path)
 {
     // List layout: {"# Flights", "# Aircraft", "# Pilots", "ISODate last flight", "Total Time hh:mm"}
     const QString connection_name = QStringLiteral("summary_connection");
-    QMap<QString, QString> return_values;
+    QMap<ADatabaseSummaryKey, QString> return_values;
     { // scope for a temporary database connection, ensures proper cleanup when removeDatabase() is called.
         DEB << "Adding temporary connection to database:" << db_path;
         QSqlDatabase temp_database = QSqlDatabase::addDatabase(SQLITE_DRIVER, connection_name); // Don't use default connection
@@ -668,16 +668,17 @@ QMap<QString, QString> ADatabase::databaseSummary(const QString &db_path)
             return {};
 
         QSqlQuery query(temp_database);
-        QString key;  // Used among the queries for verbosity... and sanity
-
-        const QStringList table_list = QStringList {
-                QStringLiteral("flights"),
-                QStringLiteral("tails"),
-                QStringLiteral("pilots")};
-        for (const auto & table : table_list) {
-            query.prepare(QLatin1String("SELECT COUNT (*) FROM ") + table);
-            key = QStringLiteral("total_") + table;
+        ADatabaseSummaryKey key;  // Used among the queries for verbosity... and sanity
+
+        const QVector<QPair<ADatabaseSummaryKey, QString>> key_table_pairs = {
+                {ADatabaseSummaryKey::total_flights, QStringLiteral("flights")},
+                {ADatabaseSummaryKey::total_tails, QStringLiteral("tails")},
+                {ADatabaseSummaryKey::total_pilots, QStringLiteral("pilots")}
+    };
+        for (const auto & pair : key_table_pairs) {
+            query.prepare(QLatin1String("SELECT COUNT (*) FROM ") + pair.second);
             query.exec();
+            key = pair.first;
             if (query.first()){
                 return_values[key] = query.value(0).toString();
             }
@@ -687,8 +688,8 @@ QMap<QString, QString> ADatabase::databaseSummary(const QString &db_path)
         }
 
         query.prepare(QStringLiteral("SELECT MAX(doft) FROM flights"));
-        key = QStringLiteral("max_doft");
         query.exec();
+        key = ADatabaseSummaryKey::max_doft;
         if (query.first()){
             return_values[key] = query.value(0).toString();
         }
@@ -700,7 +701,7 @@ QMap<QString, QString> ADatabase::databaseSummary(const QString &db_path)
                                      "printf(\"%02d\",CAST(SUM(tblk) AS INT)/60)"
                                      "||':'||"
                                      "printf(\"%02d\",CAST(SUM(tblk) AS INT)%60) FROM flights"));
-        key = QStringLiteral("total_time");
+        key = ADatabaseSummaryKey::total_time;
         query.exec();
         if (query.first()){
             return_values[key] = query.value(0).toString();
@@ -711,7 +712,7 @@ QMap<QString, QString> ADatabase::databaseSummary(const QString &db_path)
     }
 
     QSqlDatabase::removeDatabase(connection_name); // cleanly removes temp connection without leaks since query+db are out of scope
-    DEB << return_values;
+//    DEB << return_values;  // [G]: ADatabaseSummaryKeys cant print
 
     return return_values;
 }

+ 12 - 1
src/database/adatabase.h

@@ -68,6 +68,17 @@ enum class ADatabaseTarget
     tails
 };
 
+/*!
+ * \brief Enumerates the QMap keys used when summarising a database
+ */
+enum class ADatabaseSummaryKey {
+    total_flights,
+    total_tails,
+    total_pilots,
+    max_doft,
+    total_time,
+};
+
 // [G]: This is how we should handle custom "events" in the program.
 // In this case a custom error doesnt need to be built from scratch.
 // Find the type of error you want and extend it with a few tweaks.
@@ -285,7 +296,7 @@ public:
      * and ADD DOCUMENTATION, theres some specific sql stuff going on.
      * \return
      */
-    QMap<QString, QString> databaseSummary(const QString& db_path);
+    QMap<ADatabaseSummaryKey, QString> databaseSummary(const QString& db_path);
 
     bool restoreBackup(const QString& backup_file);
     bool createBackup(const QString& dest_file);

+ 34 - 26
src/gui/widgets/backupwidget.cpp

@@ -3,6 +3,7 @@
 #include "src/classes/astandardpaths.h"
 #include "src/testing/adebug.h"
 #include "src/database/adatabase.h"
+#include "src/functions/adatetime.h"
 
 #include <QListView>
 #include <QStandardItemModel>
@@ -37,7 +38,7 @@ BackupWidget::BackupWidget(QWidget *parent) :
     model = new QStandardItemModel(this);
     model->setHorizontalHeaderLabels(QStringList{"Backup File","Total Flights", "Total Tails",
                                                  "Total Pilots", "Max Doft", "Total Time"});  // [G]: TODO make const but where?
-    fillTableWithSampleData();
+    refresh();
 }
 
 BackupWidget::~BackupWidget()
@@ -45,6 +46,13 @@ BackupWidget::~BackupWidget()
     delete ui;
 }
 
+QString BackupWidget::absoluteBackupPath()
+{
+    const QString backup_name = QLatin1String("logbook_backup_")
+            + ADateTime::toString(QDateTime::currentDateTime(), Opl::Datetime::Backup)
+            + QLatin1String(".db");
+    return AStandardPaths::asChildOfDir(AStandardPaths::Backup, backup_name);
+}
 
 void BackupWidget::on_tableView_clicked(const QModelIndex &index)
 {
@@ -54,28 +62,23 @@ void BackupWidget::on_tableView_clicked(const QModelIndex &index)
 
 void BackupWidget::on_createLocalPushButton_clicked()
 {
-    QString filename = AStandardPaths::asChildOfDir(AStandardPaths::Backup, "backup");
-
+    QString filename = absoluteBackupPath();
     DEB << filename;
 
-    if(filename.endsWith(".db") == false) {  // [G] TODO: get function that generates the name automatically
-        filename.append(".db");
-    }
-
-    if(aDB->createBackup(filename) == false) {
+    if(!aDB->createBackup(filename)) {
         WARN << "Could not create local file:" << filename;
         return;
     }
 
     // [G] TODO: propably make a function out of this for future tweaks
     QFileIconProvider provider;
-    QMap<QString, QString> summary = aDB->databaseSummary(filename);
-    model->appendRow({new QStandardItem(provider.icon(QFileIconProvider::File), QFileInfo(filename).baseName()),
-                      new QStandardItem(summary["total_flights"]),
-                      new QStandardItem(summary["total_tails"]),
-                      new QStandardItem(summary["total_pilots"]),
-                      new QStandardItem(summary["max_doft"]),
-                      new QStandardItem(summary["total_time"])
+    QMap<ADatabaseSummaryKey, QString> summary = aDB->databaseSummary(filename);
+    model->appendRow({new AFileStandardItem(provider.icon(QFileIconProvider::File), QFileInfo(filename)),
+                      new QStandardItem(summary[ADatabaseSummaryKey::total_flights]),
+                      new QStandardItem(summary[ADatabaseSummaryKey::total_tails]),
+                      new QStandardItem(summary[ADatabaseSummaryKey::total_pilots]),
+                      new QStandardItem(summary[ADatabaseSummaryKey::max_doft]),
+                      new QStandardItem(summary[ADatabaseSummaryKey::total_time])
                      });
 }
 
@@ -92,7 +95,8 @@ void BackupWidget::on_restoreLocalPushButton_clicked()
                 AStandardPaths::Backup,
                 selectedFileInfo->data(Qt::DisplayRole).toString()
                 );
-    if(aDB->restoreBackup(backup_name) == false) {
+
+    if(!aDB->restoreBackup(backup_name)) {
         WARN << "Couldnt restore" << backup_name;
     }
 }
@@ -120,6 +124,13 @@ void BackupWidget::on_deleteSelectedPushButton_clicked()
     }
 
     model->removeRow(selectedFileInfo->row());
+    // [G] TODO: figure out selection coordination between view model and selected
+    if(selectedFileInfo->row() - 1 < 0) {
+        selectedFileInfo = nullptr;
+    }
+    else {
+        selectedFileInfo = static_cast<AFileStandardItem*>(model->item(selectedFileInfo->row()-1));
+    }
 }
 
 void BackupWidget::on_createExternalPushButton_clicked()
@@ -132,7 +143,6 @@ void BackupWidget::on_createExternalPushButton_clicked()
                 ".db"
     );
     // [G]: The window isn resizable and i cant easily debug the buttons (cant find them xD)
-    // [G] TODO: get time to properly format filename
     // Open something like a QFileDialog and let the user choose where to save the backup
 }
 
@@ -151,7 +161,6 @@ void BackupWidget::on_restoreExternalPushButton_clicked()
 }
 
 void BackupWidget::on_aboutPushButton_clicked() {
-    // Shows a message box explaining a little about local and external backups
     // [G]: Add message text. Could this be predefined in Opl::Assets?
     QMessageBox msg_box(QMessageBox::Information, "About backups", "...", QMessageBox::Ok);
     msg_box.exec();
@@ -162,7 +171,7 @@ void BackupWidget::on_aboutPushButton_clicked() {
 // ===================================================================================
 
 // feel free to delete this as you go along, just here for demonstration purposes
-void BackupWidget::fillTableWithSampleData()
+void BackupWidget::refresh()
 {
     // First column in table, would be created by listing the files in backupdir
     QDir backup_dir = QDir(AStandardPaths::directory(AStandardPaths::Backup));
@@ -175,14 +184,13 @@ void BackupWidget::fillTableWithSampleData()
 
     // Get summary of each db file and populate lists (columns) of data
     for (const auto &entry : entries) {
-        QMap<QString, QString> summary = aDB->databaseSummary(backup_dir.absoluteFilePath(entry));
-//        model->appendRow({new QStandardItem(provider.icon(QFileIconProvider::File), entry),
+        QMap<ADatabaseSummaryKey, QString> summary = aDB->databaseSummary(backup_dir.absoluteFilePath(entry));
         model->appendRow({new AFileStandardItem(provider.icon(QFileIconProvider::File), entry, AStandardPaths::Backup),
-                          new QStandardItem(summary["total_flights"]),
-                          new QStandardItem(summary["total_tails"]),
-                          new QStandardItem(summary["total_pilots"]),
-                          new QStandardItem(summary["max_doft"]),
-                          new QStandardItem(summary["total_time"])
+                          new QStandardItem(summary[ADatabaseSummaryKey::total_flights]),
+                          new QStandardItem(summary[ADatabaseSummaryKey::total_tails]),
+                          new QStandardItem(summary[ADatabaseSummaryKey::total_pilots]),
+                          new QStandardItem(summary[ADatabaseSummaryKey::max_doft]),
+                          new QStandardItem(summary[ADatabaseSummaryKey::total_time])
                          });
     }
 

+ 11 - 1
src/gui/widgets/backupwidget.h

@@ -28,6 +28,11 @@ public:
         : QStandardItem(icon, filename),
           fileInfo(QFileInfo(AStandardPaths::asChildOfDir(dir, filename)))
     {}
+    AFileStandardItem(const QIcon& icon, const QFileInfo file_info)
+        : QStandardItem(icon, file_info.baseName()),
+          fileInfo(QFileInfo(file_info))
+    {}
+
 
     const QFileInfo& info() const
     {
@@ -43,6 +48,11 @@ public:
     explicit BackupWidget(QWidget *parent = nullptr);
     ~BackupWidget();
 
+    /*!
+     * \brief Generates the absolute path for a new backup file.
+     */
+    QString absoluteBackupPath();
+
 private slots:
     void on_tableView_clicked(const QModelIndex &index);
 
@@ -65,7 +75,7 @@ private:
     AFileStandardItem *selectedFileInfo = nullptr;  // Only the first column is necessary for
                                                     // any operation and it is encapsulated in the
                                                     // AFileStandardItem class
-    void fillTableWithSampleData();
+    void refresh();
 };
 
 #endif // BACKUPWIDGET_H