From 211494a1d8441bfd701a7ae9ad9a4a126891cc7c Mon Sep 17 00:00:00 2001 From: Martin Rotter Date: Fri, 13 Jan 2017 09:28:09 +0100 Subject: [PATCH] Fixed #70. --- resources/text/CHANGELOG | 1 + src/gui/settings/settingsdatabase.cpp | 4 ++++ src/gui/settings/settingsdatabase.ui | 28 +++++++++++++++++++++++---- src/miscellaneous/databasequeries.cpp | 6 ++++-- src/miscellaneous/settings.cpp | 3 +++ src/miscellaneous/settings.h | 3 +++ 6 files changed, 39 insertions(+), 6 deletions(-) diff --git a/resources/text/CHANGELOG b/resources/text/CHANGELOG index d52182ec2..efcbd956a 100755 --- a/resources/text/CHANGELOG +++ b/resources/text/CHANGELOG @@ -2,6 +2,7 @@ ————— Added: +▪ User now can select if DB transactions are enabled or not. (bug #70) ▪ MySQL database backend now requires at least version 5.5, DB encoding is now changed to utf8mb4 character set. (bug #74) ▪ Height if message attachment image is now configurable, defaults to 36. (issue #69) ▪ All textual contents of all messages are now locally saved in explicit UTF-8 encoding. This is partially because of MySQL backend. We need to keep encoding of data sent to DB and encoding of DB itself in parity. diff --git a/src/gui/settings/settingsdatabase.cpp b/src/gui/settings/settingsdatabase.cpp index 6d88cd982..23833fa6e 100755 --- a/src/gui/settings/settingsdatabase.cpp +++ b/src/gui/settings/settingsdatabase.cpp @@ -32,6 +32,7 @@ SettingsDatabase::SettingsDatabase(Settings *settings, QWidget *parent) connect(m_ui->m_txtMysqlDatabase->lineEdit(), &QLineEdit::textChanged, this, &SettingsDatabase::dirtifySettings); connect(m_ui->m_txtMysqlHostname->lineEdit(), &QLineEdit::textChanged, this, &SettingsDatabase::dirtifySettings); connect(m_ui->m_txtMysqlPassword->lineEdit(), &QLineEdit::textChanged, this, &SettingsDatabase::dirtifySettings); + connect(m_ui->m_checkUseTransactions, &QCheckBox::toggled, this, &SettingsDatabase::dirtifySettings); connect(m_ui->m_txtMysqlUsername->lineEdit(), &QLineEdit::textChanged, this, &SettingsDatabase::dirtifySettings); connect(m_ui->m_spinMysqlPort, static_cast(&QSpinBox::valueChanged), this, &SettingsDatabase::dirtifySettings); @@ -133,6 +134,7 @@ void SettingsDatabase::switchMysqlPasswordVisiblity(bool visible) { void SettingsDatabase::loadSettings() { onBeginLoadSettings(); + m_ui->m_checkUseTransactions->setChecked(qApp->settings()->value(GROUP(Database), SETTING(Database::UseTransactions)).toBool()); m_ui->m_lblMysqlTestResult->setStatus(WidgetWithStatus::Information, tr("No connection test triggered so far."), tr("You did not executed any connection test yet.")); // Load SQLite. @@ -181,6 +183,8 @@ void SettingsDatabase::saveSettings() { const bool original_inmemory = settings()->value(GROUP(Database), SETTING(Database::UseInMemory)).toBool(); const bool new_inmemory = m_ui->m_checkSqliteUseInMemoryDatabase->isChecked(); + qApp->settings()->setValue(GROUP(Database), Database::UseTransactions, m_ui->m_checkUseTransactions->isChecked()); + // Save data storage settings. QString original_db_driver = settings()->value(GROUP(Database), SETTING(Database::ActiveDriver)).toString(); QString selected_db_driver = m_ui->m_cmbDatabaseDriver->itemData(m_ui->m_cmbDatabaseDriver->currentIndex()).toString(); diff --git a/src/gui/settings/settingsdatabase.ui b/src/gui/settings/settingsdatabase.ui index 16d148609..301d635ad 100755 --- a/src/gui/settings/settingsdatabase.ui +++ b/src/gui/settings/settingsdatabase.ui @@ -7,7 +7,7 @@ 0 0 558 - 282 + 356 @@ -36,7 +36,20 @@ - + + + + Note that turning this option ON will make saving of new messages FASTER, but it might rarely cause some issues with messages saving. + + + Qt::AlignHCenter|Qt::AlignTop + + + true + + + + Database driver @@ -46,10 +59,10 @@ - + - + 1 @@ -267,6 +280,13 @@ Authors of this application are NOT responsible for lost data. + + + + Use DB transactions when storing downloaded messages + + + diff --git a/src/miscellaneous/databasequeries.cpp b/src/miscellaneous/databasequeries.cpp index e8a915093..1a2e48c1e 100755 --- a/src/miscellaneous/databasequeries.cpp +++ b/src/miscellaneous/databasequeries.cpp @@ -450,6 +450,8 @@ int DatabaseQueries::updateMessages(QSqlDatabase db, return 0; } + bool use_transactions = qApp->settings()->value(GROUP(Database), SETTING(Database::UseTransactions)).toBool(); + // Does not make any difference, since each feed now has // its own "custom ID" (standard feeds have their custom ID equal to primary key ID). int updated_messages = 0; @@ -488,7 +490,7 @@ int DatabaseQueries::updateMessages(QSqlDatabase db, "SET title = :title, is_read = :is_read, is_important = :is_important, url = :url, author = :author, date_created = :date_created, contents = :contents, enclosures = :enclosures " "WHERE id = :id;"); - if (!query_begin_transaction.exec(qApp->database()->obtainBeginTransactionSql())) { + if (use_transactions && !query_begin_transaction.exec(qApp->database()->obtainBeginTransactionSql())) { qCritical("Transaction start for message downloader failed: '%s'.", qPrintable(query_begin_transaction.lastError().text())); return updated_messages; } @@ -624,7 +626,7 @@ int DatabaseQueries::updateMessages(QSqlDatabase db, qWarning("Failed to set custom ID for all messages: '%s'.", qPrintable(db.lastError().text())); } - if (!db.commit()) { + if (use_transactions && !db.commit()) { qCritical("Transaction commit for message downloader failed: '%s'.", qPrintable(db.lastError().text())); db.rollback(); diff --git a/src/miscellaneous/settings.cpp b/src/miscellaneous/settings.cpp index d446607b0..562d72253 100755 --- a/src/miscellaneous/settings.cpp +++ b/src/miscellaneous/settings.cpp @@ -216,6 +216,9 @@ DVALUE(int) Proxy::PortDef = 80; // Database. DKEY Database::ID = "database"; +DKEY Database::UseTransactions = "use_transactions"; +DVALUE(bool) Database::UseTransactionsDef = false; + DKEY Database::UseInMemory = "use_in_memory_db"; DVALUE(bool) Database::UseInMemoryDef = false; diff --git a/src/miscellaneous/settings.h b/src/miscellaneous/settings.h index 4f5a530bc..55c157173 100755 --- a/src/miscellaneous/settings.h +++ b/src/miscellaneous/settings.h @@ -242,6 +242,9 @@ namespace Proxy { namespace Database { KEY ID; + KEY UseTransactions; + VALUE(bool) UseTransactionsDef; + KEY UseInMemory; VALUE(bool) UseInMemoryDef;