Browse Source

Renamed DBTarget to match convention. Added custom ADatabaseError

George 4 năm trước cách đây
mục cha
commit
09c40405e2

+ 32 - 23
src/experimental/adatabase.cpp

@@ -20,6 +20,15 @@
 
 namespace experimental {
 
+ADataBaseError::ADataBaseError(QString msg_)
+    : QSqlError::QSqlError(msg_)
+{}
+
+QString ADataBaseError::text() const
+{
+    return "Database Error: " + QSqlError::text();
+}
+
 ADataBase* ADataBase::instance = nullptr;
 
 ADataBase* ADataBase::getInstance()
@@ -89,7 +98,7 @@ bool ADataBase::remove(AEntry entry)
 {
     if (!exists(entry)) {
         DEB("Error: Database entry not found.");
-        lastError = "Database Error: Database entry not found.";
+        lastError = ADataBaseError("Database entry not found.");
         return false;
     }
 
@@ -125,7 +134,7 @@ bool ADataBase::removeMany(QList<DataPosition> data_position_list)
 
     for (const auto& data_position : data_position_list) {
         if (!exists(data_position)) {
-            lastError = "Database Error: Database entry not found.";
+            lastError = ADataBaseError("Database entry not found.");
             errorCount++;
         }
         QString statement = "DELETE FROM " + data_position.first +
@@ -182,7 +191,7 @@ bool ADataBase::exists(AEntry entry)
         return true;
     } else {
         DEB("Database entry not found.");
-        lastError = "Database Error: Database entry not found.";
+        lastError = ADataBaseError("Database entry not found.");
         return false;
     }
 }
@@ -211,7 +220,7 @@ bool ADataBase::exists(DataPosition data_position)
         return true;
     } else {
         DEB("No entry exists at DataPosition: " << data_position);
-        lastError = "Database Error: Database entry not found.";
+        lastError = ADataBaseError("Database entry not found.");
         return false;
     }
 }
@@ -326,7 +335,7 @@ TableData ADataBase::getEntryData(DataPosition data_position)
     check_query.next();
     if (check_query.value(0).toInt() == 0) {
         DEB("No Entry found for row id: " << data_position.second );
-        lastError = "Database Error: Database entry not found.";
+        lastError = ADataBaseError("Database entry not found.");
         return TableData();
     }
 
@@ -391,26 +400,26 @@ AFlightEntry ADataBase::getFlightEntry(RowId row_id)
     return flight_entry;
 }
 
-const QStringList ADataBase::getCompletionList(DBTarget target)
+const QStringList ADataBase::getCompletionList(ADataBaseTarget target)
 {
     QString statement;
 
     switch (target) {
-    case DBTarget::pilots:
+    case ADataBaseTarget::pilots:
         statement.append("SELECT piclastname||', '||picfirstname FROM pilots");
         break;
-    case DBTarget::aircraft:
+    case ADataBaseTarget::aircraft:
         statement.append("SELECT make||' '||model FROM aircraft WHERE model IS NOT NULL "
                          "UNION "
                          "SELECT make||' '||model||'-'||variant FROM aircraft WHERE variant IS NOT NULL");
         break;
-    case DBTarget::airport_identifier_all:
+    case ADataBaseTarget::airport_identifier_all:
         statement.append("SELECT icao FROM airports UNION SELECT iata FROM airports");
         break;
-    case DBTarget::registrations:
+    case ADataBaseTarget::registrations:
         statement.append("SELECT registration FROM tails");
         break;
-    case DBTarget::companies:
+    case ADataBaseTarget::companies:
         statement.append("SELECT company FROM pilots");
         break;
     default:
@@ -439,29 +448,29 @@ const QStringList ADataBase::getCompletionList(DBTarget target)
     return completer_list;
 }
 
-const QMap<QString, int> ADataBase::getIdMap(DBTarget target)
+const QMap<QString, int> ADataBase::getIdMap(ADataBaseTarget target)
 {
     QString statement;
 
     switch (target) {
-    case DBTarget::pilots:
+    case ADataBaseTarget::pilots:
         statement.append("SELECT ROWID, piclastname||', '||picfirstname FROM pilots");
         break;
-    case DBTarget::aircraft:
+    case ADataBaseTarget::aircraft:
         statement.append("SELECT ROWID, make||' '||model FROM aircraft WHERE model IS NOT NULL "
                          "UNION "
                          "SELECT ROWID, make||' '||model||'-'||variant FROM aircraft WHERE variant IS NOT NULL");
         break;
-    case DBTarget::airport_identifier_icao:
+    case ADataBaseTarget::airport_identifier_icao:
         statement.append("SELECT ROWID, icao FROM airports");
         break;
-    case DBTarget::airport_identifier_iata:
+    case ADataBaseTarget::airport_identifier_iata:
         statement.append("SELECT ROWID, iata FROM airports WHERE iata NOT NULL");
         break;
-    case DBTarget::airport_names:
+    case ADataBaseTarget::airport_names:
         statement.append("SELECT ROWID, name FROM airports");
         break;
-    case DBTarget::tails:
+    case ADataBaseTarget::tails:
         statement.append("SELECT ROWID, registration FROM tails");
         break;
     default:
@@ -486,18 +495,18 @@ const QMap<QString, int> ADataBase::getIdMap(DBTarget target)
     }
 }
 
-int ADataBase::getLastEntry(DBTarget target)
+int ADataBase::getLastEntry(ADataBaseTarget target)
 {
     QString statement = "SELECT MAX(ROWID) FROM ";
 
     switch (target) {
-    case DBTarget::pilots:
+    case ADataBaseTarget::pilots:
         statement.append(DB_TABLE_PILOTS);
         break;
-    case DBTarget::aircraft:
+    case ADataBaseTarget::aircraft:
         statement.append(DB_TABLE_AIRCRAFT);
         break;
-    case DBTarget::tails:
+    case ADataBaseTarget::tails:
         statement.append(DB_TABLE_TAILS);
         break;
     default:
@@ -508,7 +517,7 @@ int ADataBase::getLastEntry(DBTarget target)
     if (query.first()) {
         return query.value(0).toInt();
     } else {
-        lastError = "Database Error: Database entry not found.";
+        lastError = ADataBaseError("Database entry not found.");
         DEB("No entry found.");
         return 0;
     }

+ 19 - 5
src/experimental/adatabase.h

@@ -41,7 +41,7 @@ namespace experimental {
  * \brief The DBTarget enum provides the items for which QCompleter
  * completion lists are provided from the database.
  */
-enum class DBTarget
+enum class ADataBaseTarget
 {
     airport_identifier_icao,
     airport_identifier_iata,
@@ -54,6 +54,20 @@ enum class DBTarget
     tails
 };
 
+// [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.
+/*!
+ * \brief Custom Database Error derived from QSqlError.
+ * Extends text() adding "Database Error: " before the text.
+ */
+class ADataBaseError : public QSqlError {
+public:
+  ADataBaseError() = default;
+  ADataBaseError(QString msg);
+  QString text() const;
+};
+
 /*!
  * \brief The DB class encapsulates the SQL database by providing fast access
  * to hot database data.
@@ -70,7 +84,7 @@ public:
     ADataBase(const ADataBase&) = delete;
     void operator=(const ADataBase&) = delete;
     static ADataBase* getInstance();
-    QString lastError;
+    ADataBaseError lastError;
 
     /*!
      * \brief Connect to the database and populate database information.
@@ -183,16 +197,16 @@ public:
      * QCompleter based on database values
      * \return
      */
-    const QStringList getCompletionList(DBTarget);
+    const QStringList getCompletionList(ADataBaseTarget);
 
     /*!
      * \brief returns a QMap<QString, int> of a human-readable database value and
      * its row id. Used in the Dialogs to map user input to unique database entries.
      * \return
      */
-    const QMap<QString, int> getIdMap(DBTarget);
+    const QMap<QString, int> getIdMap(ADataBaseTarget);
 
-    int getLastEntry(DBTarget);
+    int getLastEntry(ADataBaseTarget);
 
 signals:
     /*!

+ 17 - 17
src/gui/dialogues/newflightdialog.cpp

@@ -206,15 +206,15 @@ void NewFlightDialog::setupButtonGroups()
 void NewFlightDialog::setupRawInputValidation()
 {
     // get Maps
-    pilotsIdMap      = aDB()->getIdMap(DBTarget::pilots);
-    tailsIdMap       = aDB()->getIdMap(DBTarget::tails);
-    airportIcaoIdMap = aDB()->getIdMap(DBTarget::airport_identifier_icao);
-    airportIataIdMap = aDB()->getIdMap(DBTarget::airport_identifier_iata);
-    airportNameIdMap = aDB()->getIdMap(DBTarget::airport_names);
+    pilotsIdMap      = aDB()->getIdMap(ADataBaseTarget::pilots);
+    tailsIdMap       = aDB()->getIdMap(ADataBaseTarget::tails);
+    airportIcaoIdMap = aDB()->getIdMap(ADataBaseTarget::airport_identifier_icao);
+    airportIataIdMap = aDB()->getIdMap(ADataBaseTarget::airport_identifier_iata);
+    airportNameIdMap = aDB()->getIdMap(ADataBaseTarget::airport_names);
     //get Completer Lists
-    pilotList   = aDB()->getCompletionList(DBTarget::pilots);
-    tailsList   = aDB()->getCompletionList(DBTarget::registrations);
-    airportList = aDB()->getCompletionList(DBTarget::airport_identifier_all);
+    pilotList   = aDB()->getCompletionList(ADataBaseTarget::pilots);
+    tailsList   = aDB()->getCompletionList(ADataBaseTarget::registrations);
+    airportList = aDB()->getCompletionList(ADataBaseTarget::airport_identifier_all);
     auto tempList = QStringList();
     // define tuples
     const std::tuple<QString, QStringList*, QRegularExpression>
@@ -802,13 +802,13 @@ void NewFlightDialog::addNewTail(QLineEdit *parent_line_edit)
         auto na = NewTailDialog(ui->acftLineEdit->text(), this);
         na.exec();
         // update map and list, set line edit
-        tailsIdMap  = aDB()->getIdMap(DBTarget::tails);
-        tailsList   = aDB()->getCompletionList(DBTarget::registrations);
+        tailsIdMap  = aDB()->getIdMap(ADataBaseTarget::tails);
+        tailsList   = aDB()->getCompletionList(ADataBaseTarget::registrations);
 
-        DEB("New Entry added. Id:" << aDB()->getLastEntry(DBTarget::tails));
+        DEB("New Entry added. Id:" << aDB()->getLastEntry(ADataBaseTarget::tails));
         DEB("AC Map: " << tailsIdMap);
 
-        parent_line_edit->setText(tailsIdMap.key(aDB()->getLastEntry(DBTarget::tails)));
+        parent_line_edit->setText(tailsIdMap.key(aDB()->getLastEntry(ADataBaseTarget::tails)));
         emit parent_line_edit->editingFinished();
     } else {
         parent_line_edit->setText(DB_NULL);
@@ -834,10 +834,10 @@ void NewFlightDialog::addNewPilot(QLineEdit *parent_line_edit)
         auto np = NewPilotDialog(this);
         np.exec();
         // update map and list, set line edit
-        pilotsIdMap  = aDB()->getIdMap(DBTarget::pilots);
-        pilotList    = aDB()->getCompletionList(DBTarget::pilots);
-        DEB("Setting new entry: " << pilotsIdMap.key(aDB()->getLastEntry(DBTarget::pilots)));
-        parent_line_edit->setText(pilotsIdMap.key(aDB()->getLastEntry(DBTarget::pilots)));
+        pilotsIdMap  = aDB()->getIdMap(ADataBaseTarget::pilots);
+        pilotList    = aDB()->getCompletionList(ADataBaseTarget::pilots);
+        DEB("Setting new entry: " << pilotsIdMap.key(aDB()->getLastEntry(ADataBaseTarget::pilots)));
+        parent_line_edit->setText(pilotsIdMap.key(aDB()->getLastEntry(ADataBaseTarget::pilots)));
         emit parent_line_edit->editingFinished();
     } else {
         parent_line_edit->setText(DB_NULL);
@@ -885,7 +885,7 @@ void NewFlightDialog::on_submitButton_clicked()
     if (!aDB()->commit(flightEntry)) {
         auto message_box = QMessageBox(this);
         message_box.setText("The following error has ocurred:\n\n"
-                            + aDB()->lastError
+                            + aDB()->lastError.text()
                             + "\n\nYour entry has not been saved.");
         message_box.setIcon(QMessageBox::Warning);
         message_box.exec();

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

@@ -108,7 +108,7 @@ void NewPilotDialog::setup()
     }
 
     DEB("Setting up completer...");
-    auto completer = new QCompleter(aDB()->getCompletionList(DBTarget::companies), ui->companyLineEdit);
+    auto completer = new QCompleter(aDB()->getCompletionList(ADataBaseTarget::companies), ui->companyLineEdit);
     completer->setCompletionMode(QCompleter::InlineCompletion);
     completer->setCaseSensitivity(Qt::CaseSensitive);
     ui->companyLineEdit->setCompleter(completer);
@@ -154,7 +154,7 @@ void NewPilotDialog::submitForm()
     if (!aDB()->commit(pilotEntry)) {
         auto message_box = QMessageBox(this);
         message_box.setText("The following error has ocurred:\n\n"
-                            + aDB()->lastError
+                            + aDB()->lastError.text()
                             + "\n\nThe entry has not been saved.");
         message_box.exec();
         return;

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

@@ -81,8 +81,8 @@ NewTailDialog::~NewTailDialog()
 void NewTailDialog::setupCompleter()
 {
     using namespace experimental;
-    idMap = aDB()->getIdMap(DBTarget::aircraft);
-    aircraftList = aDB()->getCompletionList(DBTarget::aircraft);
+    idMap = aDB()->getIdMap(ADataBaseTarget::aircraft);
+    aircraftList = aDB()->getCompletionList(ADataBaseTarget::aircraft);
 
     QCompleter *completer = new QCompleter(aircraftList, ui->searchLineEdit);
     completer->setCaseSensitivity(Qt::CaseInsensitive);
@@ -215,7 +215,7 @@ void NewTailDialog::submitForm()
     if (!aDB()->commit(entry)) {
         auto message_box = QMessageBox(this);
         message_box.setText("The following error has ocurred:\n\n"
-                            + aDB()->lastError
+                            + aDB()->lastError.text()
                             + "\n\nThe entry has not been saved.");
         message_box.exec();
         return;