work on labels management in feed fetch loop, there was hidden bug before, now possibly still broken, but atleast i found it and know what todo
This commit is contained in:
parent
8488759718
commit
65bb9a45ca
4 changed files with 47 additions and 18 deletions
|
@ -331,16 +331,28 @@ void FeedDownloader::updateOneFeed(ServiceRoot* acc,
|
||||||
}
|
}
|
||||||
|
|
||||||
// Process changed labels.
|
// Process changed labels.
|
||||||
|
//
|
||||||
|
// NOTE: We do not need to to this for
|
||||||
|
// feeds which do not use online synchronised
|
||||||
|
// labels, because those synchronized feeds
|
||||||
|
// replace all labels later in the method.
|
||||||
|
// const bool uses_online_labels =
|
||||||
|
// (feed->getParentServiceRoot()->supportedLabelOperations() & ServiceRoot::LabelOperation::Synchronised) ==
|
||||||
|
// ServiceRoot::LabelOperation::Synchronised;
|
||||||
|
|
||||||
|
// if (!uses_online_labels) {
|
||||||
|
|
||||||
|
// NOTE: We only remember what labels were added/removed in filters
|
||||||
|
// and store the fact to server (of synchronized) and local DB later.
|
||||||
|
// This is mainly because articles might not even be in DB yet.
|
||||||
|
// So first insert articles, then update their label assignments etc.
|
||||||
for (Label* lbl : qAsConst(msg_original.m_assignedLabels)) {
|
for (Label* lbl : qAsConst(msg_original.m_assignedLabels)) {
|
||||||
if (!msg_tweaked_by_filter->m_assignedLabels.contains(lbl)) {
|
if (!msg_tweaked_by_filter->m_assignedLabels.contains(lbl)) {
|
||||||
QMutexLocker lck(&m_mutexDb);
|
QMutexLocker lck(&m_mutexDb);
|
||||||
|
|
||||||
// Label is not there anymore, it was deassigned.
|
// Label is not there anymore, it was deassigned.
|
||||||
lbl->deassignFromMessage(*msg_tweaked_by_filter);
|
msg_tweaked_by_filter->m_deassignedLabelsByFilter << lbl;
|
||||||
|
msg_tweaked_by_filter->m_assignedLabels << lbl;
|
||||||
qDebugNN << LOGSEC_FEEDDOWNLOADER << "It was detected that label" << QUOTE_W_SPACE(lbl->customId())
|
|
||||||
<< "was DEASSIGNED from message" << QUOTE_W_SPACE(msg_tweaked_by_filter->m_customId)
|
|
||||||
<< "by message filter(s).";
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -350,13 +362,11 @@ void FeedDownloader::updateOneFeed(ServiceRoot* acc,
|
||||||
|
|
||||||
// Label is in new message, but is not in old message, it
|
// Label is in new message, but is not in old message, it
|
||||||
// was newly assigned.
|
// was newly assigned.
|
||||||
lbl->assignToMessage(*msg_tweaked_by_filter);
|
msg_tweaked_by_filter->m_assignedLabelsByFilter << lbl;
|
||||||
|
msg_tweaked_by_filter->m_assignedLabels << lbl;
|
||||||
qDebugNN << LOGSEC_FEEDDOWNLOADER << "It was detected that label" << QUOTE_W_SPACE(lbl->customId())
|
|
||||||
<< "was ASSIGNED to message" << QUOTE_W_SPACE(msg_tweaked_by_filter->m_customId)
|
|
||||||
<< "by message filter(s).";
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
//}
|
||||||
|
|
||||||
if (remove_msg) {
|
if (remove_msg) {
|
||||||
msgs.removeAt(i--);
|
msgs.removeAt(i--);
|
||||||
|
|
|
@ -67,6 +67,8 @@ Message::Message() {
|
||||||
m_score = 0.0;
|
m_score = 0.0;
|
||||||
m_isRead = m_isImportant = m_isDeleted = false;
|
m_isRead = m_isImportant = m_isDeleted = false;
|
||||||
m_assignedLabels = QList<Label*>();
|
m_assignedLabels = QList<Label*>();
|
||||||
|
m_assignedLabelsByFilter = QList<Label*>();
|
||||||
|
m_deassignedLabelsByFilter = QList<Label*>();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Message::sanitize(const Feed* feed, bool fix_future_datetimes) {
|
void Message::sanitize(const Feed* feed, bool fix_future_datetimes) {
|
||||||
|
|
|
@ -67,6 +67,9 @@ class RSSGUARD_DLLSPEC Message {
|
||||||
// List of custom IDs of labels assigned to this message.
|
// List of custom IDs of labels assigned to this message.
|
||||||
QList<Label*> m_assignedLabels;
|
QList<Label*> m_assignedLabels;
|
||||||
|
|
||||||
|
QList<Label*> m_assignedLabelsByFilter;
|
||||||
|
QList<Label*> m_deassignedLabelsByFilter;
|
||||||
|
|
||||||
// Is true if "created" date was obtained directly
|
// Is true if "created" date was obtained directly
|
||||||
// from the feed, otherwise is false
|
// from the feed, otherwise is false
|
||||||
bool m_createdFromFeed = false;
|
bool m_createdFromFeed = false;
|
||||||
|
|
|
@ -38,7 +38,7 @@ QMap<int, QString> DatabaseQueries::messageTableAttributes(bool only_msg_table)
|
||||||
"ELSE 'false' "
|
"ELSE 'false' "
|
||||||
"END AS has_enclosures");
|
"END AS has_enclosures");
|
||||||
field_names[MSG_DB_LABELS] =
|
field_names[MSG_DB_LABELS] =
|
||||||
QSL("(SELECT GROUP_CONCAT(Labels.name) FROM Labels WHERE Labels.id IN (SELECT "
|
QSL("(SELECT GROUP_CONCAT(Labels.name) FROM Labels WHERE Labels.custom_id IN (SELECT "
|
||||||
"LabelsInMessages.label FROM LabelsInMessages WHERE LabelsInMessages.account_id = "
|
"LabelsInMessages.label FROM LabelsInMessages WHERE LabelsInMessages.account_id = "
|
||||||
"Messages.account_id AND LabelsInMessages.message = Messages.custom_id)) as msg_labels");
|
"Messages.account_id AND LabelsInMessages.message = Messages.custom_id)) as msg_labels");
|
||||||
|
|
||||||
|
@ -1439,19 +1439,33 @@ QPair<int, int> DatabaseQueries::updateMessages(QSqlDatabase db,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update labels assigned to message.
|
const bool uses_online_labels =
|
||||||
|
(feed->getParentServiceRoot()->supportedLabelOperations() & ServiceRoot::LabelOperation::Synchronised) ==
|
||||||
|
ServiceRoot::LabelOperation::Synchronised;
|
||||||
|
|
||||||
for (Message& message : messages) {
|
for (Message& message : messages) {
|
||||||
if (!message.m_assignedLabels.isEmpty()) {
|
|
||||||
if (!message.m_customId.isEmpty() || message.m_id > 0) {
|
if (!message.m_customId.isEmpty() || message.m_id > 0) {
|
||||||
QMutexLocker lck(db_mutex);
|
QMutexLocker lck(db_mutex);
|
||||||
|
|
||||||
|
if (uses_online_labels) {
|
||||||
|
// Store all labels obtained from server.
|
||||||
setLabelsForMessage(db, message.m_assignedLabels, message);
|
setLabelsForMessage(db, message.m_assignedLabels, message);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Adjust labels tweaked by filters.
|
||||||
|
for (Label* assigned_by_filter : message.m_assignedLabelsByFilter) {
|
||||||
|
assigned_by_filter->assignToMessage(message);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (Label* removed_by_filter : message.m_deassignedLabelsByFilter) {
|
||||||
|
removed_by_filter->deassignFromMessage(message);
|
||||||
|
}
|
||||||
|
}
|
||||||
else {
|
else {
|
||||||
qCriticalNN << LOGSEC_DB << "Cannot set labels for message" << QUOTE_W_SPACE(message.m_title)
|
qCriticalNN << LOGSEC_DB << "Cannot set labels for message" << QUOTE_W_SPACE(message.m_title)
|
||||||
<< "because we don't have ID or custom ID.";
|
<< "because we don't have ID or custom ID.";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
// Now, fixup custom IDS for messages which initially did not have them,
|
// Now, fixup custom IDS for messages which initially did not have them,
|
||||||
// just to keep the data consistent.
|
// just to keep the data consistent.
|
||||||
|
|
Loading…
Add table
Reference in a new issue