This commit is contained in:
Martin Rotter 2014-10-15 21:11:35 +02:00
parent c2e55d45a2
commit ea21a02d60
10 changed files with 124 additions and 5 deletions

View File

@ -3,11 +3,12 @@
Fixed: Fixed:
<ul> <ul>
<li>Fixed #76, #75, #82, #79, #85.</li> <li>Fixed #76, #75, #82, #79, #85 #78</li>
</ul> </ul>
Added: Added:
<ul> <ul>
<li>Settings/database can now experimentally be exported/imported.</li>
<li>Added Swedish localization (thanks to Åke Engelbrektson).</li> <li>Added Swedish localization (thanks to Åke Engelbrektson).</li>
</ul> </ul>

View File

@ -75,7 +75,9 @@
#define FEEDS_VIEW_INDENTATION 10 #define FEEDS_VIEW_INDENTATION 10
#define ACCEPT_HEADER_FOR_FEED_DOWNLOADER "application/atom+xml,application/xml;q=0.9,text/xml;q=0.8,*/*;q=0.7" #define ACCEPT_HEADER_FOR_FEED_DOWNLOADER "application/atom+xml,application/xml;q=0.9,text/xml;q=0.8,*/*;q=0.7"
#define BACKUP_NAME_SETTINGS "config"
#define BACKUP_SUFFIX_SETTINGS ".ini.backup" #define BACKUP_SUFFIX_SETTINGS ".ini.backup"
#define BACKUP_NAME_DATABASE "database"
#define BACKUP_SUFFIX_DATABASE ".db.backup" #define BACKUP_SUFFIX_DATABASE ".db.backup"
#define APP_DB_MYSQL_DRIVER "QMYSQL" #define APP_DB_MYSQL_DRIVER "QMYSQL"

View File

@ -17,6 +17,8 @@
#include "gui/formrestoredatabasesettings.h" #include "gui/formrestoredatabasesettings.h"
#include "gui/messagebox.h"
#include "gui/formmain.h"
#include "miscellaneous/iconfactory.h" #include "miscellaneous/iconfactory.h"
#include "QFileDialog" #include "QFileDialog"
@ -26,11 +28,13 @@ FormRestoreDatabaseSettings::FormRestoreDatabaseSettings(QWidget *parent)
: QDialog(parent), m_ui(new Ui::FormRestoreDatabaseSettings) { : QDialog(parent), m_ui(new Ui::FormRestoreDatabaseSettings) {
m_ui->setupUi(this); m_ui->setupUi(this);
m_btnRestart = m_ui->m_buttonBox->addButton(tr("Restart"), QDialogButtonBox::ApplyRole);
m_ui->m_lblResult->setStatus(WidgetWithStatus::Warning, tr("No operation executed yet."), tr("No operation executed yet."));
setWindowIcon(qApp->icons()->fromTheme("document-import")); setWindowIcon(qApp->icons()->fromTheme("document-import"));
setWindowFlags(Qt::MSWindowsFixedSizeDialogHint | Qt::Dialog | Qt::WindowSystemMenuHint); setWindowFlags(Qt::MSWindowsFixedSizeDialogHint | Qt::Dialog | Qt::WindowSystemMenuHint);
m_ui->m_lblResult->setStatus(WidgetWithStatus::Warning, tr("No operation executed yet."), tr("No operation executed yet.")); connect(m_btnRestart, SIGNAL(clicked()), qApp, SLOT(restart()));
connect(m_ui->m_btnSelectFolder, SIGNAL(clicked()), this, SLOT(selectFolder())); connect(m_ui->m_btnSelectFolder, SIGNAL(clicked()), this, SLOT(selectFolder()));
connect(m_ui->m_groupDatabase, SIGNAL(toggled(bool)), this, SLOT(checkOkButton())); connect(m_ui->m_groupDatabase, SIGNAL(toggled(bool)), this, SLOT(checkOkButton()));
connect(m_ui->m_groupSettings, SIGNAL(toggled(bool)), this, SLOT(checkOkButton())); connect(m_ui->m_groupSettings, SIGNAL(toggled(bool)), this, SLOT(checkOkButton()));
@ -44,10 +48,28 @@ FormRestoreDatabaseSettings::~FormRestoreDatabaseSettings() {
} }
void FormRestoreDatabaseSettings::performRestoration() { void FormRestoreDatabaseSettings::performRestoration() {
// TODO: Pokračovat m_ui->m_buttonBox->button(QDialogButtonBox::Ok)->setEnabled(false);
if (qApp->restoreDatabaseSettings(m_ui->m_groupDatabase->isChecked(),
m_ui->m_groupSettings->isChecked(),
m_ui->m_listDatabase->currentRow() >= 0 ?
m_ui->m_listDatabase->currentItem()->data(Qt::UserRole).toString() :
QString(),
m_ui->m_listSettings->currentRow() >= 0 ?
m_ui->m_listSettings->currentItem()->data(Qt::UserRole).toString() :
QString())) {
m_btnRestart->setEnabled(true);
m_ui->m_lblResult->setStatus(WidgetWithStatus::Ok, tr("Restoration was initiated. Restart to proceed."),
tr("You need to restart application for restoration process to finish."));
}
else {
m_ui->m_lblResult->setStatus(WidgetWithStatus::Error, tr("Restoration was not initiated successfully."),
tr("Database and/or settings were not copied to restoration folder successully."));
}
} }
void FormRestoreDatabaseSettings::checkOkButton() { void FormRestoreDatabaseSettings::checkOkButton() {
m_btnRestart->setEnabled(false);
m_ui->m_buttonBox->button(QDialogButtonBox::Ok)->setEnabled(!m_ui->m_lblSelectFolder->label()->text().isEmpty() && m_ui->m_buttonBox->button(QDialogButtonBox::Ok)->setEnabled(!m_ui->m_lblSelectFolder->label()->text().isEmpty() &&
((m_ui->m_groupDatabase->isChecked() && ((m_ui->m_groupDatabase->isChecked() &&
m_ui->m_listDatabase->currentRow() >= 0) || m_ui->m_listDatabase->currentRow() >= 0) ||

View File

@ -42,6 +42,7 @@ class FormRestoreDatabaseSettings : public QDialog {
private: private:
Ui::FormRestoreDatabaseSettings *m_ui; Ui::FormRestoreDatabaseSettings *m_ui;
QPushButton *m_btnRestart;
}; };
#endif // FORMRESTOREDATABASESETTINGS_H #endif // FORMRESTOREDATABASESETTINGS_H

View File

@ -85,6 +85,21 @@ bool Application::backupDatabaseSettings(bool backup_database, bool backup_setti
return final_result; return final_result;
} }
bool Application::restoreDatabaseSettings(bool restore_database, bool restore_settings,
const QString &source_database_file_path, const QString &source_settings_file_path) {
bool result = true;
if (restore_database) {
result &= qApp->database()->initiateRestoration(source_database_file_path);
}
if (restore_settings) {
result &= qApp->settings()->initiateRestoration(source_settings_file_path);
}
return result;
}
void Application::processExecutionMessage(const QString &message) { void Application::processExecutionMessage(const QString &message) {
qDebug("Received '%s' execution message from another application instance.", qPrintable(message)); qDebug("Received '%s' execution message from another application instance.", qPrintable(message));

View File

@ -146,6 +146,9 @@ class Application : public QtSingleApplication {
} }
bool backupDatabaseSettings(bool backup_database, bool backup_settings, const QString &target_path, const QString &backup_name); bool backupDatabaseSettings(bool backup_database, bool backup_settings, const QString &target_path, const QString &backup_name);
bool restoreDatabaseSettings(bool restore_database, bool restore_settings,
const QString &source_database_file_path = QString(),
const QString &source_settings_file_path = QString());
// Access to application tray icon. Always use this in cooperation with // Access to application tray icon. Always use this in cooperation with
// SystemTrayIcon::isSystemTrayActivated(). // SystemTrayIcon::isSystemTrayActivated().

View File

@ -17,6 +17,7 @@
#include "miscellaneous/databasefactory.h" #include "miscellaneous/databasefactory.h"
#include "miscellaneous/iofactory.h"
#include "miscellaneous/application.h" #include "miscellaneous/application.h"
#include <QDir> #include <QDir>
@ -80,6 +81,41 @@ QString DatabaseFactory::mysqlInterpretErrorCode(MySQLError error_code) {
} }
} }
bool DatabaseFactory::initiateRestoration(const QString &database_backup_file_path) {
switch (m_activeDatabaseDriver) {
case SQLITE:
case SQLITE_MEMORY:
return IOFactory::copyFile(database_backup_file_path,
m_sqliteDatabaseFilePath + QDir::separator() +
BACKUP_NAME_DATABASE + BACKUP_SUFFIX_DATABASE);
default:
return false;
}
}
void DatabaseFactory::finishRestoration() {
// TODO: Finish restoration.
if (m_activeDatabaseDriver != SQLITE && m_activeDatabaseDriver != SQLITE_MEMORY) {
return;
}
QString backup_database_file = m_sqliteDatabaseFilePath + QDir::separator() + BACKUP_NAME_DATABASE + BACKUP_SUFFIX_DATABASE;
if (QFile::exists(backup_database_file)) {
qWarning("Backup database file '%s' was detected. Restoring it.", qPrintable(QDir::toNativeSeparators(backup_database_file)));
if (IOFactory::copyFile(backup_database_file,
m_sqliteDatabaseFilePath + QDir::separator() + APP_DB_SQLITE_FILE)) {
QFile::remove(backup_database_file);
qDebug("Database file was restored successully.");
}
else {
qCritical("Database file was NOT restored due to error when copying the file.");
}
}
}
void DatabaseFactory::sqliteAssemblyDatabaseFilePath() { void DatabaseFactory::sqliteAssemblyDatabaseFilePath() {
if (qApp->settings()->type() == Settings::Portable) { if (qApp->settings()->type() == Settings::Portable) {
m_sqliteDatabaseFilePath = qApp->applicationDirPath() + QDir::separator() + QString(APP_DB_SQLITE_PATH); m_sqliteDatabaseFilePath = qApp->applicationDirPath() + QDir::separator() + QString(APP_DB_SQLITE_PATH);
@ -178,6 +214,8 @@ QSqlDatabase DatabaseFactory::sqliteInitializeInMemoryDatabase() {
} }
QSqlDatabase DatabaseFactory::sqliteInitializeFileBasedDatabase(const QString &connection_name) { QSqlDatabase DatabaseFactory::sqliteInitializeFileBasedDatabase(const QString &connection_name) {
finishRestoration();
// Prepare file paths. // Prepare file paths.
QDir db_path(m_sqliteDatabaseFilePath); QDir db_path(m_sqliteDatabaseFilePath);
QFile db_file(db_path.absoluteFilePath(APP_DB_SQLITE_FILE)); QFile db_file(db_path.absoluteFilePath(APP_DB_SQLITE_FILE));

View File

@ -77,6 +77,11 @@ class DatabaseFactory : public QObject {
// Returns identification of currently active database driver. // Returns identification of currently active database driver.
UsedDriver activeDatabaseDriver() const; UsedDriver activeDatabaseDriver() const;
// Copies selected backup database (file) to active database path.
bool initiateRestoration(const QString &database_backup_file_path);
void finishRestoration();
// //
// SQLITE stuff. // SQLITE stuff.
// //

View File

@ -18,6 +18,7 @@
#include "miscellaneous/settings.h" #include "miscellaneous/settings.h"
#include "miscellaneous/application.h" #include "miscellaneous/application.h"
#include "miscellaneous/iofactory.h"
#include <QDebug> #include <QDebug>
#include <QDir> #include <QDir>
@ -42,6 +43,29 @@ QSettings::Status Settings::checkSettings() {
return status(); return status();
} }
bool Settings::initiateRestoration(const QString &settings_backup_file_path) {
return IOFactory::copyFile(settings_backup_file_path,
QFileInfo(fileName()).absolutePath() + QDir::separator() +
BACKUP_NAME_SETTINGS + BACKUP_SUFFIX_SETTINGS);
}
void Settings::finishRestoration(const QString &desired_settings_file_path) {
QString backup_settings_file = QFileInfo(desired_settings_file_path).absolutePath() + QDir::separator() +
BACKUP_NAME_SETTINGS + BACKUP_SUFFIX_SETTINGS;
if (QFile::exists(backup_settings_file)) {
qWarning("Backup settings file '%s' was detected. Restoring it.", qPrintable(QDir::toNativeSeparators(backup_settings_file)));
if (IOFactory::copyFile(backup_settings_file, desired_settings_file_path)) {
QFile::remove(backup_settings_file);
qDebug("Settings file was restored successully.");
}
else {
qCritical("Settings file was NOT restored due to error when copying the file.");
}
}
}
Settings *Settings::setupSettings(QObject *parent) { Settings *Settings::setupSettings(QObject *parent) {
Settings *new_settings; Settings *new_settings;
@ -63,6 +87,8 @@ Settings *Settings::setupSettings(QObject *parent) {
// Check if portable settings are available. // Check if portable settings are available.
if (will_we_use_portable_settings) { if (will_we_use_portable_settings) {
finishRestoration(app_path_file);
// Portable settings are available, use them. // Portable settings are available, use them.
new_settings = new Settings(app_path_file, QSettings::IniFormat, Settings::Portable, parent); new_settings = new Settings(app_path_file, QSettings::IniFormat, Settings::Portable, parent);
@ -74,6 +100,8 @@ Settings *Settings::setupSettings(QObject *parent) {
qDebug("Initializing settings in '%s' (portable way).", qPrintable(QDir::toNativeSeparators(app_path_file))); qDebug("Initializing settings in '%s' (portable way).", qPrintable(QDir::toNativeSeparators(app_path_file)));
} }
else { else {
finishRestoration(home_path_file);
// Portable settings are NOT available, store them in // Portable settings are NOT available, store them in
// user's home directory. // user's home directory.
new_settings = new Settings(home_path_file, QSettings::IniFormat, Settings::NonPortable, parent); new_settings = new Settings(home_path_file, QSettings::IniFormat, Settings::NonPortable, parent);

View File

@ -53,12 +53,16 @@ class Settings : public QSettings {
// Synchronizes settings. // Synchronizes settings.
QSettings::Status checkSettings(); QSettings::Status checkSettings();
bool initiateRestoration(const QString &settings_backup_file_path);
static void finishRestoration(const QString &desired_settings_file_path);
// Creates settings file in correct location. // Creates settings file in correct location.
static Settings *setupSettings(QObject *parent); static Settings *setupSettings(QObject *parent);
private: private:
// Constructor. // Constructor.
explicit Settings(const QString & file_name, Format format, const Type &type, QObject *parent = 0); explicit Settings(const QString &file_name, Format format, const Type &type, QObject *parent = 0);
Type m_initializationStatus; Type m_initializationStatus;
}; };