| 
					
				 | 
			
			
				@@ -1,169 +0,0 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-/* 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- *openPilot Log - A FOSS Pilot Logbook Application 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- *Copyright (C) 2020  Felix Turowsky 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- *This program is free software: you can redistribute it and/or modify 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- *it under the terms of the GNU General Public License as published by 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- *the Free Software Foundation, either version 3 of the License, or 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- *(at your option) any later version. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- *This program is distributed in the hope that it will be useful, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- *but WITHOUT ANY WARRANTY; without even the implied warranty of 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- *MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- *GNU General Public License for more details. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- *You should have received a copy of the GNU General Public License 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- *along with this program.  If not, see <https://www.gnu.org/licenses/>. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-#ifndef DB_H 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-#define DB_H 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-#include <QCoreApplication> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-#include <QSqlDatabase> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-#include <QSqlDriver> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-#include <QSqlError> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-#include <QSqlQuery> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-#include <QSqlRecord> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-#include <QSqlField> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-#include <QDir> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-#include <QDebug> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-/*! 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * \brief The Db class provides a basic API for accessing the database programatically. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * It is used to set up the initial connection and various basic queries can be 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * executed using a set of static functions. When interfacing with the database 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * for the purpose of adding, deleting or updating entries, the use of the entry class 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * and its subclasses is recommended. This clas is not supposed to be instantiated, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- * if you need a database object, use QSqlDatabase::database("qt_sql_default_connection"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-class Db 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    public: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        static Db& get() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            static Db instance; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            return instance; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        /*! 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         * \brief The editRole enum {createNew, editExisting} is used to differentiate 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         * between creating a new entry in the database vs editing an existing one 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        enum editRole {createNew, editExisting}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        /*! 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         * \brief The matchType enum {exactMatch, partialMatch} is used to determine the 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         * matching when using a WHERE sql statement. exactMatch results in a "=" operator, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         * whereas partiasMatch results in a "LIKE" operator 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        enum matchType {exactMatch, partialMatch};        
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        /*! 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         * \brief connect establishes the database connection. Only needs to be called once 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         * within the application. Database is available thereafter, objects can be 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         * instantiated with QSqlDatabase::database("qt_sql_default_connection") as required. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        static void             connect(){get().iconnect();} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        /*! 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         * \brief disconnect Closes and removes the default database connection. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        static void             disconnect(){get().idisconnect();} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        /*! 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         * \brief Can be used to access the database connection. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         * \return a pointer to the default database connection 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        static QSqlDatabase     Database(){return get().iDatabase();} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        /*! 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         * \brief Db::exists checks if a certain value exists in the database with a sqlite WHERE statement 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         * \param table - Name of the table 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         * \param column - Name of the column 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         * \param value - The value to be checked 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         * \return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        static bool             exists(QString column, QString table, QString checkColumn, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                       QString value, Db::matchType match) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            return get().iexists(column, table, checkColumn, value, match); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        /*! 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         * \brief Db::singleUpdate Updates a single value in the database. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         * Query format: UPDATE table SET column = value WHERE checkcolumn =/LIKE checkvalue 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         * \param table Name of the table to be updated 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         * \param column Name of the column to be updated 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         * \param checkColumn Name of the column for WHERE statement 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         * \param value The value to be set 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         * \param checkvalue The value for the WHERE statement 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         * \param match enum Db::exactMatch or Db::partialMatch 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         * \return true on success, otherwise error messages in debug out 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        static bool             singleUpdate(QString table, QString column, QString value, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                             QString checkColumn, QString checkvalue, Db::matchType match){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            return get().isingleUpdate(table,column,value,checkColumn,checkvalue,match); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        /*! 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         * \brief singleSelect Returns a single value from the database with a sqlite WHERE statement 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         * \param table - Name of the table 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         * \param column - Name of the column 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         * \param value - Identifier for WHERE statement 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         * \param match - enum Db::exactMatch or Db::partialMatch 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         * \return QString 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        static QString          singleSelect(QString column, QString table, QString checkColumn, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                             QString value, Db::matchType match){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            return get().isingleSelect(column,table,checkColumn,value,match); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        /*! 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         * \brief Db::multiSelect Returns multiple values from the database with a sqlite WHERE statement 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         * \param table - Name of the table 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         * \param columns - QVector<QString> Names of the columns to be queried 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         * \param value - Identifier for WHERE statement 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         * \param checkColumn - column to match value to 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         * \param match - enum Db::exactMatch or Db::partialMatch 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         * \return QVector<QString> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        static QVector<QString> multiSelect(QVector<QString> columns, QString table, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                            QString checkColumn, QString value, Db::matchType match){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            return get().imultiSelect(columns,table,checkColumn,value,match); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        /*! 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         * \brief Db::multiSelect Returns a complete column(s) for a given table. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         * \param column - QVector<QString> Names of the columns to be queried 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         * \param table - QString Name of the table 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         * \return 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        static QVector<QString> multiSelect(QVector<QString> columns, QString table){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            return get().imultiSelect(columns, table); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        /*! 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         * \brief Db::customQuery Can be used to send a complex query to the database. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         * \param query - the full sql query statement 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         * \param returnValues - the number of expected return values 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         * \return QVector<QString> of results 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        static QVector<QString> customQuery(QString query, int returnValues){ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-            return get().icustomQuery(query, returnValues); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    private: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        Db() {} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        void             iconnect(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        void             idisconnect(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        QSqlDatabase     iDatabase(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        bool             iexists(QString column, QString table, QString checkColumn, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                       QString value, Db::matchType match); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        bool             isingleUpdate(QString table, QString column, QString value, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                             QString checkColumn, QString checkvalue, Db::matchType match); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        QString          isingleSelect(QString column, QString table, QString checkColumn, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                             QString value, Db::matchType match); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        QVector<QString> imultiSelect(QVector<QString> columns, QString table, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                            QString checkColumn, QString value, Db::matchType match); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        QVector<QString> imultiSelect(QVector<QString> columns, QString table); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        QVector<QString> icustomQuery(QString query, int returnValues); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    public: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        // [George]: Why delete these in particular? 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        Db(Db const&)              = delete; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        void operator=(Db const&)  = delete; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-#endif // DB_H 
			 |