Database defragmentation feature added, this fixed #1.

This commit is contained in:
Martin Rotter 2014-02-05 19:27:06 +01:00
parent 23682726d2
commit b16d14e175
8 changed files with 89 additions and 0 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

After

Width:  |  Height:  |  Size: 2.5 KiB

View File

@ -221,6 +221,7 @@ QSqlDatabase DatabaseFactory::initializeFileBasedDatabase(const QString &connect
return database;
}
QSqlDatabase DatabaseFactory::connection(const QString &connection_name,
DesiredType desired_type) {
if (desired_type == DatabaseFactory::StrictlyInMemory ||
@ -331,3 +332,10 @@ void DatabaseFactory::determineInMemoryDatabase() {
qDebug("Working database source was determined as %s.",
m_inMemoryEnabled ? "in-memory database" : "file-based database");
}
bool DatabaseFactory::vacuumDatabase() {
QSqlDatabase database = connection(objectName(), FromSettings);
QSqlQuery query_vacuum(database);
return query_vacuum.exec("VACUUM");
}

View File

@ -41,6 +41,16 @@ class DatabaseFactory : public QObject {
// Sets m_inMemoryEnabled according to user settings.
void determineInMemoryDatabase();
// Performs "VACUUM" on the database and
// returns true of operation succeeded.
bool vacuumDatabase();
// Returns whether in-memory database feature is currently
// used.
inline bool usingInMemoryDatabase() const {
return m_inMemoryEnabled;
}
// Singleton getter.
static DatabaseFactory *instance();

View File

@ -1,6 +1,7 @@
#include "gui/feedmessageviewer.h"
#include "core/settings.h"
#include "core/databasefactory.h"
#include "core/messagesproxymodel.h"
#include "core/feeddownloader.h"
#include "core/feedsmodelstandardfeed.h"
@ -216,6 +217,8 @@ void FeedMessageViewer::createConnections() {
SIGNAL(triggered()), m_feedsView, SLOT(openSelectedFeedsInNewspaperMode()));
connect(form_main->m_ui->m_actionDeleteSelectedFeedCategory,
SIGNAL(triggered()), m_feedsView, SLOT(deleteSelectedItem()));
connect(form_main->m_ui->m_actionDefragmentDatabase,
SIGNAL(triggered()), this, SLOT(vacuumDatabase()));
}
void FeedMessageViewer::initialize() {
@ -279,3 +282,57 @@ void FeedMessageViewer::initializeViews() {
// Set layout as active.
setLayout(central_layout);
}
void FeedMessageViewer::vacuumDatabase() {
bool is_tray_activated = SystemTrayIcon::isSystemTrayActivated();
if (!SystemFactory::instance()->applicationCloseLock()->tryLock()) {
// Lock was not obtained because
// it is used probably by feed updater or application
// is quitting.
if (is_tray_activated) {
SystemTrayIcon::instance()->showMessage(tr("Cannot defragment database"),
tr("Database cannot be defragmented because feed update is ongoing."),
QSystemTrayIcon::Warning);
}
else {
MessageBox::show(this,
QMessageBox::Warning,
tr("Cannot defragment database"),
tr("Database cannot be defragmented because feed update is ongoing."));
}
// Thus, cannot delete and quit the method.
return;
}
if (DatabaseFactory::instance()->vacuumDatabase()) {
if (is_tray_activated) {
SystemTrayIcon::instance()->showMessage(tr("Database defragmented"),
tr("Database was successfully defragmented."),
QSystemTrayIcon::Information);
}
else {
MessageBox::show(this,
QMessageBox::Information,
tr("Database defragmented"),
tr("Database was successfully defragmented."));
}
}
else {
if (is_tray_activated) {
SystemTrayIcon::instance()->showMessage(tr("Database was not defragmented"),
tr("Database was not defragmented, try again later."),
QSystemTrayIcon::Warning);
}
else {
MessageBox::show(this,
QMessageBox::Warning,
tr("Database was not defragmented"),
tr("Database was not defragmented, try again later."));
}
}
SystemFactory::instance()->applicationCloseLock()->unlock();
}

View File

@ -43,6 +43,9 @@ class FeedMessageViewer : public TabContent {
// stops any child widgets/workers.
void quit();
public slots:
void vacuumDatabase();
protected slots:
// Updates counts of messages for example in tray icon.
void updateTrayIconStatus(int unread_messages, int total_messages);

View File

@ -224,6 +224,7 @@ void FormMain::setupIcons() {
m_ui->m_actionExport->setIcon(icon_theme_factory->fromTheme("document-export"));
m_ui->m_actionFullscreen->setIcon(icon_theme_factory->fromTheme("view-fullscreen"));
m_ui->m_actionSwitchMainWindow->setIcon(icon_theme_factory->fromTheme("view-switch"));
m_ui->m_actionDefragmentDatabase->setIcon(icon_theme_factory->fromTheme("defragment-database"));
// Web browser.
m_ui->m_actionAddBrowser->setIcon(icon_theme_factory->fromTheme("list-add"));

View File

@ -74,6 +74,8 @@
<string>&amp;Tools</string>
</property>
<addaction name="m_actionSettings"/>
<addaction name="separator"/>
<addaction name="m_actionDefragmentDatabase"/>
</widget>
<widget class="QMenu" name="m_menuWebBrowser">
<property name="title">
@ -447,6 +449,14 @@
<string notr="true"/>
</property>
</action>
<action name="m_actionDefragmentDatabase">
<property name="text">
<string>Defragment database</string>
</property>
<property name="toolTip">
<string>Defragment database file so that its size decreases.</string>
</property>
</action>
</widget>
<customwidgets>
<customwidget>