Work on better recycle bin + ability to update DB schemas.

This commit is contained in:
Martin Rotter 2014-10-25 16:10:37 +02:00
parent f4f278119a
commit 504950f631
12 changed files with 92 additions and 62 deletions

View File

@ -71,8 +71,8 @@ project(rssguard)
set(APP_NAME "RSS Guard")
set(APP_LOW_NAME "rssguard")
set(APP_VERSION "2.0.0.3")
set(FILE_VERSION "2,0,0,3")
set(APP_VERSION "2.0.0.4")
set(FILE_VERSION "2,0,0,4")
set(APP_AUTHOR "Martin Rotter")
set(APP_URL "http://bitbucket.org/skunkos/rssguard")
set(APP_URL_ISSUES "http://bitbucket.org/skunkos/rssguard/issues")
@ -642,27 +642,17 @@ endif(${USE_QT_5})
# Installation stage.
if(WIN32 OR OS2)
message(STATUS "[${APP_LOW_NAME}] You will probably install on Windows or OS/2.")
install(TARGETS ${EXE_NAME}
RUNTIME DESTINATION ./)
install(TARGETS ${UPDATER_EXE_NAME}
RUNTIME DESTINATION ./${UPDATER_SUBFOLDER})
install(TARGETS ${EXE_NAME} RUNTIME DESTINATION ./)
# Copy DLLs and other binary files for main installation and updater.
if(WIN32 AND NOT ${USE_QT_5})
install(FILES ${APP_DLLS_QT4_MSVC2010}
DESTINATION ./)
install(FILES ${APP_DLLS_QT4_MSVC2010_IMAGEFORMATS}
DESTINATION ./imageformats)
install(FILES ${APP_DLLS_QT4_MSVC2010_SQLDRIVERS}
DESTINATION ./sqldrivers)
install(FILES ${APP_DLLS_QT4_MSVC2010}
DESTINATION ./${UPDATER_SUBFOLDER})
install(FILES ${APP_DLLS_QT4_MSVC2010} DESTINATION ./)
install(FILES ${APP_DLLS_QT4_MSVC2010_IMAGEFORMATS} DESTINATION ./imageformats)
install(FILES ${APP_DLLS_QT4_MSVC2010_SQLDRIVERS} DESTINATION ./sqldrivers)
endif(WIN32 AND NOT ${USE_QT_5})
if(BUNDLE_ICON_THEMES)
install(DIRECTORY resources/graphics/icons/mini-kfaenza
DESTINATION ./icons)
install(DIRECTORY resources/graphics/icons/mini-kfaenza DESTINATION ./icons)
endif(BUNDLE_ICON_THEMES)
install(DIRECTORY resources/skins/base
@ -707,50 +697,30 @@ elseif(APPLE)
set(APPLE_PREFIX ${CMAKE_INSTALL_PREFIX}/${EXE_NAME}.app/Contents/Resources)
if(BUNDLE_ICON_THEMES)
install(DIRECTORY resources/graphics/icons/mini-kfaenza
DESTINATION ${APPLE_PREFIX}/icons)
install(DIRECTORY resources/graphics/icons/mini-kfaenza DESTINATION ${APPLE_PREFIX}/icons)
endif(BUNDLE_ICON_THEMES)
install(DIRECTORY resources/skins
DESTINATION ${APPLE_PREFIX})
install(DIRECTORY resources/misc
DESTINATION ${APPLE_PREFIX})
install(FILES resources/graphics/${APP_LOW_NAME}_128.png
DESTINATION ${APPLE_PREFIX}
RENAME ${APP_LOW_NAME}.png)
install(FILES resources/graphics/${APP_LOW_NAME}_plain_128.png
DESTINATION ${APPLE_PREFIX}
RENAME ${APP_LOW_NAME}_plain.png)
install(FILES ${APP_QM}
DESTINATION ${APPLE_PREFIX}/l10n)
install(FILES ${APP_TEXT}
DESTINATION ${APPLE_PREFIX}/information)
install(DIRECTORY resources/skins DESTINATION ${APPLE_PREFIX})
install(DIRECTORY resources/misc DESTINATION ${APPLE_PREFIX})
install(FILES resources/graphics/${APP_LOW_NAME}_128.png DESTINATION ${APPLE_PREFIX} RENAME ${APP_LOW_NAME}.png)
install(FILES resources/graphics/${APP_LOW_NAME}_plain_128.png DESTINATION ${APPLE_PREFIX} RENAME ${APP_LOW_NAME}_plain.png)
install(FILES ${APP_QM} DESTINATION ${APPLE_PREFIX}/l10n)
install(FILES ${APP_TEXT} DESTINATION ${APPLE_PREFIX}/information)
elseif(UNIX)
message(STATUS "[${APP_LOW_NAME}] You will probably install on Linux.")
install(TARGETS ${EXE_NAME}
RUNTIME DESTINATION bin)
install(TARGETS ${EXE_NAME} RUNTIME DESTINATION bin)
if(BUNDLE_ICON_THEMES)
install(DIRECTORY resources/graphics/icons/mini-kfaenza
DESTINATION share/${APP_LOW_NAME}/icons)
install(DIRECTORY resources/graphics/icons/mini-kfaenza DESTINATION share/${APP_LOW_NAME}/icons)
endif(BUNDLE_ICON_THEMES)
install(DIRECTORY resources/skins/base
DESTINATION share/${APP_LOW_NAME}/skins)
install(DIRECTORY resources/misc
DESTINATION share/${APP_LOW_NAME})
install(FILES ${CMAKE_BINARY_DIR}/resources/desktop/${APP_LOW_NAME}.desktop
DESTINATION share/applications)
install(FILES resources/graphics/${APP_LOW_NAME}_128.png
DESTINATION share/pixmaps
RENAME ${APP_LOW_NAME}.png)
install(FILES resources/graphics/${APP_LOW_NAME}_plain_128.png
DESTINATION share/rssguard/icons
RENAME ${APP_LOW_NAME}_plain.png)
install(FILES ${APP_QM}
DESTINATION share/${APP_LOW_NAME}/l10n)
install(FILES ${APP_TEXT}
DESTINATION share/${APP_LOW_NAME}/information)
install(DIRECTORY resources/skins/base DESTINATION share/${APP_LOW_NAME}/skins)
install(DIRECTORY resources/misc DESTINATION share/${APP_LOW_NAME})
install(FILES ${CMAKE_BINARY_DIR}/resources/desktop/${APP_LOW_NAME}.desktop DESTINATION share/applications)
install(FILES resources/graphics/${APP_LOW_NAME}_128.png DESTINATION share/pixmaps RENAME ${APP_LOW_NAME}.png)
install(FILES resources/graphics/${APP_LOW_NAME}_plain_128.png DESTINATION share/rssguard/icons RENAME ${APP_LOW_NAME}_plain.png)
install(FILES ${APP_QM} DESTINATION share/${APP_LOW_NAME}/l10n)
install(FILES ${APP_TEXT} DESTINATION share/${APP_LOW_NAME}/information)
endif(WIN32 OR OS2)
# Custom target for packaging.

View File

@ -12,7 +12,7 @@ CREATE TABLE IF NOT EXISTS Information (
inf_value TEXT NOT NULL
);
-- !
INSERT INTO Information VALUES (1, 'schema_version', '0.0.1');
INSERT INTO Information VALUES (1, 'schema_version', '0.0.2');
-- !
DROP TABLE IF EXISTS Categories;
-- !
@ -68,6 +68,7 @@ CREATE TABLE IF NOT EXISTS Messages (
author TEXT NOT NULL,
date_created BIGINT NOT NULL CHECK (date_created != 0),
contents TEXT,
is_hidden INTEGER(1) NOT NULL DEFAULT 0 CHECK (is_hidden >= 0 AND is_hidden <= 1),
FOREIGN KEY (feed) REFERENCES Feeds (id)
);

View File

@ -6,7 +6,7 @@ CREATE TABLE IF NOT EXISTS Information (
inf_value TEXT NOT NULL
);
-- !
INSERT INTO Information VALUES (1, 'schema_version', '0.0.1');
INSERT INTO Information VALUES (1, 'schema_version', '0.0.2');
-- !
DROP TABLE IF EXISTS Categories;
-- !
@ -62,6 +62,7 @@ CREATE TABLE IF NOT EXISTS Messages (
author TEXT NOT NULL,
date_created INTEGER NOT NULL CHECK (date_created != 0),
contents TEXT,
is_hidden INTEGER(1) NOT NULL DEFAULT 0 CHECK (is_hidden >= 0 AND is_hidden <= 1),
FOREIGN KEY (feed) REFERENCES Feeds (id)
);

View File

@ -6,7 +6,7 @@ CREATE TABLE IF NOT EXISTS Information (
inf_value TEXT NOT NULL
);
-- !
INSERT INTO Information VALUES (1, 'schema_version', '0.0.1');
INSERT INTO Information VALUES (1, 'schema_version', '0.0.2');
-- !
DROP TABLE IF EXISTS Categories;
-- !
@ -62,6 +62,7 @@ CREATE TABLE IF NOT EXISTS Messages (
author TEXT NOT NULL,
date_created INTEGER NOT NULL CHECK (date_created != 0),
contents TEXT,
is_hidden INTEGER(1) NOT NULL DEFAULT 0 CHECK (is_hidden >= 0 AND is_hidden <= 1),
FOREIGN KEY (feed) REFERENCES Feeds (id)
);

View File

@ -0,0 +1,2 @@
ALTER TABLE Messages
ADD COLUMN is_pdeleted INTEGER(1) NOT NULL DEFAULT 0 CHECK (is_pdeleted >= 0 AND is_pdeleted <= 1);

View File

@ -0,0 +1,2 @@
ALTER TABLE Messages
ADD COLUMN is_pdeleted INTEGER(1) NOT NULL DEFAULT 0 CHECK (is_pdeleted >= 0 AND is_pdeleted <= 1);

View File

@ -1,4 +1,20 @@
<body>
<center><h2>2.0.0.4</h2></center>
Fixed:
<ul>
<li>Database is now correctly restored when using SQLite memory databases.</li>
</ul>
Added:
<ul>
</ul>
Changed:
<ul>
</ul>
<hr/>
<center><h2>2.0.0.3</h2></center>
Fixed:

View File

@ -145,14 +145,15 @@ void MessagesModel::setupHeaderData() {
/*: Tooltip for url of message.*/ tr("Url") <<
/*: Tooltip for author of message.*/ tr("Author") <<
/*: Tooltip for creation date of message.*/ tr("Created on") <<
/*: Tooltip for contents of message.*/ tr("Contents");
/*: Tooltip for contents of message.*/ tr("Contents") <<
/*: Tooltip for "pdeleted" column in msg list.*/ tr("Permanently deleted");
m_tooltipData << tr("Id of the message.") << tr("Is message read?") <<
tr("Is message deleted?") << tr("Is message important?") <<
tr("Id of feed which this message belongs to.") <<
tr("Title of the message.") << tr("Url of the message.") <<
tr("Author of the message.") << tr("Creation date of the message.") <<
tr("Contents of the message.");
tr("Contents of the message.") << tr("Is message permanently deleted from recycle bin?");
}
Qt::ItemFlags MessagesModel::flags(const QModelIndex &index) const {

View File

@ -91,6 +91,9 @@
#define APP_DB_SQLITE_PATH "data/database/local"
#define APP_DB_SQLITE_FILE "database.db"
// Keep this in sync with schema versions declared in SQL initialization code.
#define APP_DB_SCHEMA_VERSION "0.0.2"
#define APP_DB_UPDATE_FILE_PATTERN "data_update_%1_%2_3.sql"
#define APP_DB_COMMENT_SPLIT "-- !\n"
#define APP_DB_WEB_PATH "data/database/web"
@ -132,6 +135,7 @@
#define MSG_DB_AUTHOR_INDEX 7
#define MSG_DB_DCREATED_INDEX 8
#define MSG_DB_CONTENTS_INDEX 9
#define MSG_DB_PDELETED_INDEX 10
// Indexes of columns as they are DEFINED IN THE TABLE for CATEGORIES.
#define CAT_DB_ID_INDEX 0

View File

@ -472,6 +472,7 @@ void MessagesView::adjustColumns() {
header()->setSectionResizeMode(MSG_DB_AUTHOR_INDEX, QHeaderView::Interactive);
header()->setSectionResizeMode(MSG_DB_DCREATED_INDEX, QHeaderView::Interactive);
header()->setSectionResizeMode(MSG_DB_CONTENTS_INDEX, QHeaderView::Interactive);
header()->setSectionResizeMode(MSG_DB_PDELETED_INDEX, QHeaderView::Interactive);
#else
// Setup column resize strategies.
header()->setResizeMode(MSG_DB_ID_INDEX, QHeaderView::Interactive);
@ -484,6 +485,7 @@ void MessagesView::adjustColumns() {
header()->setResizeMode(MSG_DB_AUTHOR_INDEX, QHeaderView::Interactive);
header()->setResizeMode(MSG_DB_DCREATED_INDEX, QHeaderView::Interactive);
header()->setResizeMode(MSG_DB_CONTENTS_INDEX, QHeaderView::Interactive);
header()->setResizeMode(MSG_DB_PDELETED_INDEX, QHeaderView::Interactive);
#endif
// Hide columns.
@ -492,6 +494,7 @@ void MessagesView::adjustColumns() {
hideColumn(MSG_DB_FEED_INDEX);
hideColumn(MSG_DB_URL_INDEX);
hideColumn(MSG_DB_CONTENTS_INDEX);
hideColumn(MSG_DB_PDELETED_INDEX);
qDebug("Adjusting column resize modes for MessagesView.");
}

View File

@ -287,10 +287,23 @@ QSqlDatabase DatabaseFactory::sqliteInitializeFileBasedDatabase(const QString &c
else {
query_db.next();
QString installed_db_schema = query_db.value(0).toString();
if (!updateDatabaseSchema(installed_db_schema)) {
qFatal("Database schema was not updated from '%s' to '%s' successully.",
qPrintable(installed_db_schema),
qPrintable(APP_DB_SCHEMA_VERSION));
}
else {
qDebug("Database schema was updated from '%s' to '%s' successully.",
qPrintable(installed_db_schema),
qPrintable(APP_DB_SCHEMA_VERSION));
}
qDebug("File-based SQLite database connection '%s' to file '%s' seems to be established.",
qPrintable(connection_name),
qPrintable(QDir::toNativeSeparators(database.databaseName())));
qDebug("File-based SQLite database has version '%s'.", qPrintable(query_db.value(0).toString()));
qDebug("File-based SQLite database has version '%s'.", qPrintable(installed_db_schema));
}
query_db.finish();
@ -306,6 +319,23 @@ QString DatabaseFactory::sqliteDatabaseFilePath() const {
return m_sqliteDatabaseFilePath + QDir::separator() + APP_DB_SQLITE_FILE;
}
bool DatabaseFactory::updateDatabaseSchema(const QString &source_db_schema_version) {
switch (m_activeDatabaseDriver) {
case SQLITE:
case SQLITE_MEMORY:
break;
case MYSQL:
break;
default:
return false;
}
// TODO: tady udělat update databázového schématu na novou verzi.
return true;
}
QSqlDatabase DatabaseFactory::connection(const QString &connection_name,
DesiredType desired_type) {
switch (m_activeDatabaseDriver) {
@ -349,9 +379,7 @@ void DatabaseFactory::sqliteSaveMemoryDatabase() {
}
void DatabaseFactory::determineDriver() {
QString db_driver = qApp->settings()->value(APP_CFG_DB,
"database_driver",
APP_DB_SQLITE_DRIVER).toString();
QString db_driver = qApp->settings()->value(APP_CFG_DB, "database_driver", APP_DB_SQLITE_DRIVER).toString();
if (db_driver == APP_DB_MYSQL_DRIVER && QSqlDatabase::isDriverAvailable(APP_DB_SQLITE_DRIVER)) {
// User wants to use MySQL and MySQL is actually available. Use it.

View File

@ -86,6 +86,7 @@ class DatabaseFactory : public QObject {
// SQLITE stuff.
//
QString sqliteDatabaseFilePath() const;
bool updateDatabaseSchema(const QString &source_db_schema_version);
//
// MySQL stuff.