Browse Source

Tweaks on database

Database TableData is now a QMap<QString, QVariant>, which is more approprate for 2 main reasons:

1) The database holds integers, strings, etc. using QVariant enables us to better represent an entry
2) It avoids a lot of casting, since before we had to convert from int to string and vice versa before adding a value to the map

Additionally, table columns now have StringLiterals that can be used to access data from columns or tables by name. This reduces memory allocation at runtime and improves performance.

With all tweaks ~10-20pc performance improvement for handling database entries
Felix Turowsky 4 years ago
parent
commit
52fd64e57b

+ 1 - 0
openPilotLog.pro

@@ -65,6 +65,7 @@ HEADERS += \
     src/database/db.h \
     src/database/dbinfo.h \
     src/database/entry_deprecated.h \
+    src/database/tablecolumnliterals.h \
     src/experimental/UserInput.h \
     src/experimental/aaircraftentry.h \
     src/experimental/adatabase.h \

+ 91 - 0
src/database/tablecolumnliterals.h

@@ -0,0 +1,91 @@
+#ifndef TABLECOLUMNLITERALS_H
+#define TABLECOLUMNLITERALS_H
+
+#include <QString>
+#include <QStringLiteral>
+
+/// [F]: These constants deviate slightly from const naming convention to reflect their sql column name.
+/// In many places throughout the application, we have to programatically access or write data
+/// to or from the database using column names as identifiers, doing something like this:
+///
+/// newData.insert("dept", ui->deptLocLineEdit->text());
+/// newData.value("multipilot") // do stuff
+///
+///
+/// Declaring the literals here avoids memory allocation at runtime for construction of temporary qstrings
+/// like ("dept"). See https://doc.qt.io/qt-5/qstring.html#QStringLiteral
+///
+
+// Table names
+static const auto DB_TABLE_FLIGHTS  = QStringLiteral("flights");
+static const auto DB_TABLE_PILOTS   = QStringLiteral("pilots");
+static const auto DB_TABLE_TAILS    = QStringLiteral("tails");
+static const auto DB_TABLE_AIRCRAFT = QStringLiteral("aircraft");
+static const auto DB_TABLE_AIRPORTS = QStringLiteral("airports");
+
+// Flights table
+static const auto DB_doft           = QStringLiteral("doft");
+static const auto DB_dept           = QStringLiteral("dept");
+static const auto DB_dest           = QStringLiteral("dest");
+static const auto DB_tofb           = QStringLiteral("tofb");
+static const auto DB_tonb           = QStringLiteral("tonb");
+static const auto DB_pic            = QStringLiteral("pic");
+static const auto DB_acft           = QStringLiteral("acft");
+static const auto DB_tblk           = QStringLiteral("tblk");
+static const auto DB_tSPSE          = QStringLiteral("tSPSE");
+static const auto DB_tSPME          = QStringLiteral("tSPME");
+static const auto DB_tMP            = QStringLiteral("tMP");
+static const auto DB_tNIGHT         = QStringLiteral("tNIGHT");
+static const auto DB_tIFR           = QStringLiteral("tIFR");
+static const auto DB_tPIC           = QStringLiteral("tPIC");
+static const auto DB_tPICUS         = QStringLiteral("tPICUS");
+static const auto DB_tSIC           = QStringLiteral("tSIC");
+static const auto DB_tDUAL          = QStringLiteral("tDUAL");
+static const auto DB_tFI            = QStringLiteral("tFI");
+static const auto DB_tSIM           = QStringLiteral("tSIM");
+static const auto DB_pilotFlying    = QStringLiteral("pilotFlying");
+static const auto DB_toDay          = QStringLiteral("toDay");
+static const auto DB_toNight        = QStringLiteral("toNight");
+static const auto DB_ldgDay         = QStringLiteral("ldgDay");
+static const auto DB_ldgNight       = QStringLiteral("ldgNight");
+static const auto DB_autoland       = QStringLiteral("autoland");
+static const auto DB_secondPilot    = QStringLiteral("secondPilot");
+static const auto DB_thirdPilot     = QStringLiteral("thirdPilot");
+static const auto DB_ApproachType   = QStringLiteral("ApproachType");
+static const auto DB_FlightNumber   = QStringLiteral("FlightNumber");
+static const auto DB_Remarks        = QStringLiteral("Remarks");
+
+// aircraft and tails tables
+
+static const auto DB_registration   = QStringLiteral("registration");
+//static const auto DB_company      = QStringLiteral("company"); to do - resolve naming conflict with pilots.company, time being these are equivalent since they are unique in their respective tables but still..
+static const auto DB_make           = QStringLiteral("make");
+static const auto DB_model          = QStringLiteral("model");
+static const auto DB_variant        = QStringLiteral("variant");
+static const auto DB_multipilot     = QStringLiteral("multipilot");
+static const auto DB_multiengine    = QStringLiteral("multiengine");
+static const auto DB_engineType     = QStringLiteral("engineType");
+static const auto DB_weightClass    = QStringLiteral("weightClass");
+
+// pilots table
+
+static const auto DB_piclastname    = QStringLiteral("piclastname");
+static const auto DB_picfirstname   = QStringLiteral("picfirstname");
+static const auto DB_alias          = QStringLiteral("alias");
+static const auto DB_company        = QStringLiteral("company");
+static const auto DB_employeeid     = QStringLiteral("employeeid");
+static const auto DB_phone          = QStringLiteral("phone");
+static const auto DB_email          = QStringLiteral("email");
+
+// all tables
+
+static const auto DB_ROWID          = QStringLiteral("ROWID");
+static const auto DB_NULL           = QStringLiteral("");
+static const auto DB_NULL_hhmm      = QStringLiteral("00:00");
+/*static const auto DB_               = QStringLiteral("");
+static const auto DB_               = QStringLiteral("");
+static const auto DB_               = QStringLiteral("");
+static const auto DB_               = QStringLiteral("");
+static const auto DB_               = QStringLiteral("");*/
+
+#endif // TABLECOLUMNLITERALS_H

+ 1 - 1
src/experimental/aaircraftentry.cpp

@@ -24,7 +24,7 @@ AAircraftEntry::AAircraftEntry()
 {}
 
 AAircraftEntry::AAircraftEntry(int row_id)
-    : AEntry::AEntry(DataPosition("aircraft", row_id))
+    : AEntry::AEntry(DataPosition(QLatin1String("aircraft"), row_id))
 {}
 
 AAircraftEntry::AAircraftEntry(TableData table_data)

+ 27 - 16
src/experimental/adatabase.cpp

@@ -16,6 +16,7 @@
  *along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 #include "adatabase.h"
+#include "src/database/tablecolumnliterals.h"
 
 namespace experimental {
 
@@ -48,16 +49,17 @@ bool ADataBase::connect()
     QSqlQuery query("PRAGMA foreign_keys = ON;");
     tableNames = db.tables();
 
-    QStringList columnNames;
+    QStringList column_names;
     for (const auto &table : tableNames) {
-        columnNames.clear();
+        column_names.clear();
         QSqlRecord fields = db.record(table);
         for (int i = 0; i < fields.count(); i++) {
-            columnNames.append(fields.field(i).name());
-            tableColumns.insert(table, columnNames);
+            column_names.append(fields.field(i).name());
+            tableColumns.insert(table, column_names);
         }
     }
     DEB("Database Tables: " << tableNames);
+    DEB("Tables and Columns: " << tableColumns);
     return true;
 }
 
@@ -92,8 +94,12 @@ bool ADataBase::remove(AEntry entry)
     }
 
     QString statement = "DELETE FROM " + entry.getPosition().tableName +
-            " WHERE ROWID=" + QString::number(entry.getPosition().rowId);
-    QSqlQuery query(statement);
+            " WHERE ROWID?";
+
+    QSqlQuery query;
+    query.prepare(statement);
+    query.addBindValue(entry.getPosition().rowId);
+    query.exec();
 
     if (query.lastError().type() == QSqlError::NoError)
     {
@@ -158,9 +164,10 @@ bool ADataBase::exists(AEntry entry)
 
     //Check database for row id
     QString statement = "SELECT COUNT(*) FROM " + entry.getPosition().tableName +
-            " WHERE ROWID=" + QString::number(entry.getPosition().rowId);
+            " WHERE ROWID=?";
     QSqlQuery query;
     query.prepare(statement);
+    query.addBindValue(entry.getPosition().rowId);
     query.setForwardOnly(true);
     query.exec();
     //this returns either 1 or 0 since row ids are unique
@@ -187,9 +194,10 @@ bool ADataBase::exists(DataPosition data_position)
 
     //Check database for row id
     QString statement = "SELECT COUNT(*) FROM " + data_position.first +
-            " WHERE ROWID=" + QString::number(data_position.second);
+            " WHERE ROWID=?";
     QSqlQuery query;
     query.prepare(statement);
+    query.addBindValue(data_position.second);
     query.setForwardOnly(true);
     query.exec();
     //this returns either 1 or 0 since row ids are unique
@@ -217,7 +225,7 @@ bool ADataBase::update(AEntry updated_entry)
         statement.append(i.key() + "=?,");
     }
     statement.chop(1);
-    statement.append(" WHERE ROWID=" + QString::number(updated_entry.getPosition().rowId));
+    statement.append(" WHERE ROWID=?");
     QSqlQuery query;
     query.prepare(statement);
     for (auto i = data.constBegin(); i != data.constEnd(); ++i) {
@@ -227,6 +235,7 @@ bool ADataBase::update(AEntry updated_entry)
             query.addBindValue(i.value());
         }
     }
+    query.addBindValue(updated_entry.getPosition().rowId);
     query.exec();
 
     if (query.lastError().type() == QSqlError::NoError)
@@ -248,7 +257,7 @@ bool ADataBase::insert(AEntry new_entry)
 {
     auto data = new_entry.getData();
     QString statement = "INSERT INTO " + new_entry.getPosition().tableName + QLatin1String(" (");
-    QMap<QString, QString>::iterator i;
+    QMap<QString, QVariant>::iterator i;
     for (i = data.begin(); i != data.end(); ++i) {
         statement.append(i.key() + ',');
     }
@@ -300,9 +309,10 @@ TableData ADataBase::getEntryData(DataPosition data_position)
 
     //Check Database for rowId
     QString statement = "SELECT COUNT(*) FROM " + data_position.first
-                      + " WHERE ROWID=" + QString::number(data_position.second);
+                      + " WHERE ROWID=?";
     QSqlQuery check_query;
     check_query.prepare(statement);
+    check_query.addBindValue(data_position.second);
     check_query.setForwardOnly(true);
     check_query.exec();
 
@@ -322,10 +332,11 @@ TableData ADataBase::getEntryData(DataPosition data_position)
 
     // Retreive TableData
     statement = "SELECT * FROM " + data_position.first
-              + " WHERE ROWID=" + QString::number(data_position.second);
+              + " WHERE ROWID=?";
 
     QSqlQuery select_query;
     select_query.prepare(statement);
+    select_query.addBindValue(data_position.second);
     select_query.setForwardOnly(true);
     select_query.exec();
 
@@ -340,7 +351,7 @@ TableData ADataBase::getEntryData(DataPosition data_position)
     TableData entry_data;
 
     for (const auto &column : tableColumns.value(data_position.first)) {
-        entry_data.insert(column, select_query.value(column).toString());
+        entry_data.insert(column, select_query.value(column));
     }
     return entry_data;
 }
@@ -481,13 +492,13 @@ int ADataBase::getLastEntry(ADataBase::DatabaseTarget target)
 
     switch (target) {
     case pilots:
-        statement.append("pilots");
+        statement.append(DB_TABLE_PILOTS);
         break;
     case aircraft:
-        statement.append("aircraft");
+        statement.append(DB_TABLE_AIRCRAFT);
         break;
     case tails:
-        statement.append("tails");
+        statement.append(DB_TABLE_AIRCRAFT);
         break;
     default:
         DEB("Not a valid completer target for this function.");

+ 1 - 0
src/experimental/aentry.h

@@ -22,6 +22,7 @@
 #include <QStringList>
 #include <QMap>
 #include <QPair>
+#include <QVariant>
 
 #include "decl.h"
 

+ 9 - 9
src/experimental/aflightentry.cpp

@@ -21,18 +21,18 @@ const QString AFlightEntry::summary()
         return QString();
 
     QString flight_summary;
-    flight_summary.append(tableData.value("doft") + " ");
-    flight_summary.append(tableData.value("dept") + " ");
-    flight_summary.append(ACalc::minutesToString(tableData.value("tofb")) + " ");
-    flight_summary.append(ACalc::minutesToString(tableData.value("tonb")) + " ");
-    flight_summary.append(tableData.value("dest") + " ");
+    flight_summary.append(tableData.value("doft").toString() + " ");
+    flight_summary.append(tableData.value("dept").toString() + " ");
+    flight_summary.append(ACalc::minutesToString(tableData.value("tofb").toString()) + " ");
+    flight_summary.append(ACalc::minutesToString(tableData.value("tonb").toString()) + " ");
+    flight_summary.append(tableData.value("dest").toString() + " ");
 
     return flight_summary;
 }
 
 const QString AFlightEntry::getRegistration()
 {
-    QString tail_id = tableData.value("acft");
+    QString tail_id = tableData.value(QLatin1String("acft")).toString();
     if(tail_id.isEmpty())
         return QString();
 
@@ -54,13 +54,13 @@ const QString AFlightEntry::getPilotName(pilot pilot_)
     QString row_id;
     switch (pilot_) {
     case pilot::pic:
-        row_id = tableData.value("pic");
+        row_id = tableData.value(QLatin1String("pic")).toString();
         break;
     case pilot::sic:
-        row_id = tableData.value("sic");
+        row_id = tableData.value(QLatin1String("sic")).toString();
         break;
     case pilot::thirdPilot:
-        row_id = tableData.value("thirdPilot");
+        row_id = tableData.value(QLatin1String("thirdPilot")).toString();
         break;
     }
     if(row_id == QString())

+ 1 - 1
src/experimental/apilotentry.cpp

@@ -24,7 +24,7 @@ APilotEntry::APilotEntry()
 {}
 
 APilotEntry::APilotEntry(int row_id)
-    : AEntry::AEntry(DataPosition("pilots", row_id))
+    : AEntry::AEntry(DataPosition(QLatin1String("pilots"), row_id))
 {}
 
 APilotEntry::APilotEntry(TableData table_data)

+ 8 - 8
src/experimental/atailentry.cpp

@@ -24,7 +24,7 @@ ATailEntry::ATailEntry()
 {}
 
 ATailEntry::ATailEntry(int row_id)
-    : AEntry::AEntry(DataPosition("tails", row_id))
+    : AEntry::AEntry(DataPosition(QLatin1String("tails"), row_id))
 {}
 
 ATailEntry::ATailEntry(TableData table_data)
@@ -33,18 +33,18 @@ ATailEntry::ATailEntry(TableData table_data)
 
 const QString ATailEntry::registration()
 {
-    return getData().value("registration");
+    return getData().value(QLatin1String("registration")).toString();
 }
 
 const QString ATailEntry::type()
 {
     QString type_string;
-    if (!getData().value("make").isEmpty())
-        type_string.append(getData().value("make") + ' ');
-    if (!getData().value("model").isEmpty())
-        type_string.append(getData().value("model"));
-    if (!getData().value("variant").isEmpty())
-        type_string.append('-' + getData().value("variant") + ' ');
+    if (!getData().value(QLatin1String("make")).toString().isEmpty())
+        type_string.append(getData().value(QLatin1String("make")).toString() + ' ');
+    if (!getData().value(QLatin1String("model")).toString().isEmpty())
+        type_string.append(getData().value(QLatin1String("model")).toString());
+    if (!getData().value(QLatin1String("variant")).toString().isEmpty())
+        type_string.append('-' + getData().value(QLatin1String("variant")).toString() + ' ');
 
     return type_string;
 }

+ 1 - 0
src/experimental/atailentry.h

@@ -20,6 +20,7 @@
 
 #include "src/experimental/aentry.h"
 #include "src/experimental/decl.h"
+#include <QVariant>
 
 namespace experimental {
 

+ 1 - 1
src/experimental/decl.h

@@ -9,7 +9,7 @@
 namespace experimental {
 
 using ColName = QString;
-using ColData = QString;
+using ColData = QVariant;
 using TableName = QString;
 using RowId = int;
 

+ 11 - 9
src/functions/acalc.cpp

@@ -279,17 +279,19 @@ void ACalc::updateAutoTimes(int acft_id)
         auto flight = aDB()->getFlightEntry(item.toInt());
         auto flight_data = flight.getData();
 
-        if(acft_data.value("multipilot") == "0" && acft_data.value("multiengine") == "0") {
+        if(acft_data.value("multipilot").toInt() == 0
+                && acft_data.value("multiengine") == 0) {
             DEB("SPSE");
             flight_data.insert("tSPSE", flight_data.value("tblk"));
             flight_data.insert("tSPME", "");
             flight_data.insert("tMP", "");
-        } else if ((acft_data.value("multipilot") == "0" && acft.getData().value("multiengine") == "1")) {
+        } else if ((acft_data.value("multipilot") == 0
+                    && acft.getData().value("multiengine") == 1)) {
             DEB("SPME");
             flight_data.insert("tSPME", flight_data.value("tblk"));
             flight_data.insert("tSPSE", "");
             flight_data.insert("tMP", "");
-        } else if ((acft_data.value("multipilot") == "1")) {
+        } else if ((acft_data.value("multipilot") == 1)) {
             DEB("MPME");
             flight_data.insert("tMP", flight_data.value("tblk"));
             flight_data.insert("tSPSE", "");
@@ -321,14 +323,14 @@ void ACalc::updateNightTimes()
 
         auto flt = aDB()->getFlightEntry(item.toInt());
         auto data = flt.getData();
-        auto dateTime = QDateTime(QDate::fromString(data.value("doft"),Qt::ISODate),
-                                  QTime().addSecs(data.value("tofb").toInt() * 60),
+        auto dateTime = QDateTime(QDate::fromString(data.value(QLatin1String("doft")).toString(), Qt::ISODate),
+                                  QTime().addSecs(data.value(QLatin1String("tofb")).toInt() * 60),
                                   Qt::UTC);
-        data.insert("tNIGHT", QString::number(
-                             calculateNightTime(data.value("dept"),
-                             data.value("dest"),
+        data.insert(QLatin1String("tNIGHT"), QString::number(
+                             calculateNightTime(data.value(QLatin1String("dept")).toString(),
+                             data.value(QLatin1String("dest")).toString(),
                              dateTime,
-                             data.value("tblk").toInt(),
+                             data.value(QLatin1String("tblk")).toInt(),
                              night_angle)));
         flt.setData(data);
         aDB()->commit(flt);

+ 16 - 2
src/functions/acalc.h

@@ -43,9 +43,9 @@ inline QTime blocktime(QTime tofb, QTime tonb)
  * \param blockminutes from database
  * \return String hh:mm
  */
-inline QString minutesToString(QString blockminutes)
+inline QString minutesToString(QString block_minutes)
 {
-    int minutes = blockminutes.toInt();
+    int minutes = block_minutes.toInt();
     QString hour = QString::number(minutes / 60);
     if (hour.size() < 2) {
         hour.prepend("0");
@@ -54,6 +54,20 @@ inline QString minutesToString(QString blockminutes)
     if (minute.size() < 2) {
         minute.prepend("0");
     }
+    QString block_time = hour + ":" + minute;
+    return block_time;
+};
+
+inline QString minutesToString(int block_minutes)
+{
+    QString hour = QString::number(block_minutes / 60);
+    if (hour.size() < 2) {
+        hour.prepend("0");
+    }
+    QString minute = QString::number(block_minutes % 60);
+    if (minute.size() < 2) {
+        minute.prepend("0");
+    }
     QString blocktime = hour + ":" + minute;
     return blocktime;
 };

+ 4 - 2
src/gui/dialogues/firstrundialog.cpp

@@ -14,7 +14,9 @@ FirstRunDialog::FirstRunDialog(QWidget *parent) :
     themeGroup->addButton(ui->systemThemeCheckBox, 0);
     themeGroup->addButton(ui->lightThemeCheckBox, 1);
     themeGroup->addButton(ui->darkThemeCheckBox, 2);
-    connect(themeGroup, SIGNAL(buttonClicked(int)), this, SLOT(themeGroup_toggled(int)));
+
+    QObject::connect(themeGroup, QOverload<int>::of(&QButtonGroup::buttonClicked),
+                     this, &FirstRunDialog::on_themeGroup_toggled);
 }
 
 FirstRunDialog::~FirstRunDialog()
@@ -38,7 +40,7 @@ void FirstRunDialog::on_nextPushButton_clicked()
 
 }
 
-void FirstRunDialog::themeGroup_toggled(int id)
+void FirstRunDialog::on_themeGroup_toggled(int id)
 {
     ASettings::write("main/theme", id);
 }

+ 1 - 1
src/gui/dialogues/firstrundialog.h

@@ -25,7 +25,7 @@ private slots:
 
     void on_nextPushButton_clicked();
 
-    void themeGroup_toggled(int id);
+    void on_themeGroup_toggled(int id);
 
     void on_finishButton_clicked();
 

+ 114 - 109
src/gui/dialogues/newflightdialog.cpp

@@ -18,6 +18,7 @@
 #include "newflightdialog.h"
 #include "ui_newflight.h"
 #include "src/testing/adebug.h"
+#include "src/database/tablecolumnliterals.h"
 
 using namespace experimental;
 
@@ -59,6 +60,10 @@ static const auto MANDATORY_LINE_EDITS_DISPLAY_NAMES = QMap<int, QLatin1String>
     {6, QLatin1String("Aircraft Registration")}
 };
 
+
+
+
+
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 ///                                      Construction                                           ///
 ///////////////////////////////////////////////////////////////////////////////////////////////////
@@ -163,7 +168,7 @@ void NewFlightDialog::readSettings()
     ui->FlightNumberLineEdit->setText(ASettings::read("flightlogging/flightnumberPrefix").toString());
     ui->calendarCheckBox->setChecked(ASettings::read("NewFlight/calendarCheckBox").toBool());
     if (ASettings::read("NewFlight/FunctionComboBox").toString() == "Co-Pilot") {
-        ui->picNameLineEdit->setText("");
+        ui->picNameLineEdit->setText(DB_NULL);
         ui->secondPilotNameLineEdit->setText("self");
     }
 }
@@ -388,8 +393,8 @@ void NewFlightDialog::fillDeductibleData()
                               ui->tDUALTimeLineEdit, ui->tFITimeLineEdit,};
     QList<QLabel*>      LB = {ui->tSPSELabel, ui->tSPMELabel,  ui->tMPLabel,  ui->tIFRLabel,  ui->tNIGHTLabel,
                               ui->tPICLabel,  ui->tPICUSLabel, ui->tSICLabel, ui->tDUALLabel, ui->tFILabel};
-    for(const auto& widget : LE) {widget->setText("");}
-    for(const auto& widget : LB) {widget->setText("00:00");}
+    for(const auto& widget : LE) {widget->setText(DB_NULL);}
+    for(const auto& widget : LB) {widget->setText(DB_NULL_hhmm);}
     //Calculate block time
     auto tofb = QTime::fromString(ui->tofbTimeLineEdit->text(), TIME_FORMAT);
     auto tonb = QTime::fromString(ui->tonbTimeLineEdit->text(), TIME_FORMAT);
@@ -403,17 +408,19 @@ void NewFlightDialog::fillDeductibleData()
 
 
     // SP SE
-    if(acft.getData().value("multipilot") == "0" && acft.getData().value("multiengine") == "0"){
+    if(acft.getData().value(DB_multipilot).toInt() == 0
+            && acft.getData().value(DB_multiengine).toInt() == 0){
         ui->tSPSETimeLineEdit->setText(block_time);
         ui->tSPSELabel->setText(block_time);
     }
     // SP ME
-    if(acft.getData().value("multipilot") == "0" && acft.getData().value("multiengine") == "1"){
+    if(acft.getData().value(DB_multipilot).toInt() == 0
+            && acft.getData().value(DB_multiengine).toInt() == 1){
         ui->tSPMETimeLineEdit->setText(block_time);
         ui->tSPMELabel->setText(block_time);
     }
     // MP
-    if(acft.getData().value("multipilot") == "1"){
+    if(acft.getData().value(DB_multipilot).toInt() == 1){
         ui->tMPTimeLineEdit->setText(block_time);
         ui->tMPLabel->setText(block_time);
     }
@@ -479,149 +486,145 @@ TableData NewFlightDialog::collectInput()
     TableData newData;
     DEB("Collecting Input...");
     // Mandatory data
-    newData.insert("doft", ui->doftLineEdit->text());
-    newData.insert("dept",ui->deptLocLineEdit->text());
-    newData.insert("tofb", QString::number(
-                       ACalc::stringToMinutes(ui->tofbTimeLineEdit->text())));
-    newData.insert("dest",ui->destLocLineEdit->text());
-    newData.insert("tonb", QString::number(
-                       ACalc::stringToMinutes(ui->tonbTimeLineEdit->text())));
+    newData.insert(DB_doft, ui->doftLineEdit->text());
+    newData.insert(DB_dept, ui->deptLocLineEdit->text());
+    newData.insert(DB_tofb, ACalc::stringToMinutes(ui->tofbTimeLineEdit->text()));
+    newData.insert(DB_dest, ui->destLocLineEdit->text());
+    newData.insert(DB_tonb, ACalc::stringToMinutes(ui->tonbTimeLineEdit->text()));
     //Block Time
     const auto tofb = QTime::fromString(ui->tofbTimeLineEdit->text(), TIME_FORMAT);
     const auto tonb = QTime::fromString(ui->tonbTimeLineEdit->text(), TIME_FORMAT);
     const QString block_time = ACalc::blocktime(tofb, tonb).toString(TIME_FORMAT);
-    const QString block_minutes = QString::number(ACalc::stringToMinutes(block_time));
+    const int block_minutes = ACalc::stringToMinutes(block_time);
 
-    newData.insert("tblk", block_minutes);
+    newData.insert(DB_tblk, block_minutes);
     // Aircraft
-    newData.insert("acft", QString::number(tailsIdMap.value(ui->acftLineEdit->text())));
+    newData.insert(DB_acft, tailsIdMap.value(ui->acftLineEdit->text()));
     // Pilots
-    newData.insert("pic", QString::number(pilotsIdMap.value(ui->picNameLineEdit->text())));
-    newData.insert("secondPilot", QString::number(pilotsIdMap.value(ui->secondPilotNameLineEdit->text())));
-    newData.insert("thirdPilot", QString::number(pilotsIdMap.value(ui->thirdPilotNameLineEdit->text())));
+    newData.insert(DB_pic, pilotsIdMap.value(ui->picNameLineEdit->text()));
+    newData.insert(DB_secondPilot, pilotsIdMap.value(ui->secondPilotNameLineEdit->text()));
+    newData.insert(DB_thirdPilot, pilotsIdMap.value(ui->thirdPilotNameLineEdit->text()));
 
     // Extra Times
     ui->tSPSETimeLineEdit->text().isEmpty() ?
-                newData.insert("tSPSE", "")
-              : newData.insert("tSPSE", QString::number(
-                                   ACalc::stringToMinutes(ui->tSPSETimeLineEdit->text())));
+                newData.insert(DB_tSPSE, DB_NULL)
+              : newData.insert(DB_tSPSE, ACalc::stringToMinutes(ui->tSPSETimeLineEdit->text()));
 
     ui->tSPMETimeLineEdit->text().isEmpty() ?
-                newData.insert("tSPME", "")
-              : newData.insert("tSPME", QString::number(
-                                   ACalc::stringToMinutes(ui->tSPSETimeLineEdit->text())));
+                newData.insert(DB_tSPME, DB_NULL)
+              : newData.insert(DB_tSPME, ACalc::stringToMinutes(ui->tSPMETimeLineEdit->text()));
     ui->tMPTimeLineEdit->text().isEmpty() ?
-                newData.insert("tMP", "")
-              : newData.insert("tMP", QString::number(
-                                   ACalc::stringToMinutes(ui->tSPSETimeLineEdit->text())));
+                newData.insert(DB_tMP, DB_NULL)
+              : newData.insert(DB_tMP, ACalc::stringToMinutes(ui->tMPTimeLineEdit->text()));
 
     if (ui->IfrCheckBox->isChecked()) {
-        newData.insert("tIFR", block_minutes);
+        newData.insert(DB_tIFR, block_minutes);
     } else {
-        newData.insert("tIFR", "");
+        newData.insert(DB_tIFR, DB_NULL);
     }
     // Night
-    const auto dept_date = ui->doftLineEdit->text() + 'T' + tofb.toString(TIME_FORMAT);
-    const auto dept_date_time = QDateTime::fromString(dept_date,"yyyy-MM-ddThh:mm");
-    const auto tblk = block_minutes.toInt();
+    const auto dept_date = ui->doftLineEdit->text() + QStringLiteral("T") + tofb.toString(TIME_FORMAT);
+    const auto dept_date_time = QDateTime::fromString(dept_date, QStringLiteral("yyyy-MM-ddThh:mm"));
+
     const auto night_angle = ASettings::read("flightlogging/nightangle").toInt();
-    const auto night_minutes = QString::number(
-                ACalc::calculateNightTime(
+    const auto night_minutes = ACalc::calculateNightTime(
                     ui->deptLocLineEdit->text(),
                     ui->destLocLineEdit->text(),
                     dept_date_time,
-                    tblk,
-                    night_angle));
-    newData.insert("tNIGHT", night_minutes);
+                    block_minutes,
+                    night_angle);
+    newData.insert(DB_tNIGHT, night_minutes);
 
     // Function times - This is a little explicit but these are mutually exclusive so its better to be safe than sorry here.
     switch (ui->FunctionComboBox->currentIndex()) {
     case 0://PIC
-        newData.insert("tPIC", block_minutes);
-        newData.insert("tPICUS", "");
-        newData.insert("tSIC", "");
-        newData.insert("tDUAL", "");
-        newData.insert("tFI", "");
+        newData.insert(DB_tPIC, block_minutes);
+        newData.insert(DB_tPICUS, DB_NULL);
+        newData.insert(DB_tSIC, DB_NULL);
+        newData.insert(DB_tDUAL, DB_NULL);
+        newData.insert(DB_tFI, DB_NULL);
         break;
     case 1://PICUS
-        newData.insert("tPIC", "");
-        newData.insert("tPICUS", block_minutes);
-        newData.insert("tSIC", "");
-        newData.insert("tDUAL", "");
-        newData.insert("tFI", "");
+        newData.insert(DB_tPIC, DB_NULL);
+        newData.insert(DB_tPICUS, block_minutes);
+        newData.insert(DB_tSIC, DB_NULL);
+        newData.insert(DB_tDUAL, DB_NULL);
+        newData.insert(DB_tFI, DB_NULL);
         break;
     case 2://Co-Pilot
-        newData.insert("tPIC", "");
-        newData.insert("tPICUS", "");
-        newData.insert("tSIC", block_minutes);
-        newData.insert("tDUAL", "");
-        newData.insert("tFI", "");
+        newData.insert(DB_tPIC, DB_NULL);
+        newData.insert(DB_tPICUS, DB_NULL);
+        newData.insert(DB_tSIC, block_minutes);
+        newData.insert(DB_tDUAL, DB_NULL);
+        newData.insert(DB_tFI, DB_NULL);
         break;
     case 3://Dual
-        newData.insert("tPIC", "");
-        newData.insert("tPICUS", "");
-        newData.insert("tSIC", "");
-        newData.insert("tDUAL", block_minutes);
-        newData.insert("tFI", "");
+        newData.insert(DB_tPIC, DB_NULL);
+        newData.insert(DB_tPICUS, DB_NULL);
+        newData.insert(DB_tSIC, DB_NULL);
+        newData.insert(DB_tDUAL, block_minutes);
+        newData.insert(DB_tFI, DB_NULL);
         break;
     case 4://Instructor
-        newData.insert("tPIC", block_minutes);
-        newData.insert("tPICUS", "");
-        newData.insert("tSIC", "");
-        newData.insert("tDUAL", "");
-        newData.insert("tFI", block_minutes);
+        newData.insert(DB_tPIC, block_minutes);
+        newData.insert(DB_tPICUS, DB_NULL);
+        newData.insert(DB_tSIC, DB_NULL);
+        newData.insert(DB_tDUAL, DB_NULL);
+        newData.insert(DB_tFI, block_minutes);
     }
     // Pilot Flying
-    newData.insert("pilotFlying", QString::number(ui->PilotFlyingCheckBox->isChecked()));
+    newData.insert(DB_pilotFlying, ui->PilotFlyingCheckBox->isChecked());
     // TO and LDG - again a bit explicit, but we  need to check for both night to day as well as day to night transitions.
     if (ui->TakeoffCheckBox->isChecked()) {
-        if (night_minutes == "0") { // all day
-            newData.insert("toDay", QString::number(ui->TakeoffSpinBox->value()));
-            newData.insert("toNight", "0");
+        if (night_minutes == 0) { // all day
+            newData.insert(DB_toDay, ui->TakeoffSpinBox->value());
+            newData.insert(DB_toNight, 0);
         } else if (night_minutes == block_minutes) { // all night
-            newData.insert("toDay", "0");
-            newData.insert("toNight", QString::number(ui->TakeoffSpinBox->value()));
+            newData.insert(DB_toDay, 0);
+            newData.insert(DB_toNight, ui->TakeoffSpinBox->value());
         } else {
             if(ACalc::isNight(ui->deptLocLineEdit->text(), dept_date_time,  night_angle)) {
-                newData.insert("toDay", "0");
-                newData.insert("toNight", QString::number(ui->TakeoffSpinBox->value()));
+                newData.insert(DB_toDay, 0);
+                newData.insert(DB_toNight, ui->TakeoffSpinBox->value());
             } else {
-                newData.insert("toDay", QString::number(ui->TakeoffSpinBox->value()));
-                newData.insert("toNight", "0");
+                newData.insert(DB_toDay, ui->TakeoffSpinBox->value());
+                newData.insert(DB_toNight, 0);
             }
         }
     } else {
-        newData.insert("toDay", "0");
-        newData.insert("toNight", "0");
+        newData.insert(DB_toDay, 0);
+        newData.insert(DB_toNight, 0);
     }
 
     if (ui->LandingCheckBox->isChecked()) {
-        if (night_minutes == "0") { // all day
-            newData.insert("ldgDay", QString::number(ui->LandingSpinBox->value()));
-            newData.insert("ldgNight", "0");
+        if (night_minutes == 0) { // all day
+            newData.insert(DB_ldgDay, ui->LandingSpinBox->value());
+            newData.insert(DB_ldgNight, 0);
         } else if (night_minutes == block_minutes) { // all night
-            newData.insert("ldgDay", "0");
-            newData.insert("ldgNight", QString::number(ui->LandingSpinBox->value()));
+            newData.insert(DB_ldgDay, 0);
+            newData.insert(DB_ldgNight, ui->LandingSpinBox->value());
         } else { //check
-            const auto dest_date = ui->doftLineEdit->text() + 'T' + tonb.toString(TIME_FORMAT);
-            const auto dest_date_time = QDateTime::fromString(dest_date,"yyyy-MM-ddThh:mm");
+            const auto dest_date = ui->doftLineEdit->text() + QStringLiteral("T") + tonb.toString(TIME_FORMAT);
+            const auto dest_date_time = QDateTime::fromString(dest_date, QStringLiteral("yyyy-MM-ddThh:mm"));
             if (ACalc::isNight(ui->destLocLineEdit->text(), dest_date_time,  night_angle)) {
-                newData.insert("ldgDay", "0");
-                newData.insert("ldgNight", QString::number(ui->LandingSpinBox->value()));
+                newData.insert(DB_ldgDay, 0);
+                newData.insert(DB_ldgNight, ui->LandingSpinBox->value());
             } else {
-                newData.insert("ldgDay", QString::number(ui->LandingSpinBox->value()));
-                newData.insert("ldgNight", "0");
+                newData.insert(DB_ldgDay, ui->LandingSpinBox->value());
+                newData.insert(DB_ldgNight, 0);
             }
         }
     } else {
-        newData.insert("ldgDay", "0");
-        newData.insert("ldgNight", "0");
+        newData.insert(DB_ldgDay, 0);
+        newData.insert(DB_ldgNight, 0);
     }
 
-    newData.insert("autoland", QString::number(ui->AutolandSpinBox->value()));
-    newData.insert("ApproachType", ui->ApproachComboBox->currentText());
-    newData.insert("FlightNumber", ui->FlightNumberLineEdit->text());
-    newData.insert("Remarks", ui->RemarksLineEdit->text());
+    newData.insert(DB_autoland, ui->AutolandSpinBox->value());
+    newData.insert(DB_ApproachType, ui->ApproachComboBox->currentText());
+    newData.insert(DB_FlightNumber, ui->FlightNumberLineEdit->text());
+    newData.insert(DB_Remarks, ui->RemarksLineEdit->text());
+
+    DEB("New Flight Data: " << newData);
 
     return newData;
 }
@@ -646,7 +649,7 @@ void NewFlightDialog::formFiller()
                 //DEB("Loc Match found: " << key << " - " << leName);
                 auto line_edit = this->findChild<QLineEdit *>(leName);
                 if(line_edit != nullptr){
-                    line_edit->setText(flightEntry.getData().value(data_key));
+                    line_edit->setText(flightEntry.getData().value(data_key).toString());
                     line_edits_names.removeOne(leName);
                 }
                 break;
@@ -658,7 +661,7 @@ void NewFlightDialog::formFiller()
                 //DEB("Loc Match found: " << key << " - " << leName);
                 auto line_edit = this->findChild<QLineEdit *>(leName);
                 if(line_edit != nullptr){
-                    line_edit->setText(flightEntry.getData().value(data_key));
+                    line_edit->setText(flightEntry.getData().value(data_key).toString());
                     line_edits_names.removeOne(leName);
                 }
                 break;
@@ -670,9 +673,9 @@ void NewFlightDialog::formFiller()
                 //DEB("Time Match found: " << key << " - " << leName);
                 auto line_edits = this->findChild<QLineEdit *>(leName);
                 if(line_edits != nullptr){
-                    DEB("Setting " << line_edits->objectName() << " to " << ACalc::minutesToString(flightEntry.getData().value(data_key)));
+                    DEB("Setting " << line_edits->objectName() << " to " << ACalc::minutesToString(flightEntry.getData().value(data_key).toInt()));
                     line_edits->setText(ACalc::minutesToString(
-                                            flightEntry.getData().value(data_key)));
+                                            flightEntry.getData().value(data_key).toInt()));
                     line_edits_names.removeOne(leName);
                 }
                 break;
@@ -704,27 +707,29 @@ void NewFlightDialog::formFiller()
         }
     }
     // Approach Combo Box
-    const QString& app = flightEntry.getData().value("ApproachType");
-    if(app != " "){
+    const QString& app = flightEntry.getData().value(DB_ApproachType).toString();
+    if(app != DB_NULL){
         ui->ApproachComboBox->setCurrentText(app);
     }
     // Task and Rules
-    qint8 PF = flightEntry.getData().value("pilotFlying").toInt();
+    qint8 PF = flightEntry.getData().value(DB_pilotFlying).toInt();
     if (PF > 0) {
         ui->PilotFlyingCheckBox->setChecked(true);
     } else {
         ui->PilotMonitoringCheckBox->setChecked(true);
     }
-    qint8 FR = flightEntry.getData().value("tIFR").toInt();
+    qint8 FR = flightEntry.getData().value(DB_tIFR).toInt();
     if (FR > 0) {
         ui->IfrCheckBox->setChecked(true);
     } else {
-        ui->tIFRTimeLineEdit->setText("00:00");
+        ui->tIFRTimeLineEdit->setText(DB_NULL);
         ui->VfrCheckBox->setChecked(true);
     }
     // Take Off and Landing
-    qint8 TO = flightEntry.getData().value("toDay").toInt() + flightEntry.getData().value("toNight").toInt();
-    qint8 LDG = flightEntry.getData().value("ldgDay").toInt() + flightEntry.getData().value("ldgNight").toInt();
+    qint8 TO = flightEntry.getData().value(DB_toDay).toInt()
+            + flightEntry.getData().value(DB_toNight).toInt();
+    qint8 LDG = flightEntry.getData().value(DB_ldgDay).toInt()
+            + flightEntry.getData().value(DB_ldgNight).toInt();
     if(TO > 0) {
         ui->TakeoffCheckBox->setChecked(true);
         ui->TakeoffSpinBox->setValue(TO);
@@ -739,7 +744,7 @@ void NewFlightDialog::formFiller()
         ui->LandingCheckBox->setChecked(false);
         ui->LandingSpinBox->setValue(0);
     }
-    qint8 AL = flightEntry.getData().value("autoland").toInt();
+    qint8 AL = flightEntry.getData().value(DB_autoland).toInt();
     if(AL > 0) {
         ui->AutolandCheckBox->setChecked(true);
         ui->AutolandSpinBox->setValue(AL);
@@ -803,7 +808,7 @@ void NewFlightDialog::addNewTail(QLineEdit *parent_line_edit)
         parent_line_edit->setText(tailsIdMap.key(aDB()->getLastEntry(ADataBase::tails)));
         emit parent_line_edit->editingFinished();
     } else {
-        parent_line_edit->setText("");
+        parent_line_edit->setText(DB_NULL);
     }
 }
 
@@ -832,7 +837,7 @@ void NewFlightDialog::addNewPilot(QLineEdit *parent_line_edit)
         parent_line_edit->setText(pilotsIdMap.key(aDB()->getLastEntry(ADataBase::pilots)));
         emit parent_line_edit->editingFinished();
     } else {
-        parent_line_edit->setText("");
+        parent_line_edit->setText(DB_NULL);
     }
 }
 
@@ -1120,7 +1125,7 @@ void NewFlightDialog::onTimeLineEdit_editingFinished()
             onGoodInputReceived(line_edit);
         } else { // is extra time line edit
             isLessOrEqualThanBlockTime(line_edit->text());
-            line_edit->setText("");
+            line_edit->setText(DB_NULL);
             line_edit->setFocus();
             return;
         }
@@ -1176,7 +1181,7 @@ void NewFlightDialog::onPilotNameLineEdit_editingFinished()
         DEB("self recognized.");
         line_edit->setText(pilotsIdMap.key(1));
         auto pilot = aDB()->getPilotEntry(1);
-        ui->picCompanyLabel->setText(pilot.getData().value("company"));
+        ui->picCompanyLabel->setText(pilot.getData().value(DB_company).toString());
         onGoodInputReceived(line_edit);
         return;
     }
@@ -1184,7 +1189,7 @@ void NewFlightDialog::onPilotNameLineEdit_editingFinished()
     if(pilotsIdMap.value(line_edit->text()) != 0) {
         DEB("Mapped: " << line_edit->text() << pilotsIdMap.value(line_edit->text()));
         auto pilot = aDB()->getPilotEntry(pilotsIdMap.value(line_edit->text()));
-        ui->picCompanyLabel->setText(pilot.getData().value("company"));
+        ui->picCompanyLabel->setText(pilot.getData().value(DB_company).toString());
         onGoodInputReceived(line_edit);
         return;
     }

+ 2 - 3
src/gui/dialogues/newpilotdialog.cpp

@@ -131,9 +131,8 @@ void NewPilotDialog::formFiller()
     auto line_edits = this->findChildren<QLineEdit *>();
 
     for (const auto &le : line_edits) {
-        QString key = le->objectName().remove("LineEdit");
-        QString value = pilotEntry.getData().value(key);
-        le->setText(value);
+        auto key = le->objectName().remove("LineEdit");
+        le->setText(pilotEntry.getData().value(key).toString());
     }
 }
 

+ 13 - 13
src/gui/dialogues/newtaildialog.cpp

@@ -18,6 +18,7 @@
 #include "newtaildialog.h"
 #include "ui_newtail.h"
 #include "src/testing/adebug.h"
+#include "src/database/tablecolumnliterals.h"
 
 static const auto REG_VALID = QPair<QString, QRegularExpression> {
     "registrationLineEdit", QRegularExpression("\\w+-\\w+")};
@@ -125,15 +126,14 @@ void NewTailDialog::fillForm(experimental::AEntry entry, bool is_template)
     auto data = entry.getData();
 
     for (const auto &le : line_edits) {
-        QString name = le->objectName().remove("LineEdit");
-        QString value = data.value(name);
-        le->setText(value);
+        auto key = le->objectName().remove("LineEdit");
+        le->setText(data.value(key).toString());
     }
 
-    ui->operationComboBox->setCurrentIndex(data.value("multipilot").toInt() + 1);
-    ui->ppNumberComboBox->setCurrentIndex(data.value("multiengine").toInt() + 1);
-    ui->ppTypeComboBox->setCurrentIndex(data.value("engineType").toInt() + 1);
-    ui->weightComboBox->setCurrentIndex(data.value("weightClass").toInt() + 1);
+    ui->operationComboBox->setCurrentIndex(data.value(DB_multipilot).toInt() + 1);
+    ui->ppNumberComboBox ->setCurrentIndex(data.value(DB_multiengine).toInt() + 1);
+    ui->ppTypeComboBox->setCurrentIndex(data.value(DB_engineType).toInt() + 1);
+    ui->weightComboBox->setCurrentIndex(data.value(DB_weightClass).toInt() + 1);
 }
 
 /*!
@@ -192,21 +192,21 @@ void NewTailDialog::submitForm()
     line_edits.removeOne(this->findChild<QLineEdit *>("searchLineEdit"));
 
     for (const auto &le : line_edits) {
-        QString name = le->objectName().remove("LineEdit");
-        new_data.insert(name, le->text());
+        auto key = le->objectName().remove("LineEdit");
+        new_data.insert(key, le->text());
     }
 
     if (ui->operationComboBox->currentIndex() != 0) { // bool Multipilot
-        new_data.insert("multipilot", QString::number(ui->operationComboBox->currentIndex() - 1));
+        new_data.insert(DB_multipilot, ui->operationComboBox->currentIndex() - 1);
     }
     if (ui->ppNumberComboBox->currentIndex() != 0) { // bool MultiEngine
-        new_data.insert("multiengine", QString::number(ui->ppNumberComboBox->currentIndex() - 1));
+        new_data.insert(DB_multiengine, ui->ppNumberComboBox->currentIndex() - 1);
     }
     if (ui->ppTypeComboBox->currentIndex() != 0) { // int 0=unpowered,....4=jet
-        new_data.insert("engineType", QString::number(ui->ppTypeComboBox->currentIndex() - 1));
+        new_data.insert(DB_engineType, ui->ppTypeComboBox->currentIndex() - 1);
     }
     if (ui->weightComboBox->currentIndex() != 0) { // int 0=light...3=super
-        new_data.insert("weightClass", QString::number(ui->weightComboBox->currentIndex() - 1));
+        new_data.insert(DB_weightClass, ui->weightComboBox->currentIndex() - 1);
     }
 
     //create db object

+ 57 - 6
src/gui/widgets/debugwidget.cpp

@@ -137,7 +137,7 @@ void DebugWidget::on_fillUserDataPushButton_clicked()
 void DebugWidget::on_selectCsvPushButton_clicked()
 {
     auto fileName = QFileDialog::getOpenFileName(this,
-        tr("Open CSV File for import"), QDir::homePath(), tr("CSV files (*.csv)"));
+                                                 tr("Open CSV File for import"), QDir::homePath(), tr("CSV files (*.csv)"));
     ui->importCsvLineEdit->setText(fileName);
 }
 
@@ -167,11 +167,32 @@ void DebugWidget::on_importCsvPushButton_clicked()
 
 void DebugWidget::on_debugPushButton_clicked()
 {
-    using namespace experimental;
-
-    auto acft = aDB()->getTailEntry(5);
-    DEB(acft.getData().key("make"));
-    DEB(acft.type());
+    qlonglong number_of_runs = 500;
+            long time1 = 0;
+            using namespace experimental;
+            {
+
+                ATimer timer;
+                for (int i = 0; i < number_of_runs; i++) {
+                    // first block, do stuff here...
+                    auto acft = aDB()->getTailEntry(5);
+                    auto pilot = aDB()->getPilotEntry(7);
+                    auto flight = aDB()->getFlightEntry(15);
+                    QList<AEntry> list = {acft, pilot, flight};
+                    for (auto entry : list) {
+                        for (auto column : entry.getData()) {
+                            QString value = column.toString();
+                        }
+                    }
+                }
+
+                time1 = timer.timeNow();
+            }
+
+            DEB("First block executed " << number_of_runs << " times for a total of " << time1 << " milliseconds.");
+            // 116 - 134 milliseconds with legacy exp db api
+            // 108 - 110 milliseconds with improved exp api
+            // to do: with string literals*/
 
 
 }
@@ -201,3 +222,33 @@ void DebugWidget::on_debugPushButton_clicked()
     DEB("First block executed " << number_of_runs << " times for a total of " << time1 << " milliseconds.");
     DEB("Second block executed " << number_of_runs << " times for a total of " << time2 << " milliseconds.");
 */
+
+
+
+
+/*qlonglong number_of_runs = 500;
+        long time1 = 0;
+        using namespace experimental;
+        {
+
+            ATimer timer;
+            for (int i = 0; i < number_of_runs; i++) {
+                // first block, do stuff here...
+                auto acft = aDB()->getTailEntry(5);
+                auto pilot = aDB()->getPilotEntry(7);
+                auto flight = aDB()->getFlightEntry(15);
+                QList<AEntry> list = {acft, pilot, flight};
+                for (auto entry : list) {
+                    for (auto column : entry.getData()) {
+                        QString value = column.toString();
+                    }
+                }
+            }
+
+            time1 = timer.timeNow();
+        }
+
+        DEB("First block executed " << number_of_runs << " times for a total of " << time1 << " milliseconds.");
+        // 108 - 134 milliseconds with legacy exp db api
+        // 108 - 110 milliseconds with improved exp api
+        // to do: with string literals*/

+ 1 - 1
src/gui/widgets/logbookwidget.cpp

@@ -251,7 +251,7 @@ void LogbookWidget::on_deleteFlightPushButton_clicked()
         if(reply == QMessageBox::Yes) {
             QList<DataPosition> selected_flights;
             for (const auto& flight_id : selectedFlights) {
-                selected_flights.append({"flights", flight_id});
+                selected_flights.append({QLatin1String("flights"), flight_id});
             }
             if (!aDB()->removeMany(selected_flights)) {
 

+ 8 - 8
src/gui/widgets/settingswidget.cpp

@@ -126,10 +126,10 @@ void SettingsWidget::setupValidators()
 
 void SettingsWidget::updatePersonalDetails()
 {
-    QMap<QString,QString> data;
+    QMap<QString, QVariant> data;
     switch (ui->aliasComboBox->currentIndex()) {
     case 0:
-        data.insert("alias","self");
+        data.insert("alias", "self");
         break;
     case 1:
         data.insert("alias","SELF");
@@ -146,12 +146,12 @@ void SettingsWidget::updatePersonalDetails()
     default:
         break;
     }
-    data.insert("piclastname",ui->piclastnameLineEdit->text());
-    data.insert("picfirstname",ui->picfirstnameLineEdit->text());
-    data.insert("company",ui->companyLineEdit->text());
-    data.insert("employeeid",ui->employeeidLineEdit->text());
-    data.insert("phone",ui->phoneLineEdit->text());
-    data.insert("email",ui->emailLineEdit->text());
+    data.insert("piclastname", ui->piclastnameLineEdit->text());
+    data.insert("picfirstname", ui->picfirstnameLineEdit->text());
+    data.insert("company", ui->companyLineEdit->text());
+    data.insert("employeeid", ui->employeeidLineEdit->text());
+    data.insert("phone", ui->phoneLineEdit->text());
+    data.insert("email", ui->emailLineEdit->text());
 
     auto pic = APilotEntry(1);
     pic.setData(data);