Detect first run and initialize database and config

Relates to #1
This commit is contained in:
Albert S. 2020-08-24 21:36:45 +02:00
parent 498985bf25
commit bbe8b1f530
4 changed files with 108 additions and 2 deletions

View File

@ -56,7 +56,6 @@ Command *commandFromName(QString name, SqliteDbService &dbService)
int main(int argc, char *argv[]) int main(int argc, char *argv[])
{ {
Common::setupAppInfo(); Common::setupAppInfo();
QCoreApplication app(argc, argv); QCoreApplication app(argc, argv);
QStringList args = app.arguments(); QStringList args = app.arguments();
QString argv0 = args.takeFirst(); QString argv0 = args.takeFirst();
@ -66,6 +65,16 @@ int main(int argc, char *argv[])
exit(1); exit(1);
} }
try
{
Common::ensureConfigured();
}
catch(QSSGeneralException &e)
{
Logger::error() << "Error: " << e.message;
return 1;
}
QString connectionString = Common::databasePath(); QString connectionString = Common::databasePath();
DatabaseFactory dbFactory(connectionString); DatabaseFactory dbFactory(connectionString);
SqliteDbService dbService(dbFactory); SqliteDbService dbService(dbFactory);

View File

@ -1,5 +1,6 @@
#include <QApplication> #include <QApplication>
#include <QSettings> #include <QSettings>
#include <QMessageBox>
#include "mainwindow.h" #include "mainwindow.h"
#include "searchresult.h" #include "searchresult.h"
#include "pdfpreview.h" #include "pdfpreview.h"
@ -9,6 +10,16 @@ int main(int argc, char *argv[])
{ {
Common::setupAppInfo(); Common::setupAppInfo();
QApplication a(argc, argv); QApplication a(argc, argv);
try
{
Common::ensureConfigured();
}
catch(QSSGeneralException &e)
{
qDebug() << e.message;
QMessageBox::critical(nullptr, "Error", e.message);
return 1;
}
qRegisterMetaType<QVector<SearchResult>>("QVector<SearchResult>"); qRegisterMetaType<QVector<SearchResult>>("QVector<SearchResult>");
qRegisterMetaType<QVector<PdfPreview>>("QVector<PdfPreview>"); qRegisterMetaType<QVector<PdfPreview>>("QVector<PdfPreview>");
qRegisterMetaType<PdfPreview>("PdfPreview"); qRegisterMetaType<PdfPreview>("PdfPreview");

View File

@ -1,7 +1,91 @@
#include <QProcessEnvironment> #include <QProcessEnvironment>
#include <QSettings> #include <QSettings>
#include <QStandardPaths>
#include <QDir>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QSqlError>
#include <QTextStream>
#include <QDebug>
#include "qssgeneralexception.h"
#include "common.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() void Common::setupAppInfo()
{ {
QCoreApplication::setOrganizationName("quitesimple.org"); QCoreApplication::setOrganizationName("quitesimple.org");
@ -15,7 +99,7 @@ QString Common::databasePath()
if(env == "") if(env == "")
{ {
QSettings settings; QSettings settings;
return settings.value("dbpath").toString(); return settings.value(SETTINGS_KEY_DBPATH).toString();
} }
return env; return env;
} }

View File

@ -6,5 +6,7 @@ namespace Common
{ {
void setupAppInfo(); void setupAppInfo();
QString databasePath(); QString databasePath();
bool initSqliteDatabase(QString path);
void ensureConfigured();
} }
#endif #endif