Browse Source

Added new getEntryData

Added a new getEntryData function that returns TableData to populate an entry object constructed from PositionData
Felix Turo 4 years ago
parent
commit
c88e3ad7e1

+ 1 - 1
main.cpp

@@ -50,7 +50,7 @@ int main(int argc, char *argv[])
     QSettings::setDefaultFormat(QSettings::IniFormat);
     QSettings settings;
 
-    Db::connect();
+//    Db::connect();
 
     QApplication openPilotLog(argc, argv);
     if(!setup()){

+ 54 - 2
src/experimental/DataBase.cpp

@@ -2,11 +2,12 @@
 
 namespace experimental {
 
-DataBase* const DataBase::instance = nullptr;
+DataBase* DataBase::instance = nullptr;
 
 DataBase* DataBase::getInstance()
 {
-    return instance ?: new DataBase();
+    if (!instance) instance = new DataBase();
+    return instance;
 }
 
 bool DataBase::connect()
@@ -37,6 +38,7 @@ bool DataBase::connect()
             tableColumns.insert(table, columnNames);
         }
     }
+    DEB("Database Tables: " << tableNames);
     return true;
 }
 
@@ -155,6 +157,56 @@ bool DataBase::insert(Entry newEntry)
 
 }
 
+TableData DataBase::getEntryData(DataPosition dataPosition)
+{
+    // check table exists
+    if (!tableNames.contains(dataPosition.first)) {
+        DEB(dataPosition.first << " not a table in the database. Unable to retreive Entry data.");
+        // emit databaseError
+        return TableData();
+    }
+
+    //Check Database for rowId
+    QString statement = "SELECT COUNT(*) FROM " + dataPosition.first
+                      + " WHERE _rowid_=" + QString::number(dataPosition.second);
+    QSqlQuery checkQuery(statement);
+
+    if (checkQuery.lastError().type() != QSqlError::NoError) {
+        DEB("SQL error: " << checkQuery.lastError().text());
+        DEB("Statement: " << statement);
+        // emit sqlError(selectQuery.lastError().text(), statement)
+        return TableData();
+    }
+
+    checkQuery.next();
+    if (checkQuery.value(0).toInt() == 0) {
+        DEB("No Entry found for row id: " << dataPosition.second );
+        // emit databaseError("No Entry found for row id: " + dataPosition.second)
+        return TableData();
+    }
+
+    // Retreive TableData
+    DEB("Retreiving data for row id: " << dataPosition.second);
+    statement = "SELECT * FROM " + dataPosition.first
+              + " WHERE _rowid_=" + QString::number(dataPosition.second);
+
+    QSqlQuery selectQuery(statement);
+    if (selectQuery.lastError().type() != QSqlError::NoError) {
+        DEB("SQL error: " << selectQuery.lastError().text());
+        DEB("Statement: " << statement);
+        // emit sqlError(selectQuery.lastError().text(), statement)
+        return TableData();
+    }
+
+    selectQuery.next();
+    TableData entryData;
+
+    for (const auto &column : tableColumns.value(dataPosition.first)) {
+        entryData.insert(column, selectQuery.value(column).toString());
+    }
+    return entryData;
+}
+
 DataBase* DB() { return DataBase::getInstance(); }
 
 }

+ 6 - 1
src/experimental/DataBase.h

@@ -26,7 +26,7 @@ class DataBase {
 private:
     TableNames tableNames;
     TableColumns tableColumns;
-    static DataBase* const instance;
+    static DataBase* instance;
     DataBase() = default;
 public:
     // Ensure DB is not copiable or assignable
@@ -70,6 +70,11 @@ public:
      */
     bool remove(Entry entry);
 
+    /*!
+     * \brief retreive entry data from the database to create an entry object
+     */
+    TableData getEntryData(DataPosition);
+
 };
 
 /*!

+ 22 - 2
src/gui/widgets/homewidget.cpp

@@ -38,6 +38,26 @@ HomeWidget::~HomeWidget()
 
 void HomeWidget::on_pushButton_clicked()
 {
-    NewFlightDialog nf(this, Flight(11), Db::editExisting);
-    nf.exec();
+    using namespace experimental;
+    DB()->connect();
+    DataPosition dp = {"pilots", 7};
+    DEB(DB()->getEntryData(dp));
+    /*long intloop = 0;
+    long rangeloop = 0;
+    for (int i = 10; i < 100; i++) {
+        DataPosition dp = {"pilots", i};
+
+        auto start = std::chrono::system_clock::now();
+        DB()->getEntryData(dp);
+        auto stop = std::chrono::system_clock::now();
+        auto duration = stop - start;
+        intloop += duration.count();
+        auto start2 = std::chrono::system_clock::now();
+        DB()->getEntryDataFor(dp);
+        auto stop2 = std::chrono::system_clock::now();
+        auto duration2 = stop2 - start2;
+        rangeloop += duration2.count();
+    }
+    DEB("Average execution time: (int loop)   " << intloop/10000);
+    DEB("Average execution time: (range loop) " << rangeloop/10000);*/
 }

+ 2 - 0
src/gui/widgets/homewidget.h

@@ -34,6 +34,8 @@
 #include "src/gui/dialogues/firstrundialog.h"
 #include "src/gui/dialogues/newflightdialog.h"
 
+#include "src/experimental/DataBase.h"
+#include "src/experimental/Decl.h"
 
 namespace Ui {
 class HomeWidget;