diff --git a/resources/misc/db_init_mysql.sql b/resources/misc/db_init_mysql.sql
index 5d0e9e905..547dbf9e5 100644
--- a/resources/misc/db_init_mysql.sql
+++ b/resources/misc/db_init_mysql.sql
@@ -1,8 +1,8 @@
-DROP DATABASE IF EXISTS rssguard;
+DROP DATABASE IF EXISTS ##;
-- !
-CREATE DATABASE IF NOT EXISTS rssguard CHARACTER SET utf8 COLLATE utf8_general_ci;
+CREATE DATABASE IF NOT EXISTS ## CHARACTER SET utf8 COLLATE utf8_general_ci;
-- !
-USE rssguard;
+USE ##;
-- !
DROP TABLE IF EXISTS Information;
-- !
diff --git a/resources/text/CHANGELOG b/resources/text/CHANGELOG
index ee0ed61f5..b7ddc3309 100644
--- a/resources/text/CHANGELOG
+++ b/resources/text/CHANGELOG
@@ -8,6 +8,7 @@ Fixed:
Added:
+- User now can specify MySQL target database by name. (issue #107)
- Automatic detection of feeds on websites. User loads website and can add feeds via custom web browser toolbar button. (issue #47)
- Better format for logged messages. Logging to file is possible via "rssguard 2> log.txt" command.
- Full support for podcasts (issue #81). Supports RSS 2.0 podcasts and ATOM 1.0 podcasts. In ATOM, RSS Guard is able to fetch multiple podcasts per message. Podcasts are displayed as additional URL addresses in message preview panel.
diff --git a/src/gui/formsettings.cpp b/src/gui/formsettings.cpp
index be504d95c..2d0c50867 100755
--- a/src/gui/formsettings.cpp
+++ b/src/gui/formsettings.cpp
@@ -123,6 +123,7 @@ FormSettings::FormSettings(QWidget *parent) : QDialog(parent), m_ui(new Ui::Form
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_txtMysqlDatabase->lineEdit(), SIGNAL(textChanged(QString)), this, SLOT(onMysqlDatabaseChanged(QString)));
connect(m_ui->m_btnMysqlTestSetup, SIGNAL(clicked()), this, SLOT(mysqlTestConnection()));
connect(m_ui->m_spinMysqlPort, SIGNAL(editingFinished()), this, SLOT(onMysqlDataStorageEdited()));
connect(m_ui->m_txtMysqlHostname->lineEdit(), SIGNAL(textEdited(QString)), this, SLOT(onMysqlDataStorageEdited()));
@@ -484,6 +485,7 @@ void FormSettings::loadDataStorage() {
onMysqlHostnameChanged(QString());
onMysqlUsernameChanged(QString());
onMysqlPasswordChanged(QString());
+ onMysqlDatabaseChanged(QString());
// Load MySQL.
m_ui->m_cmbDatabaseDriver->addItem(tr("MySQL/MariaDB (dedicated database)"), APP_DB_MYSQL_DRIVER);
@@ -492,10 +494,12 @@ void FormSettings::loadDataStorage() {
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_txtMysqlDatabase->lineEdit()->setPlaceholderText(tr("Working database which you have full access to."));
m_ui->m_txtMysqlHostname->lineEdit()->setText(settings->value(GROUP(Database), SETTING(Database::MySQLHostname)).toString());
m_ui->m_txtMysqlUsername->lineEdit()->setText(settings->value(GROUP(Database), SETTING(Database::MySQLUsername)).toString());
m_ui->m_txtMysqlPassword->lineEdit()->setText(settings->value(GROUP(Database), SETTING(Database::MySQLPassword)).toString());
+ m_ui->m_txtMysqlDatabase->lineEdit()->setText(settings->value(GROUP(Database), SETTING(Database::MySQLDatabase)).toString());
m_ui->m_spinMysqlPort->setValue(settings->value(GROUP(Database), SETTING(Database::MySQLPort)).toInt());
m_ui->m_checkMysqlShowPassword->setChecked(false);
@@ -531,6 +535,7 @@ void FormSettings::saveDataStorage() {
settings->setValue(GROUP(Database), Database::MySQLHostname, m_ui->m_txtMysqlHostname->lineEdit()->text());
settings->setValue(GROUP(Database), Database::MySQLUsername, m_ui->m_txtMysqlUsername->lineEdit()->text());
settings->setValue(GROUP(Database), Database::MySQLPassword, m_ui->m_txtMysqlPassword->lineEdit()->text());
+ settings->setValue(GROUP(Database), Database::MySQLDatabase, m_ui->m_txtMysqlDatabase->lineEdit()->text());
settings->setValue(GROUP(Database), Database::MySQLPort, m_ui->m_spinMysqlPort->value());
}
@@ -545,10 +550,12 @@ void FormSettings::saveDataStorage() {
void FormSettings::mysqlTestConnection() {
DatabaseFactory::MySQLError error_code = qApp->database()->mysqlTestConnection(m_ui->m_txtMysqlHostname->lineEdit()->text(),
m_ui->m_spinMysqlPort->value(),
+ m_ui->m_txtMysqlDatabase->lineEdit()->text(),
m_ui->m_txtMysqlUsername->lineEdit()->text(),
m_ui->m_txtMysqlPassword->lineEdit()->text());
QString interpretation = qApp->database()->mysqlInterpretErrorCode(error_code);
+
switch (error_code) {
case DatabaseFactory::MySQLOk:
m_ui->m_lblMysqlTestResult->setStatus(WidgetWithStatus::Ok, interpretation, interpretation);
@@ -587,6 +594,15 @@ void FormSettings::onMysqlPasswordChanged(const QString &new_password) {
}
}
+void FormSettings::onMysqlDatabaseChanged(const QString &new_database) {
+ if (new_database.isEmpty()) {
+ m_ui->m_txtMysqlDatabase->setStatus(LineEditWithStatus::Warning, tr("Working database is empty."));
+ }
+ else {
+ m_ui->m_txtMysqlDatabase->setStatus(LineEditWithStatus::Ok, tr("Working database is ok."));
+ }
+}
+
void FormSettings::onMysqlDataStorageEdited() {
m_initialSettings.m_dataStorageDataChanged = true;
}
diff --git a/src/gui/formsettings.h b/src/gui/formsettings.h
index 5d3b4d619..9c506fb79 100644
--- a/src/gui/formsettings.h
+++ b/src/gui/formsettings.h
@@ -75,6 +75,7 @@ class FormSettings : public QDialog {
void onMysqlHostnameChanged(const QString &new_hostname);
void onMysqlUsernameChanged(const QString &new_username);
void onMysqlPasswordChanged(const QString &new_password);
+ void onMysqlDatabaseChanged(const QString &new_database);
void onMysqlDataStorageEdited();
void selectSqlBackend(int index);
void switchMysqlPasswordVisiblity(bool visible);
diff --git a/src/gui/formsettings.ui b/src/gui/formsettings.ui
index 1e20206b0..81c93fd40 100644
--- a/src/gui/formsettings.ui
+++ b/src/gui/formsettings.ui
@@ -290,7 +290,7 @@ Authors of this application are NOT responsible for lost data.
- -
+
-
Username
@@ -300,10 +300,10 @@ Authors of this application are NOT responsible for lost data.
- -
+
-
- -
+
-
Password
@@ -313,10 +313,10 @@ Authors of this application are NOT responsible for lost data.
- -
+
-
- -
+
-
-
@@ -343,7 +343,7 @@ Authors of this application are NOT responsible for lost data.
- -
+
-
Note that speed of used MySQL server and latency of used connection medium HEAVILY influences the final performance of this application. Using slow database connections leads to bad performance when browsing feeds or messages.
@@ -361,7 +361,7 @@ MySQL backend will automatically use database with name "rssguard". Do
- -
+
-
&Show password
@@ -371,6 +371,16 @@ MySQL backend will automatically use database with name "rssguard". Do
+ -
+
+
+ -
+
+
+ Working database
+
+
+
@@ -404,8 +414,8 @@ MySQL backend will automatically use database with name "rssguard". Do
0
0
- 740
- 448
+ 100
+ 30
@@ -481,9 +491,9 @@ MySQL backend will automatically use database with name "rssguard". Do
0
- 0
+ 0
208
- 238
+ 238
@@ -1428,6 +1438,65 @@ MySQL backend will automatically use database with name "rssguard". Do
1
+
+ m_cmbDatabaseDriver
+ m_spinMysqlPort
+ m_checkMysqlShowPassword
+ m_btnMysqlTestSetup
+ m_listSettings
+ m_checkSqliteUseInMemoryDatabase
+ m_checkAutostart
+ m_checkRemoveTrolltechJunk
+ m_checkForUpdatesOnStart
+ m_scrollShortcuts
+ m_tabUi
+ m_scrollIconSkins
+ m_cmbIconTheme
+ m_treeSkins
+ m_radioTrayOff
+ m_checkHideWhenMinimized
+ m_checkHidden
+ m_radioTrayOn
+ m_checkNewTabDoubleClick
+ m_hideTabBarIfOneTabVisible
+ m_checkCloseTabsDoubleClick
+ m_checkCloseTabsMiddleClick
+ m_cmbToolbarButtonStyle
+ m_cmbSelectToolBar
+ m_treeLanguages
+ m_tabBrowserProxy
+ m_checkQueueTabs
+ m_checkEnableJavascript
+ m_checkEnablePlugins
+ m_checkAutoLoadImages
+ m_checkMouseGestures
+ m_grpCustomExternalBrowser
+ m_txtExternalBrowserExecutable
+ m_btnExternalBrowserExecutable
+ m_txtExternalBrowserArguments
+ m_cmbExternalBrowserPreset
+ m_cmbProxyType
+ m_txtProxyHost
+ m_spinProxyPort
+ m_txtProxyUsername
+ m_txtProxyPassword
+ m_checkShowPassword
+ m_tabFeedsMessages
+ m_checkUpdateAllFeedsOnStartup
+ m_checkAutoUpdate
+ m_spinAutoUpdateInterval
+ m_spinFeedUpdateTimeout
+ m_cmbCountsFeedList
+ m_checkRemoveReadMessagesOnExit
+ m_checkKeppMessagesInTheMiddle
+ m_checkMessagesDateTimeFormat
+ m_cmbMessagesDateTimeFormat
+ m_checkRemoveDuplicateMessages
+ m_rbDownloadsAskEachFile
+ m_rbDownloadsSaveAllIntoDirectory
+ m_txtDownloadsTargetDirectory
+ m_btnDownloadsTargetDirectory
+
diff --git a/src/miscellaneous/databasefactory.cpp b/src/miscellaneous/databasefactory.cpp
index 2ebe6b9ab..2137599d7 100755
--- a/src/miscellaneous/databasefactory.cpp
+++ b/src/miscellaneous/databasefactory.cpp
@@ -38,7 +38,7 @@ DatabaseFactory::DatabaseFactory(QObject *parent)
DatabaseFactory::~DatabaseFactory() {
}
-DatabaseFactory::MySQLError DatabaseFactory::mysqlTestConnection(const QString &hostname, int port,
+DatabaseFactory::MySQLError DatabaseFactory::mysqlTestConnection(const QString &hostname, int port, const QString &w_database,
const QString &username, const QString &password) {
QSqlDatabase database = QSqlDatabase::addDatabase(APP_DB_MYSQL_DRIVER, APP_DB_MYSQL_TEST);
@@ -46,6 +46,7 @@ DatabaseFactory::MySQLError DatabaseFactory::mysqlTestConnection(const QString &
database.setPort(port);
database.setUserName(username);
database.setPassword(password);
+ database.setDatabaseName(w_database);
if (database.open()) {
// Connection succeeded, clean up the mess and return OK status.
@@ -65,6 +66,9 @@ QString DatabaseFactory::mysqlInterpretErrorCode(MySQLError error_code) {
case MySQLOk:
return tr("MySQL server works as expected.");
+ case MySQLUnknownDatabase:
+ return tr("Selected database does not exist (yet).");
+
case MySQLCantConnect:
case MySQLConnectionError:
case MySQLUnknownHost:
@@ -498,7 +502,7 @@ QSqlDatabase DatabaseFactory::mysqlConnection(const QString &connection_name) {
database.setPort(qApp->settings()->value(GROUP(Database), SETTING(Database::MySQLPort)).toInt());
database.setUserName(qApp->settings()->value(GROUP(Database), SETTING(Database::MySQLUsername)).toString());
database.setPassword(qApp->settings()->value(GROUP(Database), SETTING(Database::MySQLPassword)).toString());
- database.setDatabaseName(APP_LOW_NAME);
+ database.setDatabaseName(qApp->settings()->value(GROUP(Database), SETTING(Database::MySQLDatabase)).toString());
}
if (!database.isOpen() && !database.open()) {
@@ -518,6 +522,7 @@ QSqlDatabase DatabaseFactory::mysqlConnection(const QString &connection_name) {
QSqlDatabase DatabaseFactory::mysqlInitializeDatabase(const QString &connection_name) {
// Folders are created. Create new QSQLDatabase object.
QSqlDatabase database = QSqlDatabase::addDatabase(APP_DB_MYSQL_DRIVER, connection_name);
+ QString database_name = qApp->settings()->value(GROUP(Database), SETTING(Database::MySQLDatabase)).toString();
database.setHostName(qApp->settings()->value(GROUP(Database), SETTING(Database::MySQLHostname)).toString());
database.setPort(qApp->settings()->value(GROUP(Database), SETTING(Database::MySQLPort)).toInt());
@@ -532,7 +537,7 @@ QSqlDatabase DatabaseFactory::mysqlInitializeDatabase(const QString &connection_
QSqlQuery query_db(database);
query_db.setForwardOnly(true);
- if (!query_db.exec("USE rssguard") || !query_db.exec("SELECT inf_value FROM Information WHERE inf_key = 'schema_version'")) {
+ if (!query_db.exec(QString("USE %1").arg(database_name)) || !query_db.exec("SELECT inf_value FROM Information WHERE inf_key = 'schema_version'")) {
// If no "rssguard" database exists or schema version is wrong, then initialize it.
qWarning("Error occurred. MySQL database is not initialized. Initializing now.");
@@ -548,8 +553,9 @@ QSqlDatabase DatabaseFactory::mysqlInitializeDatabase(const QString &connection_
QStringList statements = QString(file_init.readAll()).split(APP_DB_COMMENT_SPLIT, QString::SkipEmptyParts);
database.transaction();
- foreach(const QString &statement, statements) {
- query_db.exec(statement);
+ foreach(QString statement, statements) {
+ // Assign real database name and run the query.
+ query_db.exec(statement.replace("##", database_name));
if (query_db.lastError().isValid()) {
qFatal("MySQL database initialization failed. Initialization script '%s' is not correct. Error : '%s'.",
diff --git a/src/miscellaneous/databasefactory.h b/src/miscellaneous/databasefactory.h
index c1f29f047..ebb675637 100755
--- a/src/miscellaneous/databasefactory.h
+++ b/src/miscellaneous/databasefactory.h
@@ -42,11 +42,12 @@ class DatabaseFactory : public QObject {
// Describes possible MySQL-specific errors.
enum MySQLError {
- MySQLOk = 0,
- MySQLAccessDenied = 1045,
- MySQLConnectionError = 2002,
- MySQLCantConnect = 2003,
- MySQLUnknownHost = 2005
+ MySQLOk = 0,
+ MySQLAccessDenied = 1045,
+ MySQLUnknownDatabase = 1049,
+ MySQLConnectionError = 2002,
+ MySQLCantConnect = 2003,
+ MySQLUnknownHost = 2005
};
//
@@ -95,7 +96,8 @@ class DatabaseFactory : public QObject {
// Tests if database connection with given data
// can be established and returns 0 if it can.
// Otherwise returns MySQL-specific error code.
- MySQLError mysqlTestConnection(const QString &hostname, int port, const QString &username, const QString &password);
+ MySQLError mysqlTestConnection(const QString &hostname, int port, const QString &w_database,
+ const QString &username, const QString &password);
// Interprets MySQL error code.
QString mysqlInterpretErrorCode(MySQLError error_code);
diff --git a/src/miscellaneous/settings.cpp b/src/miscellaneous/settings.cpp
index 983e0b959..a4d635a78 100755
--- a/src/miscellaneous/settings.cpp
+++ b/src/miscellaneous/settings.cpp
@@ -199,6 +199,9 @@ DVALUE(char*) Database::MySQLUsernameDef = "";
DKEY Database::MySQLPassword = "mysql_password";
DVALUE(char*) Database::MySQLPasswordDef = "";
+DKEY Database::MySQLDatabase = "mysql_database";
+DVALUE(char*) Database::MySQLDatabaseDef = APP_LOW_NAME;
+
DKEY Database::MySQLPort = "mysql_port";
DVALUE(int) Database::MySQLPortDef = APP_DB_MYSQL_PORT;
diff --git a/src/miscellaneous/settings.h b/src/miscellaneous/settings.h
index 234129fa4..4b1d16e40 100755
--- a/src/miscellaneous/settings.h
+++ b/src/miscellaneous/settings.h
@@ -221,6 +221,9 @@ namespace Database {
KEY MySQLPort;
VALUE(int) MySQLPortDef;
+ KEY MySQLDatabase;
+ VALUE(char*) MySQLDatabaseDef;
+
KEY ActiveDriver;
VALUE(char*) ActiveDriverDef;
}