diff --git a/src/core/databasefactory.cpp b/src/core/databasefactory.cpp
index 8e280e2f2..4d05b5c71 100644
--- a/src/core/databasefactory.cpp
+++ b/src/core/databasefactory.cpp
@@ -33,6 +33,13 @@ DatabaseFactory *DatabaseFactory::instance() {
return s_instance;
}
+int DatabaseFactory::mysqlTestConnection(const QString &hostname, int port,
+ const QString &usernam, const QString &password) {
+ // TODO: Otestovat, připojení k databázi pod danými
+ // údaji. Vrátit kód chyby. Použije se v dialogu nastavení.
+ return 0;
+}
+
void DatabaseFactory::sqliteAssemblyDatabaseFilePath() {
if (Settings::instance()->type() == Settings::Portable) {
m_sqliteDatabaseFilePath = qApp->applicationDirPath() +
@@ -106,7 +113,7 @@ QSqlDatabase DatabaseFactory::sqliteInitializeInMemoryDatabase() {
}
// Loading messages from file-based database.
- QSqlDatabase file_database = connection(objectName(), StrictlyFileBased);
+ QSqlDatabase file_database = sqliteConnection(objectName(), StrictlyFileBased);
QSqlQuery copy_contents(database);
// Attach database.
@@ -245,8 +252,8 @@ void DatabaseFactory::removeConnection(const QString &connection_name) {
void DatabaseFactory::sqliteSaveMemoryDatabase() {
qDebug("Saving in-memory working database back to persistent file-based storage.");
- QSqlDatabase database = connection(objectName(), StrictlyInMemory);
- QSqlDatabase file_database = connection(objectName(), StrictlyFileBased);
+ QSqlDatabase database = sqliteConnection(objectName(), StrictlyInMemory);
+ QSqlDatabase file_database = sqliteConnection(objectName(), StrictlyFileBased);
QSqlQuery copy_contents(database);
// Attach database.
@@ -317,11 +324,11 @@ QSqlDatabase DatabaseFactory::mysqlConnection(const QString &connection_name) {
// yet, add it and set it up.
database = QSqlDatabase::addDatabase(APP_DB_DRIVER_MYSQL, connection_name);
- database.setHostName("localhost");
- database.setPort(3306);
- database.setUserName("root");
- database.setDatabaseName("rssguard");
- //database.setPassword("password");
+ 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.setUserName(Settings::instance()->value(APP_CFG_DB, "mysql_username").toString());
+ database.setPassword(Settings::instance()->value(APP_CFG_DB, "mysql_password").toString());
+ database.setDatabaseName(APP_LOW_NAME);
}
if (!database.isOpen() && !database.open()) {
@@ -343,10 +350,10 @@ QSqlDatabase DatabaseFactory::mysqlInitializeDatabase(const QString &connection_
QSqlDatabase database = QSqlDatabase::addDatabase(APP_DB_DRIVER_MYSQL,
connection_name);
- database.setHostName("localhost");
- database.setPort(3306);
- database.setUserName("root");
- //database.setPassword("password");
+ 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.setUserName(Settings::instance()->value(APP_CFG_DB, "mysql_username").toString());
+ database.setPassword(Settings::instance()->value(APP_CFG_DB, "mysql_password").toString());
if (!database.open()) {
qFatal("MySQL database was NOT opened. Delivered error message: '%s'",
@@ -392,8 +399,7 @@ QSqlDatabase DatabaseFactory::mysqlInitializeDatabase(const QString &connection_
query_db.next();
qDebug("MySQL database connection '%s' seems to be established.",
- qPrintable(connection_name),
- qPrintable(QDir::toNativeSeparators(database.databaseName())));
+ qPrintable(connection_name));
qDebug("MySQL database has version '%s'.", qPrintable(query_db.value(0).toString()));
}
@@ -476,6 +482,13 @@ QSqlDatabase DatabaseFactory::sqliteConnection(const QString &connection_name,
}
}
+bool DatabaseFactory::sqliteVacuumDatabase() {
+ QSqlDatabase database = sqliteConnection(objectName(), FromSettings);
+ QSqlQuery query_vacuum(database);
+
+ return query_vacuum.exec("VACUUM");
+}
+
void DatabaseFactory::saveDatabase() {
switch (m_activeDatabaseDriver) {
case SQLITE_MEMORY:
@@ -490,13 +503,8 @@ void DatabaseFactory::saveDatabase() {
bool DatabaseFactory::vacuumDatabase() {
switch (m_activeDatabaseDriver) {
case SQLITE_MEMORY:
- case SQLITE: {
- QSqlDatabase database = connection(objectName(), FromSettings);
- QSqlQuery query_vacuum(database);
-
- return query_vacuum.exec("VACUUM");
- break;
- }
+ case SQLITE:
+ return sqliteVacuumDatabase();
case MYSQL:
default:
diff --git a/src/core/databasefactory.h b/src/core/databasefactory.h
index 2e070fcb5..c88dc5138 100644
--- a/src/core/databasefactory.h
+++ b/src/core/databasefactory.h
@@ -61,6 +61,13 @@ class DatabaseFactory : public QObject {
// Singleton getter.
static DatabaseFactory *instance();
+ //
+ // MySQL stuff.
+ //
+ int mysqlTestConnection(const QString &hostname, int port,
+ const QString &usernam, const QString &password);
+
+
private:
//
// GENERAL stuff.
@@ -100,6 +107,9 @@ class DatabaseFactory : public QObject {
QSqlDatabase sqliteConnection(const QString &connection_name,
DesiredType desired_type);
+ // Runs "VACUUM" on the database.
+ bool sqliteVacuumDatabase();
+
// Performs saving of items from in-memory database
// to file-based database.
void sqliteSaveMemoryDatabase();
diff --git a/src/gui/formsettings.cpp b/src/gui/formsettings.cpp
index e4c3fe12c..d342db0ba 100755
--- a/src/gui/formsettings.cpp
+++ b/src/gui/formsettings.cpp
@@ -2,6 +2,7 @@
#include "core/defs.h"
#include "core/settings.h"
+#include "core/databasefactory.h"
#include "core/localization.h"
#include "core/systemfactory.h"
#include "core/feeddownloader.h"
@@ -95,6 +96,14 @@ FormSettings::FormSettings(QWidget *parent) : QDialog(parent), m_ui(new Ui::Form
this, SLOT(changeDefaultBrowserArguments(int)));
connect(m_ui->m_btnExternalBrowserExecutable, SIGNAL(clicked()),
this, SLOT(selectBrowserExecutable()));
+ connect(m_ui->m_txtMysqlUsername->lineEdit(), SIGNAL(textChanged(QString)),
+ this, SLOT(onMysqlUsernameChanged(QString)));
+ connect(m_ui->m_txtMysqlHostname->lineEdit(), SIGNAL(textChanged(QString)),
+ this, SLOT(onMysqlHostnameChanged(QString)));
+ connect(m_ui->m_txtMysqlPassword->lineEdit(), SIGNAL(textChanged(QString)),
+ this, SLOT(onMysqlPasswordChanged(QString)));
+ connect(m_ui->m_btnMysqlTestSetup, SIGNAL(clicked()),
+ this, SLOT(mysqlTestConnection()));
// Load all settings.
loadGeneral();
@@ -425,14 +434,21 @@ void FormSettings::saveShortcuts() {
void FormSettings::loadDataStorage() {
// Load SQLite.
- m_ui->m_cmbDatabaseDriver->addItem("SQLite", APP_DB_DRIVER_SQLITE);
+ m_ui->m_cmbDatabaseDriver->addItem(
+ tr("SQLite (embedded database)"), APP_DB_DRIVER_SQLITE);
// Load in-memory database status.
m_ui->m_checkSqliteUseInMemoryDatabase->setChecked(Settings::instance()->value(APP_CFG_DB, "use_in_memory_db", false).toBool());
if (QSqlDatabase::isDriverAvailable(APP_DB_DRIVER_MYSQL)) {
// Load MySQL.
- m_ui->m_cmbDatabaseDriver->addItem("MySQL", APP_DB_DRIVER_MYSQL);
+ m_ui->m_cmbDatabaseDriver->addItem(
+ tr("MySQL/MariaDB (dedicated database)"), APP_DB_DRIVER_MYSQL);
+
+ // Setup placeholders.
+ m_ui->m_txtMysqlHostname->lineEdit()->setPlaceholderText(tr("Hostname of your MySQL server"));
+ m_ui->m_txtMysqlUsername->lineEdit()->setPlaceholderText(tr("Username to login with"));
+ m_ui->m_txtMysqlPassword->lineEdit()->setPlaceholderText(tr("Password for your username"));
m_ui->m_txtMysqlHostname->lineEdit()->setText(Settings::instance()->value(APP_CFG_DB, "mysql_hostname").toString());
m_ui->m_txtMysqlUsername->lineEdit()->setText(Settings::instance()->value(APP_CFG_DB, "mysql_username").toString());
@@ -440,7 +456,6 @@ void FormSettings::loadDataStorage() {
m_ui->m_spinMysqlPort->setValue(Settings::instance()->value(APP_CFG_DB, "mysql_port", APP_DB_MYSQL_PORT).toInt());
}
- // TODO: nacist podle nastaveni
m_ui->m_cmbDatabaseDriver->setCurrentIndex(m_ui->m_cmbDatabaseDriver->findData(Settings::instance()->value(APP_CFG_DB,
"database_driver",
APP_DB_DRIVER_SQLITE).toString()));
@@ -477,6 +492,48 @@ void FormSettings::saveDataStorage() {
}
}
+void FormSettings::mysqlTestConnection() {
+ int result = DatabaseFactory::instance()->mysqlTestConnection(m_ui->m_txtMysqlHostname->lineEdit()->text(),
+ m_ui->m_spinMysqlPort->value(),
+ m_ui->m_txtMysqlUsername->lineEdit()->text(),
+ m_ui->m_txtMysqlPassword->lineEdit()->text());
+
+ // TODO: zobrazit výsledek
+}
+
+void FormSettings::onMysqlHostnameChanged(const QString &new_hostname) {
+ if (new_hostname.isEmpty()) {
+ m_ui->m_txtMysqlHostname->setStatus(LineEditWithStatus::Warning,
+ tr("Hostname is empty."));
+ }
+ else {
+ m_ui->m_txtMysqlHostname->setStatus(LineEditWithStatus::Ok,
+ tr("Hostname looks ok."));
+ }
+}
+
+void FormSettings::onMysqlUsernameChanged(const QString &new_username) {
+ if (new_username.isEmpty()) {
+ m_ui->m_txtMysqlUsername->setStatus(LineEditWithStatus::Warning,
+ tr("Username is empty."));
+ }
+ else {
+ m_ui->m_txtMysqlUsername->setStatus(LineEditWithStatus::Ok,
+ tr("Username looks ok."));
+ }
+}
+
+void FormSettings::onMysqlPasswordChanged(const QString &new_password) {
+ if (new_password.isEmpty()) {
+ m_ui->m_txtMysqlPassword->setStatus(LineEditWithStatus::Warning,
+ tr("Password is empty."));
+ }
+ else {
+ m_ui->m_txtMysqlPassword->setStatus(LineEditWithStatus::Ok,
+ tr("Password looks ok."));
+ }
+}
+
void FormSettings::loadGeneral() {
// Load auto-start status.
SystemFactory::AutoStartStatus autostart_status = SystemFactory::instance()->getAutoStartStatus();
diff --git a/src/gui/formsettings.h b/src/gui/formsettings.h
index c6d37a5d8..f83355260 100644
--- a/src/gui/formsettings.h
+++ b/src/gui/formsettings.h
@@ -54,6 +54,10 @@ class FormSettings : public QDialog {
void loadDataStorage();
void saveDataStorage();
+ void mysqlTestConnection();
+ void onMysqlHostnameChanged(const QString &new_hostname);
+ void onMysqlUsernameChanged(const QString &new_username);
+ void onMysqlPasswordChanged(const QString &new_password);
void loadLanguage();
void saveLanguage();
diff --git a/src/gui/formsettings.ui b/src/gui/formsettings.ui
index 1213e3589..9e58b5882 100644
--- a/src/gui/formsettings.ui
+++ b/src/gui/formsettings.ui
@@ -14,76 +14,10 @@
Settings
- -
-
-
-
- 220
- 0
-
-
-
-
- 220
- 16777215
-
-
-
- false
-
-
- false
-
-
- QListView::Static
-
-
- false
-
-
- 0
-
-
-
-
- General
-
-
- -
-
- Data storage
-
-
- -
-
- Keyboard shortcuts
-
-
- -
-
- User interface
-
-
- -
-
- Language
-
-
- -
-
- Web browser & proxy
-
-
- -
-
- Feeds & messages
-
-
-
-
-
- 1
+ 0
@@ -125,7 +59,7 @@
-
- WARNING: Note that switching to another data storage type will NOT preserve your data from currently active data storage.
+ WARNING: Note that switching to another data storage type will NOT copy existing your data from currently active data storage to newly selected one.
Qt::AlignCenter
@@ -148,7 +82,7 @@
-
- 1
+ 0
@@ -276,6 +210,33 @@ Authors of this application are NOT responsible for lost data.
-
+ -
+
+
-
+
+
+ Test setup
+
+
+ false
+
+
+
+ -
+
+
+ Qt::Horizontal
+
+
+
+ 40
+ 20
+
+
+
+
+
+
@@ -309,8 +270,8 @@ Authors of this application are NOT responsible for lost data.
0
0
- 100
- 30
+ 564
+ 363
@@ -1056,6 +1017,72 @@ Authors of this application are NOT responsible for lost data.
+ -
+
+
+
+ 220
+ 0
+
+
+
+
+ 220
+ 16777215
+
+
+
+ false
+
+
+ false
+
+
+ QListView::Static
+
+
+ false
+
+
+ 0
+
+
-
+
+ General
+
+
+ -
+
+ Data storage
+
+
+ -
+
+ Keyboard shortcuts
+
+
+ -
+
+ User interface
+
+
+ -
+
+ Language
+
+
+ -
+
+ Web browser & proxy
+
+
+ -
+
+ Feeds & messages
+
+
+
+