From b4b095b9806626fbb326085dc222e17121177b2b Mon Sep 17 00:00:00 2001 From: Martin Rotter Date: Thu, 1 Jun 2023 13:46:00 +0200 Subject: [PATCH] more work! --- resources/sql.qrc | 2 ++ resources/sql/db_init_sqlite.sql | 2 +- resources/sql/db_update_mysql_4_5.sql | 17 +++++++++++++---- resources/sql/db_update_sqlite_4_5.sql | 17 ++++++++++++++--- src/librssguard/database/databasequeries.cpp | 8 ++++---- src/librssguard/definitions/definitions.h | 2 +- src/librssguard/services/abstract/label.cpp | 12 ++++++++---- src/librssguard/services/abstract/label.h | 10 +++++----- 8 files changed, 48 insertions(+), 22 deletions(-) diff --git a/resources/sql.qrc b/resources/sql.qrc index f0d0402b9..88d7f8529 100644 --- a/resources/sql.qrc +++ b/resources/sql.qrc @@ -4,10 +4,12 @@ sql/db_update_mysql_1_2.sql sql/db_update_mysql_2_3.sql sql/db_update_mysql_3_4.sql + sql/db_update_mysql_4_5.sql sql/db_init_sqlite.sql sql/db_update_sqlite_1_2.sql sql/db_update_sqlite_2_3.sql sql/db_update_sqlite_3_4.sql + sql/db_update_sqlite_4_5.sql \ No newline at end of file diff --git a/resources/sql/db_init_sqlite.sql b/resources/sql/db_init_sqlite.sql index 80b5f7a53..74bddf201 100644 --- a/resources/sql/db_init_sqlite.sql +++ b/resources/sql/db_init_sqlite.sql @@ -69,7 +69,7 @@ CREATE TABLE Messages ( account_id INTEGER NOT NULL, custom_id TEXT, custom_hash TEXT, - Labels TEXT NOT NULL DEFAULT "." /* Holds list of assigned labels. */ + labels TEXT NOT NULL DEFAULT "." /* Holds list of assigned label IDs. */ FOREIGN KEY (account_id) REFERENCES Accounts (id) ON DELETE CASCADE ); diff --git a/resources/sql/db_update_mysql_4_5.sql b/resources/sql/db_update_mysql_4_5.sql index b9f20664b..21c3ebd13 100755 --- a/resources/sql/db_update_mysql_4_5.sql +++ b/resources/sql/db_update_mysql_4_5.sql @@ -1,8 +1,17 @@ USE ##; -- ! -SET FOREIGN_KEY_CHECKS = 0; +/* Add "labels" column. */ +ALTER TABLE Messages ADD labels TEXT NOT NULL DEFAULT "."; -- ! -!! db_update_sqlite_4_5.sql +/* Copy label IDs to Messages table. */ +UPDATE Messages SET labels = ( + SELECT + IF( + GROUP_CONCAT(LabelsInMessages.label) IS NOT NULL, + CONCAT(".",REPLACE(GROUP_CONCAT(LabelsInMessages.label), ",", "."), "."), + ".") + FROM LabelsInMessages + WHERE Messages.custom_id = LabelsInMessages.message); -- ! -SET FOREIGN_KEY_CHECKS = 1; --- ! \ No newline at end of file +/* Remove LabelsInMessages table. */ +DROP TABLE IF EXISTS LabelsInMessages; \ No newline at end of file diff --git a/resources/sql/db_update_sqlite_4_5.sql b/resources/sql/db_update_sqlite_4_5.sql index 998f843ce..d252e230a 100755 --- a/resources/sql/db_update_sqlite_4_5.sql +++ b/resources/sql/db_update_sqlite_4_5.sql @@ -1,4 +1,15 @@ +/* Add "labels" column. */ +ALTER TABLE Messages ADD labels TEXT NOT NULL DEFAULT "."; +-- ! /* Copy label IDs to Messages table. */ - - -/* Remove LabelsInMessages table. */ \ No newline at end of file +UPDATE Messages SET labels = ( + SELECT + IIF( + GROUP_CONCAT(LabelsInMessages.label) IS NOT NULL, + "." || GROUP_CONCAT(LabelsInMessages.label, ".") || ".", + ".") + FROM LabelsInMessages + WHERE Messages.custom_id = LabelsInMessages.message); +-- ! +/* Remove LabelsInMessages table. */ +DROP TABLE IF EXISTS LabelsInMessages; \ No newline at end of file diff --git a/src/librssguard/database/databasequeries.cpp b/src/librssguard/database/databasequeries.cpp index 4e061d5c5..414cf0442 100644 --- a/src/librssguard/database/databasequeries.cpp +++ b/src/librssguard/database/databasequeries.cpp @@ -111,10 +111,10 @@ bool DatabaseQueries::assignLabelToMessage(const QSqlDatabase& db, Label* label, QSqlQuery q(db); - // TODO: ověřit. q.setForwardOnly(true); + // TODO: pro mysql, kde operátor concatenate || není q.prepare(QSL("UPDATE Messages " - "SET Messages.labels = Messages.labels || :label " + "SET labels = Messages.labels || :label " "WHERE Messages.custom_id = :message AND account_id = :account_id;")); q.bindValue(QSL(":label"), QSL("%1.").arg(label->customId())); q.bindValue(QSL(":message"), msg.m_customId.isEmpty() ? QString::number(msg.m_id) : msg.m_customId); @@ -1463,12 +1463,12 @@ QPair DatabaseQueries::updateMessages(const QSqlDatabase& db, // Adjust labels tweaked by filters. for (Label* assigned_by_filter : message.m_assignedLabelsByFilter) { - assigned_by_filter->assignToMessage(message); + assigned_by_filter->assignToMessage(message, false); lbls_changed = true; } for (Label* removed_by_filter : message.m_deassignedLabelsByFilter) { - removed_by_filter->deassignFromMessage(message); + removed_by_filter->deassignFromMessage(message, false); lbls_changed = true; } diff --git a/src/librssguard/definitions/definitions.h b/src/librssguard/definitions/definitions.h index 214fbce4a..fcdfdf5c9 100644 --- a/src/librssguard/definitions/definitions.h +++ b/src/librssguard/definitions/definitions.h @@ -213,7 +213,7 @@ #define APP_DB_SQLITE_FILE "database.db" // Keep this in sync with schema versions declared in SQL initialization code. -#define APP_DB_SCHEMA_VERSION "4" +#define APP_DB_SCHEMA_VERSION "5" #define APP_DB_UPDATE_FILE_PATTERN "db_update_%1_%2_%3.sql" #define APP_DB_COMMENT_SPLIT "-- !\n" #define APP_DB_INCLUDE_PLACEHOLDER "!!" diff --git a/src/librssguard/services/abstract/label.cpp b/src/librssguard/services/abstract/label.cpp index 30d4a5798..9e85066ff 100644 --- a/src/librssguard/services/abstract/label.cpp +++ b/src/librssguard/services/abstract/label.cpp @@ -105,23 +105,27 @@ QIcon Label::generateIcon(const QColor& color) { return pxm; } -void Label::assignToMessage(const Message& msg) { +void Label::assignToMessage(const Message& msg, bool reload_model) { QSqlDatabase database = qApp->database()->driver()->threadSafeConnection(metaObject()->className()); if (getParentServiceRoot()->onBeforeLabelMessageAssignmentChanged({this}, {msg}, true)) { DatabaseQueries::assignLabelToMessage(database, this, msg); - getParentServiceRoot()->onAfterLabelMessageAssignmentChanged({this}, {msg}, true); + if (reload_model) { + getParentServiceRoot()->onAfterLabelMessageAssignmentChanged({this}, {msg}, true); + } } } -void Label::deassignFromMessage(const Message& msg) { +void Label::deassignFromMessage(const Message& msg, bool reload_model) { QSqlDatabase database = qApp->database()->driver()->threadSafeConnection(metaObject()->className()); if (getParentServiceRoot()->onBeforeLabelMessageAssignmentChanged({this}, {msg}, false)) { DatabaseQueries::deassignLabelFromMessage(database, this, msg); - getParentServiceRoot()->onAfterLabelMessageAssignmentChanged({this}, {msg}, false); + if (reload_model) { + getParentServiceRoot()->onAfterLabelMessageAssignmentChanged({this}, {msg}, false); + } } } diff --git a/src/librssguard/services/abstract/label.h b/src/librssguard/services/abstract/label.h index 3f0f993c4..88e504ad6 100644 --- a/src/librssguard/services/abstract/label.h +++ b/src/librssguard/services/abstract/label.h @@ -8,10 +8,10 @@ #include class RSSGUARD_DLLSPEC Label : public RootItem { - Q_OBJECT + Q_OBJECT - // Added for message filtering with labels. - Q_PROPERTY(QColor color READ color) + // Added for message filtering with labels. + Q_PROPERTY(QColor color READ color) public: explicit Label(const QString& name, const QColor& color, RootItem* parent_item = nullptr); @@ -38,8 +38,8 @@ class RSSGUARD_DLLSPEC Label : public RootItem { static QIcon generateIcon(const QColor& color); public slots: - void assignToMessage(const Message& msg); - void deassignFromMessage(const Message& msg); + void assignToMessage(const Message& msg, bool reload_model = true); + void deassignFromMessage(const Message& msg, bool reload_model = true); private: QColor m_color;