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;