more work!
This commit is contained in:
parent
58cf78b7f0
commit
b4b095b980
8 changed files with 48 additions and 22 deletions
|
@ -4,10 +4,12 @@
|
||||||
<file>sql/db_update_mysql_1_2.sql</file>
|
<file>sql/db_update_mysql_1_2.sql</file>
|
||||||
<file>sql/db_update_mysql_2_3.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_3_4.sql</file>
|
||||||
|
<file>sql/db_update_mysql_4_5.sql</file>
|
||||||
|
|
||||||
<file>sql/db_init_sqlite.sql</file>
|
<file>sql/db_init_sqlite.sql</file>
|
||||||
<file>sql/db_update_sqlite_1_2.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_2_3.sql</file>
|
||||||
<file>sql/db_update_sqlite_3_4.sql</file>
|
<file>sql/db_update_sqlite_3_4.sql</file>
|
||||||
|
<file>sql/db_update_sqlite_4_5.sql</file>
|
||||||
</qresource>
|
</qresource>
|
||||||
</RCC>
|
</RCC>
|
|
@ -69,7 +69,7 @@ CREATE TABLE Messages (
|
||||||
account_id INTEGER NOT NULL,
|
account_id INTEGER NOT NULL,
|
||||||
custom_id TEXT,
|
custom_id TEXT,
|
||||||
custom_hash 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
|
FOREIGN KEY (account_id) REFERENCES Accounts (id) ON DELETE CASCADE
|
||||||
);
|
);
|
||||||
|
|
|
@ -1,8 +1,17 @@
|
||||||
USE ##;
|
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;
|
|
@ -1,4 +1,15 @@
|
||||||
|
/* Add "labels" column. */
|
||||||
|
ALTER TABLE Messages ADD labels TEXT NOT NULL DEFAULT ".";
|
||||||
|
-- !
|
||||||
/* Copy label IDs to Messages table. */
|
/* Copy label IDs to Messages table. */
|
||||||
|
UPDATE Messages SET labels = (
|
||||||
|
SELECT
|
||||||
/* Remove LabelsInMessages table. */
|
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;
|
|
@ -111,10 +111,10 @@ bool DatabaseQueries::assignLabelToMessage(const QSqlDatabase& db, Label* label,
|
||||||
|
|
||||||
QSqlQuery q(db);
|
QSqlQuery q(db);
|
||||||
|
|
||||||
// TODO: ověřit.
|
|
||||||
q.setForwardOnly(true);
|
q.setForwardOnly(true);
|
||||||
|
// TODO: pro mysql, kde operátor concatenate || není
|
||||||
q.prepare(QSL("UPDATE Messages "
|
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;"));
|
"WHERE Messages.custom_id = :message AND account_id = :account_id;"));
|
||||||
q.bindValue(QSL(":label"), QSL("%1.").arg(label->customId()));
|
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);
|
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.
|
// Adjust labels tweaked by filters.
|
||||||
for (Label* assigned_by_filter : message.m_assignedLabelsByFilter) {
|
for (Label* assigned_by_filter : message.m_assignedLabelsByFilter) {
|
||||||
assigned_by_filter->assignToMessage(message);
|
assigned_by_filter->assignToMessage(message, false);
|
||||||
lbls_changed = true;
|
lbls_changed = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (Label* removed_by_filter : message.m_deassignedLabelsByFilter) {
|
for (Label* removed_by_filter : message.m_deassignedLabelsByFilter) {
|
||||||
removed_by_filter->deassignFromMessage(message);
|
removed_by_filter->deassignFromMessage(message, false);
|
||||||
lbls_changed = true;
|
lbls_changed = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -213,7 +213,7 @@
|
||||||
#define APP_DB_SQLITE_FILE "database.db"
|
#define APP_DB_SQLITE_FILE "database.db"
|
||||||
|
|
||||||
// Keep this in sync with schema versions declared in SQL initialization code.
|
// 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_UPDATE_FILE_PATTERN "db_update_%1_%2_%3.sql"
|
||||||
#define APP_DB_COMMENT_SPLIT "-- !\n"
|
#define APP_DB_COMMENT_SPLIT "-- !\n"
|
||||||
#define APP_DB_INCLUDE_PLACEHOLDER "!!"
|
#define APP_DB_INCLUDE_PLACEHOLDER "!!"
|
||||||
|
|
|
@ -105,23 +105,27 @@ QIcon Label::generateIcon(const QColor& color) {
|
||||||
return pxm;
|
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());
|
QSqlDatabase database = qApp->database()->driver()->threadSafeConnection(metaObject()->className());
|
||||||
|
|
||||||
if (getParentServiceRoot()->onBeforeLabelMessageAssignmentChanged({this}, {msg}, true)) {
|
if (getParentServiceRoot()->onBeforeLabelMessageAssignmentChanged({this}, {msg}, true)) {
|
||||||
DatabaseQueries::assignLabelToMessage(database, this, msg);
|
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());
|
QSqlDatabase database = qApp->database()->driver()->threadSafeConnection(metaObject()->className());
|
||||||
|
|
||||||
if (getParentServiceRoot()->onBeforeLabelMessageAssignmentChanged({this}, {msg}, false)) {
|
if (getParentServiceRoot()->onBeforeLabelMessageAssignmentChanged({this}, {msg}, false)) {
|
||||||
DatabaseQueries::deassignLabelFromMessage(database, this, msg);
|
DatabaseQueries::deassignLabelFromMessage(database, this, msg);
|
||||||
|
|
||||||
getParentServiceRoot()->onAfterLabelMessageAssignmentChanged({this}, {msg}, false);
|
if (reload_model) {
|
||||||
|
getParentServiceRoot()->onAfterLabelMessageAssignmentChanged({this}, {msg}, false);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -8,10 +8,10 @@
|
||||||
#include <QColor>
|
#include <QColor>
|
||||||
|
|
||||||
class RSSGUARD_DLLSPEC Label : public RootItem {
|
class RSSGUARD_DLLSPEC Label : public RootItem {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
// Added for message filtering with labels.
|
// Added for message filtering with labels.
|
||||||
Q_PROPERTY(QColor color READ color)
|
Q_PROPERTY(QColor color READ color)
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit Label(const QString& name, const QColor& color, RootItem* parent_item = nullptr);
|
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);
|
static QIcon generateIcon(const QColor& color);
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
void assignToMessage(const Message& msg);
|
void assignToMessage(const Message& msg, bool reload_model = true);
|
||||||
void deassignFromMessage(const Message& msg);
|
void deassignFromMessage(const Message& msg, bool reload_model = true);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
QColor m_color;
|
QColor m_color;
|
||||||
|
|
Loading…
Add table
Reference in a new issue