Forráskód Böngészése

Continued work on new DB Setup

Felix Turo 3 éve
szülő
commit
ecb4f78c68
5 módosított fájl, 138 hozzáadás és 11 törlés
  1. 12 0
      src/classes/ajson.cpp
  2. 6 0
      src/classes/ajson.h
  3. 90 1
      src/database/adbsetup.cpp
  4. 20 0
      src/database/adbsetup.h
  5. 10 10
      src/functions/alog.cpp

+ 12 - 0
src/classes/ajson.cpp

@@ -57,6 +57,17 @@ void AJson::importDatabase()
     }
 }
 
+QJsonDocument AJson::readJsonToDocument(const QString &file_path)
+{
+    QFile file(file_path);
+    file.open(QIODevice::ReadOnly | QIODevice::Text);
+    QString raw = file.readAll();
+    file.close();
+
+    QJsonDocument doc = QJsonDocument::fromJson(raw.toUtf8());
+    return doc;
+}
+
 void AJson::writeJson(const QJsonDocument &doc, const QString &file_name)
 {
     QFile out(AStandardPaths::asChildOfDir(AStandardPaths::JSON,file_name));
@@ -65,6 +76,7 @@ void AJson::writeJson(const QJsonDocument &doc, const QString &file_name)
     out.close();
 }
 
+QT_DEPRECATED
 QJsonDocument AJson::readJson(const QString &file_path)
 {
     QFile file(file_path);

+ 6 - 0
src/classes/ajson.h

@@ -46,6 +46,12 @@ public:
      */
     static void importDatabase();
 
+    /*!
+     * \brief readJsonToDocument reads data from a JSON file into a QJSonDocument and returns the document
+     * \param file_path
+     */
+    static QJsonDocument readJsonToDocument(const QString &file_path);
+
 private:
 
     /*!

+ 90 - 1
src/database/adbsetup.cpp

@@ -2,6 +2,7 @@
 #include "src/opl.h"
 #include "src/database/adatabase.h"
 #include "src/functions/alog.h"
+#include "src/classes/ajson.h"
 
 namespace aDbSetup {
 
@@ -286,4 +287,92 @@ bool createDatabase()
     }
 }
 
-} //namespace aDbSetup
+void clear()
+{
+    QSqlQuery q;
+
+    for (const auto &table_name : USER_TABLE_NAMES) {
+        q.prepare("DELETE FROM " + table_name);
+        if (!q.exec()) {
+            DEB << "Error: " << q.lastError().text();
+        }
+    }
+}
+
+bool commitData(const QJsonArray &json_arr, const QString &table_name)
+{
+    //aDB->updateLayout(); // needed?
+    QSqlQuery q;
+
+    // create insert statement
+    QString statement = QLatin1String("INSERT INTO ") + table_name + QLatin1String(" (");
+    QString placeholder = QStringLiteral(") VALUES (");
+    for (const auto &column_name : aDB->getTableColumns(table_name)) {
+        statement += column_name + ',';
+        placeholder.append(QLatin1Char(':') + column_name + QLatin1Char(','));
+    }
+
+    statement.chop(1);
+    placeholder.chop(1);
+    placeholder.append(')');
+    statement.append(placeholder);
+
+    q.prepare(QStringLiteral("BEGIN EXCLUSIVE TRANSACTION"));
+    q.exec();
+    //DEB << statement;
+    for (const auto &entry : json_arr) {
+        q.prepare(statement);
+
+        auto object = entry.toObject();
+        const auto keys = object.keys();
+        for (const auto &key : keys){
+            object.value(key).isNull() ? q.bindValue(key, QVariant(QVariant::String)) :
+                                         q.bindValue(QLatin1Char(':') + key, object.value(key).toVariant());
+        }
+
+        q.exec();
+    }
+
+    q.prepare(QStringLiteral("COMMIT"));
+    if (q.exec())
+        return true;
+    else
+        return false;
+}
+
+bool importTemplateData(bool use_local_ressources)
+{
+    QSqlQuery q;
+    // reset template tables
+    for (const auto& table_name : TEMPLATE_TABLE_NAMES) {
+        //clear table
+        q.prepare(QLatin1String("DELETE FROM ") + table_name);
+        if (!q.exec()) {
+            DEB << "Error: " << q.lastError().text();
+            return false;
+        }
+        //Prepare data
+        QJsonArray data_to_commit;
+        QString error_message("Error importing data ");
+
+        if (use_local_ressources) {
+            data_to_commit = AJson::readJsonToDocument(QStringLiteral(":templates/database/templates/")
+                                      + table_name + QLatin1String(".json")).array();
+            error_message.append(" (ressource) ");
+        } else {
+            data_to_commit = AJson::readJsonToDocument(AStandardPaths::directory(
+                                          AStandardPaths::Templates).absoluteFilePath(
+                                          table_name + QLatin1String(".json"))).array();
+            error_message.append(" (downloaded) ");
+        }
+
+        // commit Data from Array
+        if (!commitData(data_to_commit, table_name)) {
+            LOG << error_message;
+            return false;
+        }
+    } // for table_name
+    return false;
+}
+
+} // namespace aDbSetup

+ 20 - 0
src/database/adbsetup.h

@@ -18,6 +18,26 @@ bool createDatabase();
  * \return true on success
  */
 bool createSchemata(const QStringList &statements);
+
+/*!
+ * \brief commitData commits the data read from a JSON file into a table in the database.
+ */
+bool commitData(const QJsonArray &json_arr, const QString &table_name);
+
+/*!
+ * \brief clearUserData Deletes all data from user tables. Resets the database.
+ */
+void clearUserData();
+
+/*!
+ * \brief importTemplateData fills an empty database with the template
+ * data (Aircraft, Airports, currencies, changelog) as read from the JSON
+ * templates
+ * \param use_local_ressources determines whether the included ressource files
+ * or a previously downloaded file should be used.
+ * \return
+ */
+bool importTemplateData(bool use_local_ressources);
 }; // namespace aDbSetup
 
 #endif // ADBSETUP_H

+ 10 - 10
src/functions/alog.cpp

@@ -100,25 +100,25 @@ void aMessageHandler(QtMsgType type, const QMessageLogContext &context,
 
     switch (type) {
         case QtDebugMsg:
-            QTextStream(stdout) << DEB_HEADER_CONSOLE << msg << endl << D_SPACER << function << "\033[m" << endl;
+            QTextStream(stdout) << DEB_HEADER_CONSOLE << msg << Qt::endl << D_SPACER << function << "\033[m" << Qt::endl;
             if(logDebug)
-                log_stream << timeNow() << DEB_HEADER << msg << D_SPACER << function << endl;
+                log_stream << timeNow() << DEB_HEADER << msg << D_SPACER << function << Qt::endl;
             break;
         case QtInfoMsg:
-            log_stream << timeNow() << INFO_HEADER << msg << SPACER << function << endl;
-            QTextStream(stdout) << INFO_HEADER_CONSOLE << msg << endl;
+            log_stream << timeNow() << INFO_HEADER << msg << SPACER << function << Qt::endl;
+            QTextStream(stdout) << INFO_HEADER_CONSOLE << msg << Qt::endl;
             break;
         case QtWarningMsg:
-            log_stream << timeNow() << WARN_HEADER << msg << SPACER << endl;
-            QTextStream(stdout) << WARN_HEADER_CONSOLE << msg << endl;
+            log_stream << timeNow() << WARN_HEADER << msg << SPACER << Qt::endl;
+            QTextStream(stdout) << WARN_HEADER_CONSOLE << msg << Qt::endl;
             break;
         case QtCriticalMsg:
-            log_stream << timeNow() << CRIT_HEADER << msg << SPACER << endl;
-            QTextStream(stdout) << CRIT_HEADER_CONSOLE << msg << endl;
+            log_stream << timeNow() << CRIT_HEADER << msg << SPACER << Qt::endl;
+            QTextStream(stdout) << CRIT_HEADER_CONSOLE << msg << Qt::endl;
             break;
     default:
-            log_stream << timeNow() << INFO_HEADER << msg << function << endl;
-            QTextStream(stdout) << INFO_HEADER_CONSOLE << msg << endl;
+            log_stream << timeNow() << INFO_HEADER << msg << function << Qt::endl;
+            QTextStream(stdout) << INFO_HEADER_CONSOLE << msg << Qt::endl;
             break;
     }
 }