more work!

This commit is contained in:
Martin Rotter 2023-06-01 13:46:00 +02:00
parent 58cf78b7f0
commit b4b095b980
8 changed files with 48 additions and 22 deletions

View File

@ -4,10 +4,12 @@
<file>sql/db_update_mysql_1_2.sql</file>
<file>sql/db_update_mysql_2_3.sql</file>
<file>sql/db_update_mysql_3_4.sql</file>
<file>sql/db_update_mysql_4_5.sql</file>
<file>sql/db_init_sqlite.sql</file>
<file>sql/db_update_sqlite_1_2.sql</file>
<file>sql/db_update_sqlite_2_3.sql</file>
<file>sql/db_update_sqlite_3_4.sql</file>
<file>sql/db_update_sqlite_4_5.sql</file>
</qresource>
</RCC>

View File

@ -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
);

View File

@ -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;
-- !
/* Remove LabelsInMessages table. */
DROP TABLE IF EXISTS LabelsInMessages;

View File

@ -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. */
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;

View File

@ -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<int, int> 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;
}

View File

@ -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 "!!"

View File

@ -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);
}
}
}

View File

@ -8,10 +8,10 @@
#include <QColor>
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;