Save work...

This commit is contained in:
Martin Rotter 2014-04-15 19:48:29 +02:00
parent e0d6763708
commit 4fb05c3644
4 changed files with 52 additions and 42 deletions

View File

@ -68,16 +68,22 @@
#define FILTER_WIDTH 150 #define FILTER_WIDTH 150
#define FILTER_RIGHT_MARGIN 5 #define FILTER_RIGHT_MARGIN 5
#define APP_DB_TEST_MYSQL "MySQLTest" #define APP_DB_PSQL_DRIVER "QPSQL"
#define APP_DB_PSQL_PORT 5432
#define APP_DB_PSQL_FALLBACK_DB "postgres"
#define APP_DB_MYSQL_DRIVER "QMYSQL"
#define APP_DB_MYSQL_INIT "db_init_mysql.sql"
#define APP_DB_MYSQL_TEST "MySQLTest"
#define APP_DB_MYSQL_PORT 3306 #define APP_DB_MYSQL_PORT 3306
#define APP_DB_DRIVER_SQLITE "QSQLITE"
#define APP_DB_DRIVER_MYSQL "QMYSQL" #define APP_DB_SQLITE_DRIVER "QSQLITE"
#define APP_DB_INIT_MYSQL "db_init_mysql.sql" #define APP_DB_SQLITE_INIT "db_init_sqlite.sql"
#define APP_DB_INIT_SQLITE "db_init_sqlite.sql" #define APP_DB_SQLITE_MEMORY_INIT "db_init_sqlite_memory.sql"
#define APP_DB_INIT_SQLITE_MEMORY "db_init_sqlite_memory.sql" #define APP_DB_SQLITE_PATH "data/database/local"
#define APP_DB_INIT_SPLIT "-- !\n" #define APP_DB_SQLITE_FILE "database.db"
#define APP_DB_PATH "data/database/local"
#define APP_DB_FILE "database.db" #define APP_DB_COMMENT_SPLIT "-- !\n"
#define APP_DB_WEB_PATH "data/database/web" #define APP_DB_WEB_PATH "data/database/web"
#define APP_CFG_PATH "data/config" #define APP_CFG_PATH "data/config"

View File

@ -513,15 +513,15 @@ void FormSettings::loadDataStorage() {
// Load SQLite. // Load SQLite.
m_ui->m_cmbDatabaseDriver->addItem( m_ui->m_cmbDatabaseDriver->addItem(
tr("SQLite (embedded database)"), APP_DB_DRIVER_SQLITE); tr("SQLite (embedded database)"), APP_DB_SQLITE_DRIVER);
// Load in-memory database status. // Load in-memory database status.
m_ui->m_checkSqliteUseInMemoryDatabase->setChecked(Settings::instance()->value(APP_CFG_DB, "use_in_memory_db", false).toBool()); m_ui->m_checkSqliteUseInMemoryDatabase->setChecked(Settings::instance()->value(APP_CFG_DB, "use_in_memory_db", false).toBool());
if (QSqlDatabase::isDriverAvailable(APP_DB_DRIVER_MYSQL)) { if (QSqlDatabase::isDriverAvailable(APP_DB_MYSQL_DRIVER)) {
// Load MySQL. // Load MySQL.
m_ui->m_cmbDatabaseDriver->addItem( m_ui->m_cmbDatabaseDriver->addItem(
tr("MySQL/MariaDB (dedicated database)"), APP_DB_DRIVER_MYSQL); tr("MySQL/MariaDB (dedicated database)"), APP_DB_MYSQL_DRIVER);
// Setup placeholders. // Setup placeholders.
m_ui->m_txtMysqlHostname->lineEdit()->setPlaceholderText(tr("Hostname of your MySQL server")); m_ui->m_txtMysqlHostname->lineEdit()->setPlaceholderText(tr("Hostname of your MySQL server"));
@ -536,7 +536,7 @@ void FormSettings::loadDataStorage() {
int index_current_backend = m_ui->m_cmbDatabaseDriver->findData(Settings::instance()->value(APP_CFG_DB, int index_current_backend = m_ui->m_cmbDatabaseDriver->findData(Settings::instance()->value(APP_CFG_DB,
"database_driver", "database_driver",
APP_DB_DRIVER_SQLITE).toString()); APP_DB_SQLITE_DRIVER).toString());
if (index_current_backend >= 0) { if (index_current_backend >= 0) {
m_ui->m_cmbDatabaseDriver->setCurrentIndex(index_current_backend); m_ui->m_cmbDatabaseDriver->setCurrentIndex(index_current_backend);
@ -553,13 +553,13 @@ void FormSettings::saveDataStorage() {
} }
// Save data storage settings. // Save data storage settings.
QString original_db_driver = Settings::instance()->value(APP_CFG_DB, "database_driver", APP_DB_DRIVER_SQLITE).toString(); QString original_db_driver = Settings::instance()->value(APP_CFG_DB, "database_driver", APP_DB_SQLITE_DRIVER).toString();
QString selected_db_driver = m_ui->m_cmbDatabaseDriver->itemData(m_ui->m_cmbDatabaseDriver->currentIndex()).toString(); QString selected_db_driver = m_ui->m_cmbDatabaseDriver->itemData(m_ui->m_cmbDatabaseDriver->currentIndex()).toString();
// Save SQLite. // Save SQLite.
Settings::instance()->setValue(APP_CFG_DB, "use_in_memory_db", new_inmemory); Settings::instance()->setValue(APP_CFG_DB, "use_in_memory_db", new_inmemory);
if (QSqlDatabase::isDriverAvailable(APP_DB_DRIVER_MYSQL)) { if (QSqlDatabase::isDriverAvailable(APP_DB_MYSQL_DRIVER)) {
// Save MySQL. // Save MySQL.
Settings::instance()->setValue(APP_CFG_DB, "mysql_hostname", m_ui->m_txtMysqlHostname->lineEdit()->text()); Settings::instance()->setValue(APP_CFG_DB, "mysql_hostname", m_ui->m_txtMysqlHostname->lineEdit()->text());
Settings::instance()->setValue(APP_CFG_DB, "mysql_username", m_ui->m_txtMysqlUsername->lineEdit()->text()); Settings::instance()->setValue(APP_CFG_DB, "mysql_username", m_ui->m_txtMysqlUsername->lineEdit()->text());

View File

@ -52,8 +52,8 @@ DatabaseFactory *DatabaseFactory::instance() {
DatabaseFactory::MySQLError DatabaseFactory::mysqlTestConnection(const QString &hostname, int port, DatabaseFactory::MySQLError DatabaseFactory::mysqlTestConnection(const QString &hostname, int port,
const QString &username, const QString &password) { const QString &username, const QString &password) {
QSqlDatabase database = QSqlDatabase::addDatabase(APP_DB_DRIVER_MYSQL, QSqlDatabase database = QSqlDatabase::addDatabase(APP_DB_MYSQL_DRIVER,
APP_DB_TEST_MYSQL); APP_DB_MYSQL_TEST);
database.setHostName(hostname); database.setHostName(hostname);
database.setPort(port); database.setPort(port);
@ -63,7 +63,7 @@ DatabaseFactory::MySQLError DatabaseFactory::mysqlTestConnection(const QString &
if (database.open()) { if (database.open()) {
// Connection succeeded, clean up the mess and return OK status. // Connection succeeded, clean up the mess and return OK status.
database.close(); database.close();
removeConnection(APP_DB_TEST_MYSQL); removeConnection(APP_DB_MYSQL_TEST);
return MySQLOk; return MySQLOk;
} }
else { else {
@ -71,7 +71,7 @@ DatabaseFactory::MySQLError DatabaseFactory::mysqlTestConnection(const QString &
// error code. // error code.
MySQLError error_code = static_cast<MySQLError>(database.lastError().number()); MySQLError error_code = static_cast<MySQLError>(database.lastError().number());
removeConnection(APP_DB_TEST_MYSQL); removeConnection(APP_DB_MYSQL_TEST);
return error_code; return error_code;
} }
} }
@ -100,17 +100,17 @@ void DatabaseFactory::sqliteAssemblyDatabaseFilePath() {
if (Settings::instance()->type() == Settings::Portable) { if (Settings::instance()->type() == Settings::Portable) {
m_sqliteDatabaseFilePath = qApp->applicationDirPath() + m_sqliteDatabaseFilePath = qApp->applicationDirPath() +
QDir::separator() + QDir::separator() +
QString(APP_DB_PATH); QString(APP_DB_SQLITE_PATH);
} }
else { else {
m_sqliteDatabaseFilePath = QDir::homePath() + QDir::separator() + m_sqliteDatabaseFilePath = QDir::homePath() + QDir::separator() +
QString(APP_LOW_H_NAME) + QDir::separator() + QString(APP_LOW_H_NAME) + QDir::separator() +
QString(APP_DB_PATH); QString(APP_DB_SQLITE_PATH);
} }
} }
QSqlDatabase DatabaseFactory::sqliteInitializeInMemoryDatabase() { QSqlDatabase DatabaseFactory::sqliteInitializeInMemoryDatabase() {
QSqlDatabase database = QSqlDatabase::addDatabase(APP_DB_DRIVER_SQLITE); QSqlDatabase database = QSqlDatabase::addDatabase(APP_DB_SQLITE_DRIVER);
database.setDatabaseName(":memory:"); database.setDatabaseName(":memory:");
@ -136,16 +136,16 @@ QSqlDatabase DatabaseFactory::sqliteInitializeInMemoryDatabase() {
if (query_db.lastError().isValid()) { if (query_db.lastError().isValid()) {
qWarning("Error occurred. In-memory SQLite database is not initialized. Initializing now."); qWarning("Error occurred. In-memory SQLite database is not initialized. Initializing now.");
QFile file_init(APP_MISC_PATH + QDir::separator() + APP_DB_INIT_SQLITE_MEMORY); QFile file_init(APP_MISC_PATH + QDir::separator() + APP_DB_SQLITE_MEMORY_INIT);
if (!file_init.open(QIODevice::ReadOnly | QIODevice::Text)) { if (!file_init.open(QIODevice::ReadOnly | QIODevice::Text)) {
// Database initialization file not opened. HUGE problem. // Database initialization file not opened. HUGE problem.
qFatal("In-memory SQLite database initialization file '%s' from directory '%s' was not found. In-memory database is uninitialized.", qFatal("In-memory SQLite database initialization file '%s' from directory '%s' was not found. In-memory database is uninitialized.",
APP_DB_INIT_SQLITE, APP_DB_SQLITE_INIT,
qPrintable(APP_MISC_PATH)); qPrintable(APP_MISC_PATH));
} }
QStringList statements = QString(file_init.readAll()).split(APP_DB_INIT_SPLIT, QStringList statements = QString(file_init.readAll()).split(APP_DB_COMMENT_SPLIT,
QString::SkipEmptyParts); QString::SkipEmptyParts);
database.transaction(); database.transaction();
@ -154,7 +154,7 @@ QSqlDatabase DatabaseFactory::sqliteInitializeInMemoryDatabase() {
if (query_db.lastError().isValid()) { if (query_db.lastError().isValid()) {
qFatal("In-memory SQLite database initialization failed. Initialization script '%s' is not correct.", qFatal("In-memory SQLite database initialization failed. Initialization script '%s' is not correct.",
APP_DB_INIT_SQLITE); APP_DB_SQLITE_INIT);
} }
} }
@ -200,7 +200,7 @@ QSqlDatabase DatabaseFactory::sqliteInitializeInMemoryDatabase() {
QSqlDatabase DatabaseFactory::sqliteInitializeFileBasedDatabase(const QString &connection_name) { QSqlDatabase DatabaseFactory::sqliteInitializeFileBasedDatabase(const QString &connection_name) {
// Prepare file paths. // Prepare file paths.
QDir db_path(m_sqliteDatabaseFilePath); QDir db_path(m_sqliteDatabaseFilePath);
QFile db_file(db_path.absoluteFilePath(APP_DB_FILE)); QFile db_file(db_path.absoluteFilePath(APP_DB_SQLITE_FILE));
// Check if database directory exists. // Check if database directory exists.
if (!db_path.exists()) { if (!db_path.exists()) {
@ -216,7 +216,7 @@ QSqlDatabase DatabaseFactory::sqliteInitializeFileBasedDatabase(const QString &c
// Folders are created. Create new QSQLDatabase object. // Folders are created. Create new QSQLDatabase object.
QSqlDatabase database; QSqlDatabase database;
database = QSqlDatabase::addDatabase(APP_DB_DRIVER_SQLITE, database = QSqlDatabase::addDatabase(APP_DB_SQLITE_DRIVER,
connection_name); connection_name);
database.setDatabaseName(db_file.fileName()); database.setDatabaseName(db_file.fileName());
@ -242,16 +242,16 @@ QSqlDatabase DatabaseFactory::sqliteInitializeFileBasedDatabase(const QString &c
if (query_db.lastError().isValid()) { if (query_db.lastError().isValid()) {
qWarning("Error occurred. File-based SQLite database is not initialized. Initializing now."); qWarning("Error occurred. File-based SQLite database is not initialized. Initializing now.");
QFile file_init(APP_MISC_PATH + QDir::separator() + APP_DB_INIT_SQLITE); QFile file_init(APP_MISC_PATH + QDir::separator() + APP_DB_SQLITE_INIT);
if (!file_init.open(QIODevice::ReadOnly | QIODevice::Text)) { if (!file_init.open(QIODevice::ReadOnly | QIODevice::Text)) {
// Database initialization file not opened. HUGE problem. // Database initialization file not opened. HUGE problem.
qFatal("SQLite database initialization file '%s' from directory '%s' was not found. File-based database is uninitialized.", qFatal("SQLite database initialization file '%s' from directory '%s' was not found. File-based database is uninitialized.",
APP_DB_INIT_SQLITE, APP_DB_SQLITE_INIT,
qPrintable(APP_MISC_PATH)); qPrintable(APP_MISC_PATH));
} }
QStringList statements = QString(file_init.readAll()).split(APP_DB_INIT_SPLIT, QStringList statements = QString(file_init.readAll()).split(APP_DB_COMMENT_SPLIT,
QString::SkipEmptyParts); QString::SkipEmptyParts);
database.transaction(); database.transaction();
@ -260,7 +260,7 @@ QSqlDatabase DatabaseFactory::sqliteInitializeFileBasedDatabase(const QString &c
if (query_db.lastError().isValid()) { if (query_db.lastError().isValid()) {
qFatal("File-based SQLite database initialization failed. Initialization script '%s' is not correct.", qFatal("File-based SQLite database initialization failed. Initialization script '%s' is not correct.",
APP_DB_INIT_SQLITE); APP_DB_SQLITE_INIT);
} }
} }
@ -330,9 +330,12 @@ void DatabaseFactory::sqliteSaveMemoryDatabase() {
} }
void DatabaseFactory::determineDriver() { void DatabaseFactory::determineDriver() {
QString db_driver = Settings::instance()->value(APP_CFG_DB, "database_driver", APP_DB_DRIVER_SQLITE).toString(); QString db_driver = Settings::instance()->value(APP_CFG_DB,
"database_driver",
APP_DB_SQLITE_DRIVER).toString();
if (db_driver == APP_DB_DRIVER_MYSQL && QSqlDatabase::isDriverAvailable(APP_DB_DRIVER_MYSQL)) { if (db_driver == APP_DB_MYSQL_DRIVER &&
QSqlDatabase::isDriverAvailable(APP_DB_SQLITE_DRIVER)) {
// User wants to use MySQL and MySQL is actually available. Use it. // User wants to use MySQL and MySQL is actually available. Use it.
m_activeDatabaseDriver = MYSQL; m_activeDatabaseDriver = MYSQL;
@ -377,7 +380,7 @@ QSqlDatabase DatabaseFactory::mysqlConnection(const QString &connection_name) {
else { else {
// Database connection with this name does not exist // Database connection with this name does not exist
// yet, add it and set it up. // yet, add it and set it up.
database = QSqlDatabase::addDatabase(APP_DB_DRIVER_MYSQL, connection_name); database = QSqlDatabase::addDatabase(APP_DB_MYSQL_DRIVER, connection_name);
database.setHostName(Settings::instance()->value(APP_CFG_DB, "mysql_hostname").toString()); database.setHostName(Settings::instance()->value(APP_CFG_DB, "mysql_hostname").toString());
database.setPort(Settings::instance()->value(APP_CFG_DB, "mysql_port", APP_DB_MYSQL_PORT).toInt()); database.setPort(Settings::instance()->value(APP_CFG_DB, "mysql_port", APP_DB_MYSQL_PORT).toInt());
@ -402,7 +405,7 @@ QSqlDatabase DatabaseFactory::mysqlConnection(const QString &connection_name) {
QSqlDatabase DatabaseFactory::mysqlInitializeDatabase(const QString &connection_name) { QSqlDatabase DatabaseFactory::mysqlInitializeDatabase(const QString &connection_name) {
// Folders are created. Create new QSQLDatabase object. // Folders are created. Create new QSQLDatabase object.
QSqlDatabase database = QSqlDatabase::addDatabase(APP_DB_DRIVER_MYSQL, QSqlDatabase database = QSqlDatabase::addDatabase(APP_DB_MYSQL_DRIVER,
connection_name); connection_name);
database.setHostName(Settings::instance()->value(APP_CFG_DB, "mysql_hostname").toString()); database.setHostName(Settings::instance()->value(APP_CFG_DB, "mysql_hostname").toString());
@ -425,16 +428,16 @@ QSqlDatabase DatabaseFactory::mysqlInitializeDatabase(const QString &connection_
// or schema version is wrong, then initialize it. // or schema version is wrong, then initialize it.
qWarning("Error occurred. MySQL database is not initialized. Initializing now."); qWarning("Error occurred. MySQL database is not initialized. Initializing now.");
QFile file_init(APP_MISC_PATH + QDir::separator() + APP_DB_INIT_MYSQL); QFile file_init(APP_MISC_PATH + QDir::separator() + APP_DB_MYSQL_INIT);
if (!file_init.open(QIODevice::ReadOnly | QIODevice::Text)) { if (!file_init.open(QIODevice::ReadOnly | QIODevice::Text)) {
// Database initialization file not opened. HUGE problem. // Database initialization file not opened. HUGE problem.
qFatal("MySQL database initialization file '%s' from directory '%s' was not found. File-based database is uninitialized.", qFatal("MySQL database initialization file '%s' from directory '%s' was not found. File-based database is uninitialized.",
APP_DB_INIT_MYSQL, APP_DB_MYSQL_INIT,
qPrintable(APP_MISC_PATH)); qPrintable(APP_MISC_PATH));
} }
QStringList statements = QString(file_init.readAll()).split(APP_DB_INIT_SPLIT, QStringList statements = QString(file_init.readAll()).split(APP_DB_COMMENT_SPLIT,
QString::SkipEmptyParts); QString::SkipEmptyParts);
database.transaction(); database.transaction();
@ -443,7 +446,7 @@ QSqlDatabase DatabaseFactory::mysqlInitializeDatabase(const QString &connection_
if (query_db.lastError().isValid()) { if (query_db.lastError().isValid()) {
qFatal("MySQL database initialization failed. Initialization script '%s' is not correct.", qFatal("MySQL database initialization failed. Initialization script '%s' is not correct.",
APP_DB_INIT_MYSQL); APP_DB_MYSQL_INIT);
} }
} }
@ -513,10 +516,10 @@ QSqlDatabase DatabaseFactory::sqliteConnection(const QString &connection_name,
else { else {
// Database connection with this name does not exist // Database connection with this name does not exist
// yet, add it and set it up. // yet, add it and set it up.
database = QSqlDatabase::addDatabase(APP_DB_DRIVER_SQLITE, connection_name); database = QSqlDatabase::addDatabase(APP_DB_SQLITE_DRIVER, connection_name);
QDir db_path(m_sqliteDatabaseFilePath); QDir db_path(m_sqliteDatabaseFilePath);
QFile db_file(db_path.absoluteFilePath(APP_DB_FILE)); QFile db_file(db_path.absoluteFilePath(APP_DB_SQLITE_FILE));
// Setup database file path. // Setup database file path.
database.setDatabaseName(db_file.fileName()); database.setDatabaseName(db_file.fileName());

View File

@ -41,6 +41,7 @@ class DatabaseFactory : public QObject {
FromSettings FromSettings
}; };
// Describes possible MySQL-specific errors.
enum MySQLError { enum MySQLError {
MySQLOk = 0, MySQLOk = 0,
MySQLAccessDenied = 1045, MySQLAccessDenied = 1045,