|
@@ -13,24 +13,42 @@
|
|
|
|
|
|
namespace experimental {
|
|
|
|
|
|
+/// SELF DOCUMENTING CODE
|
|
|
using ColName = QString;
|
|
|
using ColData = QString;
|
|
|
-using DataPosition = QPair<QString, int>;
|
|
|
+using TableName = QString;
|
|
|
+using RowId = int;
|
|
|
+using DataPosition = QPair<TableName, RowId>;
|
|
|
using TableData = QMap<ColName, ColData>;
|
|
|
|
|
|
+// DEFAULTS
|
|
|
+auto const DEFAULT_PILOT_POSITION = DataPosition("pilots", 0);
|
|
|
+
|
|
|
+/*!
|
|
|
+ * \brief The Entry class encapsulates table metadata(table name, row id)
|
|
|
+ * and data for new and existing entries in the database to operate on.
|
|
|
+ */
|
|
|
class Entry {
|
|
|
public:
|
|
|
const DataPosition position;
|
|
|
-private:
|
|
|
+protected:
|
|
|
TableData table_data;
|
|
|
public:
|
|
|
Entry() = delete;
|
|
|
- Entry(DataPosition position_)
|
|
|
- : position(position_) {}
|
|
|
+ Entry(DataPosition position_) : position(position_) {}
|
|
|
void populate_data(TableData data) { table_data = data; }
|
|
|
const TableData& data() { return table_data; }
|
|
|
};
|
|
|
|
|
|
+// [George]: Either with polymorphism or simple functions the result will be the same.
|
|
|
+// if the following syntax is more clear to you we can switch to it.
|
|
|
+// ... = new NewPilotDialog(Pilot(selectedPilots.first(), ...);
|
|
|
+// the only difference will be that we will subclass Entry to have specialised
|
|
|
+// constructor
|
|
|
+class PilotEntry : public Entry {
|
|
|
+ PilotEntry() = delete;
|
|
|
+ PilotEntry(int row_id) : Entry::Entry(DataPosition("pilots", row_id)) {}
|
|
|
+};
|
|
|
|
|
|
Entry newPilotEntry(int row_id) { return Entry(DataPosition("pilots", row_id)); }
|
|
|
|
|
@@ -39,20 +57,19 @@ bool insertPilot(UserInput& uin)
|
|
|
{
|
|
|
DEB("Inserting...");
|
|
|
auto data = uin.all();
|
|
|
- DataPosition position = DataPosition("pilots", 0);
|
|
|
+ auto position = DEFAULT_PILOT_POSITION;
|
|
|
|
|
|
if (data.isEmpty()) {
|
|
|
DEB("Object Contains no data. Aborting.");
|
|
|
return false;
|
|
|
}
|
|
|
QString statement = "INSERT INTO " + position.first + QLatin1String(" (");
|
|
|
- QMap<QString, QString>::const_iterator i;
|
|
|
- for (i = data.cbegin(); i != data.cend(); ++i) {
|
|
|
+ for (auto i = data.cbegin(); i != data.cend(); ++i) {
|
|
|
statement += i.key() + QLatin1String(", ");
|
|
|
}
|
|
|
statement.chop(2);
|
|
|
statement += QLatin1String(") VALUES (");
|
|
|
- for (i = data.cbegin(); i != data.cend(); ++i) {
|
|
|
+ for (auto i = data.cbegin(); i != data.cend(); ++i) {
|
|
|
statement += QLatin1String("'") + i.value() + QLatin1String("', ");
|
|
|
}
|
|
|
statement.chop(2);
|
|
@@ -68,15 +85,22 @@ bool insertPilot(UserInput& uin)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+/*!
|
|
|
+ * \brief The DB class encapsulates the SQL database by providing fast access
|
|
|
+ * to hot database data.
|
|
|
+ */
|
|
|
class DB {
|
|
|
private:
|
|
|
static QVector<QString> columns;
|
|
|
public:
|
|
|
/*!
|
|
|
- * \brief init: Initialise DB class and populate columns.
|
|
|
+ * \brief Initialise DB class and populate columns.
|
|
|
*/
|
|
|
static bool init();
|
|
|
|
|
|
+ /*!
|
|
|
+ * \brief Create new entry in the databse based on UserInput
|
|
|
+ */
|
|
|
static
|
|
|
bool insert(UserInput uin)
|
|
|
{
|
|
@@ -97,13 +121,16 @@ public:
|
|
|
|
|
|
static bool exists(UserInput uin) { return false; }
|
|
|
|
|
|
+ /*!
|
|
|
+ * \brief Updates entry in database from existing entry tweaked by the user.
|
|
|
+ * New entry data is verified before commiting.
|
|
|
+ */
|
|
|
static bool update(Entry updated_entry)
|
|
|
{
|
|
|
auto position = updated_entry.position;
|
|
|
auto data = updated_entry.data();
|
|
|
QString statement = "UPDATE " + position.first + " SET ";
|
|
|
- QMap<QString, QString>::const_iterator i;
|
|
|
- for (i = data.constBegin(); i != data.constEnd(); ++i) {
|
|
|
+ for (auto i = data.constBegin(); i != data.constEnd(); ++i) {
|
|
|
if (i.key() != QString()) {
|
|
|
statement += i.key() + QLatin1String("='") + i.value() + QLatin1String("', ");
|
|
|
} else {
|
|
@@ -113,7 +140,6 @@ public:
|
|
|
statement.chop(2); // Remove last comma
|
|
|
statement.append(QLatin1String(" WHERE _rowid_=") + QString::number(position.second));
|
|
|
|
|
|
- //execute query
|
|
|
DEB("UPDATE QUERY: " << statement);
|
|
|
QSqlQuery q(statement);
|
|
|
//check result. Upon success, error should be " "
|
|
@@ -127,6 +153,9 @@ public:
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ /*!
|
|
|
+ * \brief Verify entry data is sane for the database.
|
|
|
+ */
|
|
|
static
|
|
|
bool verify(Entry entry)
|
|
|
{
|