From ef78e74cddb3ee1431341bc4d769f138c2f87fbf Mon Sep 17 00:00:00 2001 From: Albert S Date: Mon, 24 Aug 2020 21:36:45 +0200 Subject: [PATCH] Detect first run and initialize database and config Relates to #1 --- cli/main.cpp | 11 +++++- gui/main.cpp | 11 ++++++ shared/common.cpp | 88 ++++++++++++++++++++++++++++++++++++++++++++++- shared/common.h | 2 ++ 4 files changed, 110 insertions(+), 2 deletions(-) diff --git a/cli/main.cpp b/cli/main.cpp index 70c9788..db5b53e 100644 --- a/cli/main.cpp +++ b/cli/main.cpp @@ -56,7 +56,6 @@ Command *commandFromName(QString name, SqliteDbService &dbService) int main(int argc, char *argv[]) { Common::setupAppInfo(); - QCoreApplication app(argc, argv); QStringList args = app.arguments(); QString argv0 = args.takeFirst(); @@ -66,6 +65,16 @@ int main(int argc, char *argv[]) exit(1); } + try + { + Common::ensureConfigured(); + } + catch(QSSGeneralException &e) + { + Logger::error() << "Error: " << e.message; + return 1; + } + QString connectionString = Common::databasePath(); DatabaseFactory dbFactory(connectionString); SqliteDbService dbService(dbFactory); diff --git a/gui/main.cpp b/gui/main.cpp index c093291..d17979a 100644 --- a/gui/main.cpp +++ b/gui/main.cpp @@ -1,5 +1,6 @@ #include #include +#include #include "mainwindow.h" #include "searchresult.h" #include "pdfpreview.h" @@ -9,6 +10,16 @@ int main(int argc, char *argv[]) { Common::setupAppInfo(); QApplication a(argc, argv); + try + { + Common::ensureConfigured(); + } + catch(QSSGeneralException &e) + { + qDebug() << e.message; + QMessageBox::critical(nullptr, "Error", e.message); + return 1; + } qRegisterMetaType>("QVector"); qRegisterMetaType>("QVector"); qRegisterMetaType("PdfPreview"); diff --git a/shared/common.cpp b/shared/common.cpp index 7767ed0..4cfbba4 100644 --- a/shared/common.cpp +++ b/shared/common.cpp @@ -1,7 +1,93 @@ #include #include +#include +#include +#include +#include +#include +#include +#include +#include "qssgeneralexception.h" #include "common.h" +#define SETTINGS_KEY_DBPATH "dbpath" +#define SETTINGS_KEY_FIRSTRUN "firstrun" + +inline void initResources() +{ + Q_INIT_RESOURCE(create); +} + +bool Common::initSqliteDatabase(QString path) +{ + QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE"); + db.setDatabaseName(path); + if(!db.open()) + { + qDebug() << "failed to open database: " << path; + return false; + } + initResources(); + QFile file(":./create.sql"); + if(!file.open(QIODevice::ReadOnly)) + { + qDebug() << "Failed to load SQL creation script from embedded resource"; + return false; + } + QTextStream stream(&file); + db.transaction(); + while(!stream.atEnd()) + { + QString sql = stream.readLine(); + qDebug() << sql; + QSqlQuery sqlQuery; + if(!sqlQuery.exec(sql)) + { + qDebug() << "Failed to execute sql statement while initializing database: " << sqlQuery.lastError(); + db.rollback(); + return false; + } + } + db.commit(); + db.close(); + file.close(); + return true; +} + +void Common::ensureConfigured() +{ + QSettings settings; + QVariant firstRun = settings.value(SETTINGS_KEY_FIRSTRUN); + if(!firstRun.isValid()) + { + QString dbpath = QStandardPaths::writableLocation(QStandardPaths::AppLocalDataLocation); + QDir dir; + if(!dir.exists(dbpath)) + { + if(!dir.mkpath(dbpath)) + { + throw QSSGeneralException("Failed to create dbpath directory"); + } + } + dbpath += "/qss.sqlite"; + if(!initSqliteDatabase(dbpath)) + { + throw QSSGeneralException("Failed to initialize sqlite database"); + } + settings.setValue(SETTINGS_KEY_FIRSTRUN, false); + settings.setValue(SETTINGS_KEY_DBPATH, dbpath); + } + else + { + + QString dbpath = databasePath(); + if(!QFile::exists(dbpath)) + { + throw QSSGeneralException("Database " + dbpath + " was not found"); + } + } +} + void Common::setupAppInfo() { QCoreApplication::setOrganizationName("quitesimple.org"); @@ -15,7 +101,7 @@ QString Common::databasePath() if(env == "") { QSettings settings; - return settings.value("dbpath").toString(); + return settings.value(SETTINGS_KEY_DBPATH).toString(); } return env; } diff --git a/shared/common.h b/shared/common.h index ba028d6..c6e0ba1 100644 --- a/shared/common.h +++ b/shared/common.h @@ -6,5 +6,7 @@ namespace Common { void setupAppInfo(); QString databasePath(); +bool initSqliteDatabase(QString path); +void ensureConfigured(); } // namespace Common #endif