From 3c7253d6cdc23aac36208fa87dc6571c7cb7c5ff Mon Sep 17 00:00:00 2001 From: Dark1-dev Date: Wed, 1 Mar 2023 21:33:55 +0600 Subject: Add files via upload --- Database/initdatabase.cpp | 77 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 Database/initdatabase.cpp (limited to 'Database/initdatabase.cpp') diff --git a/Database/initdatabase.cpp b/Database/initdatabase.cpp new file mode 100644 index 0000000..06cd37c --- /dev/null +++ b/Database/initdatabase.cpp @@ -0,0 +1,77 @@ +#include "databaseinterface.h" + +bool initDatabase(const QString applicationPath) +{ + // open SQLite database + QSqlDatabase dbi = QSqlDatabase::addDatabase( "QSQLITE" ); + dbi.setDatabaseName(applicationPath + "/" + _sqlitePath); + + // open database + if ( ! dbi.open() ) + { + QSqlError sqlError = dbi.lastError(); + logPrimitive() << "Error opening database: " << sqlError.text() << endl; + return false; + } + + // speed up SQLite with keeping journals in memory and asynchronous writing + dbi.exec("PRAGMA synchronous = OFF"); + dbi.exec("PRAGMA journal_mode = MEMORY"); + + { // check if the database was generated with this version of the software + + // serverlist exists (and thus the other tables exist) but not version + if ( dbi.tables().contains("serverlist") and ! dbi.tables().contains("versioninfo")) + { + // outdated because the "version" table does not even exist yet (pre-0.14) + logPrimitive() << "The database tables are outdated (pre-0.14). Please remove the current database." << endl; + return false; + } + + // does the version table exist, and does it contain the correct version? + if ( dbi.tables().contains("versioninfo") ) + { + float dbVersion = 0.0; + QSqlQuery versionQuery; + versionQuery.prepare("SELECT version FROM versioninfo WHERE type = \"database\""); + + // failed query? (unlikely) + if ( ! versionQuery.exec() ) + return reportQuery(versionQuery); + + if (versionQuery.next()) + dbVersion = versionQuery.value("version").toFloat(); + + // version check is intentionally hardcoded since the last change in database structure (currently v0.15) + if ( dbVersion < DATABASE_VERSION ) + { + logPrimitive() << "The database tables are outdated (" << QString::number(dbVersion) << "). Please remove the current database." << endl; + return false; + } + + // tables up to date + return true; + } + } + + // specifying AUTO_CREATE_DB=y in the environment allows bypassing of the interactive prompt for non-interactive environments + if (qgetenv("AUTO_CREATE_DB") != "y") + { + // relevant tables do not exist. ask to generate. + logPrimitive() << "The database tables do not exist. Do you want to generate these? [y/N]" << endl; + + // if no, do not proceed. + if ( ! QTextStream(stdin).readLine().startsWith("y") ) + { + // do not generate. failed to load database. + return false; + } + } + else + { + logPrimitive() << "The database tables do not exist and will now be created." << endl; + } + + // create tables and proceed + return createTables(); +} -- cgit v1.2.3