Local changes.

This commit is contained in:
Martin Rotter 2015-04-06 18:59:02 +02:00
commit d88bce20cf
10 changed files with 48 additions and 45 deletions

View File

@ -264,7 +264,6 @@ bool FeedsModel::removeItem(const QModelIndex &index) {
endRemoveRows(); endRemoveRows();
delete deleting_item; delete deleting_item;
return true; return true;
} }
} }

0
src/core/feedsmodelrecyclebin.cpp Normal file → Executable file
View File

0
src/core/feedsmodelrecyclebin.h Normal file → Executable file
View File

View File

@ -171,7 +171,7 @@ void FeedsView::updateAllFeeds() {
} }
else { else {
qApp->showGuiMessage(tr("Cannot update all items"), qApp->showGuiMessage(tr("Cannot update all items"),
tr("You cannot update all items because another feed update is ongoing."), tr("You cannot update all items because another another critical operation is ongoing."),
QSystemTrayIcon::Warning, qApp->mainForm()); QSystemTrayIcon::Warning, qApp->mainForm());
} }
} }
@ -189,7 +189,7 @@ void FeedsView::updateSelectedFeeds() {
} }
else { else {
qApp->showGuiMessage(tr("Cannot update selected items"), qApp->showGuiMessage(tr("Cannot update selected items"),
tr("You cannot update selected items because another feed update is ongoing."), tr("You cannot update selected items because another critical operation is ongoing."),
QSystemTrayIcon::Warning, qApp->mainForm()); QSystemTrayIcon::Warning, qApp->mainForm());
} }
} }
@ -258,7 +258,7 @@ void FeedsView::addNewCategory() {
// it is used probably by feed updater or application // it is used probably by feed updater or application
// is quitting. // is quitting.
qApp->showGuiMessage(tr("Cannot add standard category"), qApp->showGuiMessage(tr("Cannot add standard category"),
tr("You cannot add new standard category now because feed update is ongoing."), tr("You cannot add new standard category now because another critical operation is ongoing."),
QSystemTrayIcon::Warning, qApp->mainForm()); QSystemTrayIcon::Warning, qApp->mainForm());
return; return;
} }
@ -287,7 +287,7 @@ void FeedsView::addNewFeed() {
// it is used probably by feed updater or application // it is used probably by feed updater or application
// is quitting. // is quitting.
qApp->showGuiMessage(tr("Cannot add standard feed"), qApp->showGuiMessage(tr("Cannot add standard feed"),
tr("You cannot add new standard feed now because feed update is ongoing."), tr("You cannot add new standard feed now because another critical operation is ongoing."),
QSystemTrayIcon::Warning, qApp->mainForm()); QSystemTrayIcon::Warning, qApp->mainForm());
return; return;
} }
@ -328,7 +328,6 @@ void FeedsView::receiveMessageCountsChange(MessagesModel::MessageMode mode,
// total counts. // total counts.
// b) total count of message was not changed - some messages switched state --> we need to update // b) total count of message was not changed - some messages switched state --> we need to update
// counts of just selected feeds. // counts of just selected feeds.
if (mode == MessagesModel::MessagesFromRecycleBin) { if (mode == MessagesModel::MessagesFromRecycleBin) {
if (total_msg_count_changed) { if (total_msg_count_changed) {
if (any_msg_restored) { if (any_msg_restored) {
@ -353,7 +352,7 @@ void FeedsView::editSelectedItem() {
// it is used probably by feed updater or application // it is used probably by feed updater or application
// is quitting. // is quitting.
qApp->showGuiMessage(tr("Cannot edit item"), qApp->showGuiMessage(tr("Cannot edit item"),
tr("Selected item cannot be edited because feed update is ongoing."), tr("Selected item cannot be edited because another critical operation is ongoing."),
QSystemTrayIcon::Warning, qApp->mainForm()); QSystemTrayIcon::Warning, qApp->mainForm());
// Thus, cannot delete and quit the method. // Thus, cannot delete and quit the method.
@ -380,7 +379,7 @@ void FeedsView::deleteSelectedItem() {
// it is used probably by feed updater or application // it is used probably by feed updater or application
// is quitting. // is quitting.
qApp->showGuiMessage(tr("Cannot delete item"), qApp->showGuiMessage(tr("Cannot delete item"),
tr("Selected item cannot be deleted because feed update is ongoing."), tr("Selected item cannot be deleted because another critical operation is ongoing."),
QSystemTrayIcon::Warning, qApp->mainForm()); QSystemTrayIcon::Warning, qApp->mainForm());
// Thus, cannot delete and quit the method. // Thus, cannot delete and quit the method.
@ -462,15 +461,12 @@ void FeedsView::emptyRecycleBin() {
if (MessageBox::show(qApp->mainForm(), QMessageBox::Question, tr("Permanently delete messages"), if (MessageBox::show(qApp->mainForm(), QMessageBox::Question, tr("Permanently delete messages"),
tr("You are about to permanenty delete all messages from your recycle bin."), tr("You are about to permanenty delete all messages from your recycle bin."),
tr("Do you really want to empty your recycle bin?"), tr("Do you really want to empty your recycle bin?"),
QString(), QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes) == QMessageBox::No) { QString(), QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes) == QMessageBox::Yes) {
// User changed his mind.
return;
}
m_sourceModel->recycleBin()->empty(); m_sourceModel->recycleBin()->empty();
updateCountsOfSelectedFeeds(true); updateCountsOfSelectedFeeds(true);
emit feedsNeedToBeReloaded(1); emit feedsNeedToBeReloaded(1);
}
} }
void FeedsView::restoreRecycleBin() { void FeedsView::restoreRecycleBin() {
@ -637,7 +633,6 @@ void FeedsView::selectionChanged(const QItemSelection &selected, const QItemSele
foreach (FeedsModelFeed *feed, selected_feeds) { foreach (FeedsModelFeed *feed, selected_feeds) {
#if defined(DEBUG) #if defined(DEBUG)
QModelIndex index_for_feed = m_sourceModel->indexForItem(feed); QModelIndex index_for_feed = m_sourceModel->indexForItem(feed);
qDebug("Selecting feed '%s' (source index [%d, %d]).", qPrintable(feed->title()), index_for_feed.row(), index_for_feed.column()); qDebug("Selecting feed '%s' (source index [%d, %d]).", qPrintable(feed->title()), index_for_feed.row(), index_for_feed.column());
#endif #endif

View File

@ -19,6 +19,7 @@
#include "miscellaneous/iconfactory.h" #include "miscellaneous/iconfactory.h"
#include "miscellaneous/textfactory.h" #include "miscellaneous/textfactory.h"
#include "miscellaneous/settingsproperties.h"
#if !defined(Q_OS_WIN) #if !defined(Q_OS_WIN)
#include "gui/messagebox.h" #include "gui/messagebox.h"
@ -104,7 +105,7 @@ FormAbout::FormAbout(QWidget *parent) : QDialog(parent), m_ui(new Ui::FormAbout)
APP_NAME)); APP_NAME));
// Load additional paths information. // Load additional paths information.
if (qApp->settings()->type() == SettingsType::Portable) { if (qApp->settings()->type() == SettingsProperties::Portable) {
m_ui->m_txtPathsSettingsType->setText(tr("FULLY portable")); m_ui->m_txtPathsSettingsType->setText(tr("FULLY portable"));
m_ui->m_txtPathsDatabaseRoot->setText(QDir::toNativeSeparators(qApp->applicationDirPath() + QDir::separator() + QString(APP_DB_SQLITE_PATH))); m_ui->m_txtPathsDatabaseRoot->setText(QDir::toNativeSeparators(qApp->applicationDirPath() + QDir::separator() + QString(APP_DB_SQLITE_PATH)));
} }

View File

@ -346,7 +346,9 @@ Authors of this application are NOT responsible for lost data.</string>
<item row="5" column="0" colspan="2"> <item row="5" column="0" colspan="2">
<widget class="QLabel" name="m_lblMysqlInfo"> <widget class="QLabel" name="m_lblMysqlInfo">
<property name="text"> <property name="text">
<string>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.</string> <string>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.
MySQL backend will automatically use database with name &quot;rssguard&quot;. Do not create this database manually, let this application to handle it by itself. Therefore, given user must have rights to created and deleted databases.</string>
</property> </property>
<property name="alignment"> <property name="alignment">
<set>Qt::AlignCenter</set> <set>Qt::AlignCenter</set>

View File

@ -114,7 +114,7 @@ void DatabaseFactory::finishRestoration() {
} }
void DatabaseFactory::sqliteAssemblyDatabaseFilePath() { void DatabaseFactory::sqliteAssemblyDatabaseFilePath() {
if (qApp->settings()->type() == SettingsType::Portable) { if (qApp->settings()->type() == SettingsProperties::Portable) {
m_sqliteDatabaseFilePath = qApp->applicationDirPath() + QDir::separator() + QString(APP_DB_SQLITE_PATH); m_sqliteDatabaseFilePath = qApp->applicationDirPath() + QDir::separator() + QString(APP_DB_SQLITE_PATH);
} }
else { else {
@ -248,9 +248,7 @@ QSqlDatabase DatabaseFactory::sqliteInitializeFileBasedDatabase(const QString &c
query_db.exec("PRAGMA temp_store = MEMORY"); query_db.exec("PRAGMA temp_store = MEMORY");
// Sample query which checks for existence of tables. // Sample query which checks for existence of tables.
query_db.exec("SELECT inf_value FROM Information WHERE inf_key = 'schema_version'"); if (!query_db.exec("SELECT inf_value FROM Information WHERE inf_key = 'schema_version'")) {
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_SQLITE_INIT); QFile file_init(APP_MISC_PATH + QDir::separator() + APP_DB_SQLITE_INIT);
@ -262,8 +260,7 @@ QSqlDatabase DatabaseFactory::sqliteInitializeFileBasedDatabase(const QString &c
qPrintable(APP_MISC_PATH)); qPrintable(APP_MISC_PATH));
} }
QStringList statements = QString(file_init.readAll()).split(APP_DB_COMMENT_SPLIT, QStringList statements = QString(file_init.readAll()).split(APP_DB_COMMENT_SPLIT, QString::SkipEmptyParts);
QString::SkipEmptyParts);
database.transaction(); database.transaction();
foreach(const QString &statement, statements) { foreach(const QString &statement, statements) {
@ -403,8 +400,7 @@ bool DatabaseFactory::mysqlUpdateDatabaseSchema(QSqlDatabase database, const QSt
return true; return true;
} }
QSqlDatabase DatabaseFactory::connection(const QString &connection_name, QSqlDatabase DatabaseFactory::connection(const QString &connection_name, DesiredType desired_type) {
DesiredType desired_type) {
switch (m_activeDatabaseDriver) { switch (m_activeDatabaseDriver) {
case MYSQL: case MYSQL:
return mysqlConnection(connection_name); return mysqlConnection(connection_name);
@ -534,12 +530,10 @@ QSqlDatabase DatabaseFactory::mysqlInitializeDatabase(const QString &connection_
} }
else { else {
QSqlQuery query_db(database); QSqlQuery query_db(database);
query_db.setForwardOnly(true); 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("USE rssguard") || !query_db.exec("SELECT inf_value FROM Information WHERE inf_key = 'schema_version'")) {
// If no "rssguard" database exists // If no "rssguard" database exists 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_MYSQL_INIT); QFile file_init(APP_MISC_PATH + QDir::separator() + APP_DB_MYSQL_INIT);
@ -567,10 +561,21 @@ QSqlDatabase DatabaseFactory::mysqlInitializeDatabase(const QString &connection_
qDebug("MySQL database backend should be ready now."); qDebug("MySQL database backend should be ready now.");
} }
else { else {
// Database was previously initialized. Now just check the schema version.
query_db.next(); query_db.next();
qDebug("MySQL database connection '%s' seems to be established.", qPrintable(connection_name)); QString installed_db_schema = query_db.value(0).toString();
qDebug("MySQL database has version '%s'.", qPrintable(query_db.value(0).toString()));
if (!mysqlUpdateDatabaseSchema(database, installed_db_schema)) {
qFatal("Database schema was not updated from '%s' to '%s' successully.",
qPrintable(installed_db_schema),
APP_DB_SCHEMA_VERSION);
}
else {
qDebug("Database schema was updated from '%s' to '%s' successully or it is already up to date.",
qPrintable(installed_db_schema),
APP_DB_SCHEMA_VERSION);
}
} }
query_db.finish(); query_db.finish();

View File

@ -238,7 +238,7 @@ DVALUE(bool) Browser::QueueTabsDef = true;
// Categories. // Categories.
DKEY Categories::ID = "categories_expand_states"; DKEY Categories::ID = "categories_expand_states";
Settings::Settings(const QString &file_name, Format format, const SettingsType &status, QObject *parent) Settings::Settings(const QString &file_name, Format format, const SettingsProperties::SettingsType &status, QObject *parent)
: QSettings(file_name, format, parent), m_initializationStatus(status) { : QSettings(file_name, format, parent), m_initializationStatus(status) {
} }
@ -298,7 +298,7 @@ Settings *Settings::setupSettings(QObject *parent) {
QWebSettings::setIconDatabasePath(web_path); QWebSettings::setIconDatabasePath(web_path);
// Check if portable settings are available. // Check if portable settings are available.
if (properties.m_type == SettingsType::Portable) { if (properties.m_type == SettingsProperties::Portable) {
qDebug("Initializing settings in '%s' (portable way).", qPrintable(QDir::toNativeSeparators(properties.m_absoluteSettingsFileName))); qDebug("Initializing settings in '%s' (portable way).", qPrintable(QDir::toNativeSeparators(properties.m_absoluteSettingsFileName)));
} }
else { else {
@ -325,11 +325,11 @@ SettingsProperties Settings::determineProperties() {
bool will_we_use_portable_settings = portable_settings_available && !non_portable_settings_exist; bool will_we_use_portable_settings = portable_settings_available && !non_portable_settings_exist;
if (will_we_use_portable_settings) { if (will_we_use_portable_settings) {
properties.m_type = SettingsType::Portable; properties.m_type = SettingsProperties::Portable;
properties.m_baseDirectory = app_path; properties.m_baseDirectory = app_path;
} }
else { else {
properties.m_type = SettingsType::NonPortable; properties.m_type = SettingsProperties::NonPortable;
properties.m_baseDirectory = home_path; properties.m_baseDirectory = home_path;
} }

View File

@ -272,7 +272,7 @@ class Settings : public QSettings {
virtual ~Settings(); virtual ~Settings();
// Type of used settings. // Type of used settings.
inline SettingsType type() const { inline SettingsProperties::SettingsType type() const {
return m_initializationStatus; return m_initializationStatus;
} }
@ -313,9 +313,9 @@ class Settings : public QSettings {
private: private:
// Constructor. // Constructor.
explicit Settings(const QString &file_name, Format format, const SettingsType &type, QObject *parent = 0); explicit Settings(const QString &file_name, Format format, const SettingsProperties::SettingsType &type, QObject *parent = 0);
SettingsType m_initializationStatus; SettingsProperties::SettingsType m_initializationStatus;
}; };
#endif // SETTINGS_H #endif // SETTINGS_H

View File

@ -5,13 +5,14 @@
// Describes possible types of loaded settings. // Describes possible types of loaded settings.
enum SettingsType {
Portable,
NonPortable
};
// Describes characteristics of settings. // Describes characteristics of settings.
struct SettingsProperties { struct SettingsProperties {
enum SettingsType {
Portable,
NonPortable
};
SettingsType m_type; SettingsType m_type;
QString m_baseDirectory; QString m_baseDirectory;
QString m_settingsSuffix; QString m_settingsSuffix;