diff --git a/resources/sql/db_init_sqlite.sql b/resources/sql/db_init_sqlite.sql index 22c4ac0d4..c7f557569 100644 --- a/resources/sql/db_init_sqlite.sql +++ b/resources/sql/db_init_sqlite.sql @@ -14,7 +14,7 @@ CREATE TABLE Accounts ( proxy_username TEXT, proxy_password TEXT, /* Custom column for (serialized) custom account-specific data. */ - custom_data TEXT + custom_data TEXT ); -- ! CREATE TABLE Categories ( @@ -61,6 +61,7 @@ CREATE TABLE Messages ( date_created INTEGER NOT NULL CHECK (date_created >= 0), contents TEXT, enclosures TEXT, + score REAL NOT NULL DEFAULT 0.0 CHECK (score >= 0.0 AND score <= 100.0), account_id INTEGER NOT NULL, custom_id TEXT, custom_hash TEXT, diff --git a/src/librssguard/core/message.cpp b/src/librssguard/core/message.cpp index ca17cf4b6..e7fb4fdce 100644 --- a/src/librssguard/core/message.cpp +++ b/src/librssguard/core/message.cpp @@ -66,6 +66,7 @@ Message::Message() { m_title = m_url = m_author = m_contents = m_feedId = m_customId = m_customHash = ""; m_enclosures = QList(); m_accountId = m_id = 0; + m_score = 0.0; m_isRead = m_isImportant = m_isDeleted = false; m_assignedLabels = QList(); } @@ -106,6 +107,7 @@ Message Message::fromSqlRecord(const QSqlRecord& record, bool* result) { message.m_created = TextFactory::parseDateTime(record.value(MSG_DB_DCREATED_INDEX).value()); message.m_contents = record.value(MSG_DB_CONTENTS_INDEX).toString(); message.m_enclosures = Enclosures::decodeEnclosuresFromString(record.value(MSG_DB_ENCLOSURES_INDEX).toString()); + message.m_score = record.value(MSG_DB_SCORE_INDEX).toDouble(); message.m_accountId = record.value(MSG_DB_ACCOUNT_ID_INDEX).toInt(); message.m_customId = record.value(MSG_DB_CUSTOM_ID_INDEX).toString(); message.m_customHash = record.value(MSG_DB_CUSTOM_HASH_INDEX).toString(); @@ -125,31 +127,34 @@ QDataStream& operator<<(QDataStream& out, const Message& my_obj) { << my_obj.m_id << my_obj.m_isImportant << my_obj.m_isRead - << my_obj.m_isDeleted; + << my_obj.m_isDeleted + << my_obj.m_score; return out; } QDataStream& operator>>(QDataStream& in, Message& my_obj) { - int accountId; - QString customHash; - QString customId; - QString feedId; + int account_id; + QString custom_hash; + QString custom_id; + QString feed_id; int id; - bool isImportant; - bool isRead; - bool isDeleted; + bool is_important; + bool is_read; + bool is_deleted; + double score; - in >> accountId >> customHash >> customId >> feedId >> id >> isImportant >> isRead >> isDeleted; + in >> account_id >> custom_hash >> custom_id >> feed_id >> id >> is_important >> is_read >> is_deleted >> score; - my_obj.m_accountId = accountId; - my_obj.m_customHash = customHash; - my_obj.m_customId = customId; - my_obj.m_feedId = feedId; + my_obj.m_accountId = account_id; + my_obj.m_customHash = custom_hash; + my_obj.m_customId = custom_id; + my_obj.m_feedId = feed_id; my_obj.m_id = id; - my_obj.m_isImportant = isImportant; - my_obj.m_isRead = isRead; - my_obj.m_isDeleted = isDeleted; + my_obj.m_isImportant = is_important; + my_obj.m_isRead = is_read; + my_obj.m_isDeleted = is_deleted; + my_obj.m_score = score; return in; } diff --git a/src/librssguard/core/message.h b/src/librssguard/core/message.h index 340a50ced..1a9a55674 100644 --- a/src/librssguard/core/message.h +++ b/src/librssguard/core/message.h @@ -54,6 +54,7 @@ class RSSGUARD_DLLSPEC Message { bool m_isRead; bool m_isImportant; bool m_isDeleted; + double m_score; QList m_enclosures; // List of custom IDs of labels assigned to this message. diff --git a/src/librssguard/core/messageobject.cpp b/src/librssguard/core/messageobject.cpp index 2c8273a53..4c6f7e45d 100755 --- a/src/librssguard/core/messageobject.cpp +++ b/src/librssguard/core/messageobject.cpp @@ -183,6 +183,14 @@ void MessageObject::setIsDeleted(bool is_deleted) { m_message->m_isDeleted = is_deleted; } +double MessageObject::score() const { + return m_message->m_score; +} + +void MessageObject::setScore(double score) { + m_message->m_score = score; +} + QString MessageObject::feedCustomId() const { if (m_feedCustomId.isEmpty() || m_feedCustomId == QString::number(NO_PARENT_CATEGORY)) { return m_message->m_feedId; diff --git a/src/librssguard/core/messageobject.h b/src/librssguard/core/messageobject.h index 45b46c8a1..26ec8e3e0 100755 --- a/src/librssguard/core/messageobject.h +++ b/src/librssguard/core/messageobject.h @@ -19,6 +19,7 @@ class MessageObject : public QObject { Q_PROPERTY(QString author READ author WRITE setAuthor) Q_PROPERTY(QString contents READ contents WRITE setContents) Q_PROPERTY(QDateTime created READ created WRITE setCreated) + Q_PROPERTY(double score READ score WRITE setScore) Q_PROPERTY(bool isRead READ isRead WRITE setIsRead) Q_PROPERTY(bool isImportant READ isImportant WRITE setIsImportant) Q_PROPERTY(bool isDeleted READ isDeleted WRITE setIsDeleted) @@ -112,6 +113,9 @@ class MessageObject : public QObject { bool isDeleted() const; void setIsDeleted(bool is_deleted); + double score() const; + void setScore(double score); + private: QSqlDatabase* m_db; QString m_feedCustomId; diff --git a/src/librssguard/core/messagesmodel.cpp b/src/librssguard/core/messagesmodel.cpp index 2e50c7754..65fad1fa7 100644 --- a/src/librssguard/core/messagesmodel.cpp +++ b/src/librssguard/core/messagesmodel.cpp @@ -197,6 +197,8 @@ void MessagesModel::setupHeaderData() { /*: Tooltip for attachments of message.*/ tr("Attachments") << + /*: Tooltip for score of message.*/ tr("Score") << + /*: Tooltip for account ID of message.*/ tr("Account ID") << /*: Tooltip for custom ID of message.*/ tr("Custom ID") << diff --git a/src/librssguard/core/messagesmodelsqllayer.cpp b/src/librssguard/core/messagesmodelsqllayer.cpp index ad192d529..52dad1633 100644 --- a/src/librssguard/core/messagesmodelsqllayer.cpp +++ b/src/librssguard/core/messagesmodelsqllayer.cpp @@ -23,6 +23,7 @@ MessagesModelSqlLayer::MessagesModelSqlLayer() m_fieldNames[MSG_DB_DCREATED_INDEX] = "Messages.date_created"; m_fieldNames[MSG_DB_CONTENTS_INDEX] = "Messages.contents"; m_fieldNames[MSG_DB_ENCLOSURES_INDEX] = "Messages.enclosures"; + m_fieldNames[MSG_DB_SCORE_INDEX] = "Messages.score"; m_fieldNames[MSG_DB_ACCOUNT_ID_INDEX] = "Messages.account_id"; m_fieldNames[MSG_DB_CUSTOM_ID_INDEX] = "Messages.custom_id"; m_fieldNames[MSG_DB_CUSTOM_HASH_INDEX] = "Messages.custom_hash"; @@ -42,6 +43,7 @@ MessagesModelSqlLayer::MessagesModelSqlLayer() m_orderByNames[MSG_DB_DCREATED_INDEX] = "Messages.date_created"; m_orderByNames[MSG_DB_CONTENTS_INDEX] = "Messages.contents"; m_orderByNames[MSG_DB_ENCLOSURES_INDEX] = "Messages.enclosures"; + m_orderByNames[MSG_DB_SCORE_INDEX] = "Messages.score"; m_orderByNames[MSG_DB_ACCOUNT_ID_INDEX] = "Messages.account_id"; m_orderByNames[MSG_DB_CUSTOM_ID_INDEX] = "Messages.custom_id"; m_orderByNames[MSG_DB_CUSTOM_HASH_INDEX] = "Messages.custom_hash"; @@ -49,7 +51,8 @@ MessagesModelSqlLayer::MessagesModelSqlLayer() m_orderByNames[MSG_DB_HAS_ENCLOSURES] = "has_enclosures"; m_numericColumns << MSG_DB_ID_INDEX << MSG_DB_READ_INDEX << MSG_DB_DELETED_INDEX << MSG_DB_PDELETED_INDEX - << MSG_DB_IMPORTANT_INDEX << MSG_DB_ACCOUNT_ID_INDEX << MSG_DB_DCREATED_INDEX; + << MSG_DB_IMPORTANT_INDEX << MSG_DB_ACCOUNT_ID_INDEX << MSG_DB_DCREATED_INDEX + << MSG_DB_SCORE_INDEX; } void MessagesModelSqlLayer::addSortState(int column, Qt::SortOrder order) { diff --git a/src/librssguard/definitions/definitions.h b/src/librssguard/definitions/definitions.h index 183832620..a6dc3cebb 100755 --- a/src/librssguard/definitions/definitions.h +++ b/src/librssguard/definitions/definitions.h @@ -186,11 +186,12 @@ #define MSG_DB_DCREATED_INDEX 9 #define MSG_DB_CONTENTS_INDEX 10 #define MSG_DB_ENCLOSURES_INDEX 11 -#define MSG_DB_ACCOUNT_ID_INDEX 12 -#define MSG_DB_CUSTOM_ID_INDEX 13 -#define MSG_DB_CUSTOM_HASH_INDEX 14 -#define MSG_DB_FEED_TITLE_INDEX 15 -#define MSG_DB_HAS_ENCLOSURES 16 +#define MSG_DB_SCORE_INDEX 12 +#define MSG_DB_ACCOUNT_ID_INDEX 13 +#define MSG_DB_CUSTOM_ID_INDEX 14 +#define MSG_DB_CUSTOM_HASH_INDEX 15 +#define MSG_DB_FEED_TITLE_INDEX 16 +#define MSG_DB_HAS_ENCLOSURES 17 // Indexes of columns as they are DEFINED IN THE TABLE for CATEGORIES. #define CAT_DB_ID_INDEX 0 diff --git a/src/librssguard/gui/messagesview.cpp b/src/librssguard/gui/messagesview.cpp index faf61038f..5359ab7e8 100644 --- a/src/librssguard/gui/messagesview.cpp +++ b/src/librssguard/gui/messagesview.cpp @@ -629,6 +629,7 @@ void MessagesView::adjustColumns() { hideColumn(MSG_DB_CONTENTS_INDEX); hideColumn(MSG_DB_PDELETED_INDEX); hideColumn(MSG_DB_ENCLOSURES_INDEX); + hideColumn(MSG_DB_SCORE_INDEX); hideColumn(MSG_DB_ACCOUNT_ID_INDEX); hideColumn(MSG_DB_CUSTOM_ID_INDEX); hideColumn(MSG_DB_CUSTOM_HASH_INDEX); diff --git a/src/librssguard/miscellaneous/databasequeries.cpp b/src/librssguard/miscellaneous/databasequeries.cpp index 9dd5e9968..5ccf76e35 100755 --- a/src/librssguard/miscellaneous/databasequeries.cpp +++ b/src/librssguard/miscellaneous/databasequeries.cpp @@ -910,13 +910,13 @@ int DatabaseQueries::updateMessages(QSqlDatabase db, // Used to insert new messages. query_insert.setForwardOnly(true); query_insert.prepare("INSERT INTO Messages " - "(feed, title, is_read, is_important, is_deleted, url, author, date_created, contents, enclosures, custom_id, custom_hash, account_id) " - "VALUES (:feed, :title, :is_read, :is_important, :is_deleted, :url, :author, :date_created, :contents, :enclosures, :custom_id, :custom_hash, :account_id);"); + "(feed, title, is_read, is_important, is_deleted, url, author, score, date_created, contents, enclosures, custom_id, custom_hash, account_id) " + "VALUES (:feed, :title, :is_read, :is_important, :is_deleted, :url, :author, :score, :date_created, :contents, :enclosures, :custom_id, :custom_hash, :account_id);"); // Used to update existing messages. query_update.setForwardOnly(true); query_update.prepare("UPDATE Messages " - "SET title = :title, is_read = :is_read, is_important = :is_important, is_deleted = :is_deleted, url = :url, author = :author, date_created = :date_created, contents = :contents, enclosures = :enclosures, feed = :feed " + "SET title = :title, is_read = :is_read, is_important = :is_important, is_deleted = :is_deleted, url = :url, author = :author, score = :score, date_created = :date_created, contents = :contents, enclosures = :enclosures, feed = :feed " "WHERE id = :id;"); if (use_transactions && !query_begin_transaction.exec(qApp->database()->obtainBeginTransactionSql())) { @@ -1091,6 +1091,7 @@ int DatabaseQueries::updateMessages(QSqlDatabase db, query_update.bindValue(QSL(":contents"), unnulifyString(message.m_contents)); query_update.bindValue(QSL(":enclosures"), Enclosures::encodeEnclosuresToString(message.m_enclosures)); query_update.bindValue(QSL(":feed"), unnulifyString(feed_id_existing_message)); + query_update.bindValue(QSL(":score"), message.m_score); query_update.bindValue(QSL(":id"), id_existing_message); *any_message_changed = true; @@ -1129,6 +1130,7 @@ int DatabaseQueries::updateMessages(QSqlDatabase db, query_insert.bindValue(QSL(":enclosures"), Enclosures::encodeEnclosuresToString(message.m_enclosures)); query_insert.bindValue(QSL(":custom_id"), unnulifyString(message.m_customId)); query_insert.bindValue(QSL(":custom_hash"), unnulifyString(message.m_customHash)); + query_insert.bindValue(QSL(":score"), message.m_score); query_insert.bindValue(QSL(":account_id"), account_id); if (query_insert.exec() && query_insert.numRowsAffected() == 1) { @@ -1673,6 +1675,10 @@ void DatabaseQueries::createOverwriteFeed(const QSqlDatabase& db, Feed* feed, in } else { feed->setId(q.lastInsertId().toInt()); + + if (feed->customId().isEmpty()) { + feed->setCustomId(QString::number(feed->id())); + } } } @@ -1691,7 +1697,7 @@ void DatabaseQueries::createOverwriteFeed(const QSqlDatabase& db, Feed* feed, in q.bindValue(QSL(":update_type"), int(feed->autoUpdateType())); q.bindValue(QSL(":update_interval"), feed->autoUpdateInitialInterval()); q.bindValue(QSL(":account_id"), account_id); - q.bindValue(QSL(":custom_id"), feed->customId().isEmpty() ? QString::number(feed->id()) : feed->customId()); + q.bindValue(QSL(":custom_id"), feed->customId()); q.bindValue(QSL(":id"), feed->id()); auto custom_data = feed->customDatabaseData(); diff --git a/src/librssguard/services/abstract/rootitem.cpp b/src/librssguard/services/abstract/rootitem.cpp index 93e2b48f3..dfa4c0df3 100644 --- a/src/librssguard/services/abstract/rootitem.cpp +++ b/src/librssguard/services/abstract/rootitem.cpp @@ -22,6 +22,7 @@ RootItem::RootItem(const RootItem& other) : RootItem(nullptr) { setId(other.id()); setCustomId(other.customId()); setIcon(other.icon()); + setKeepOnTop(other.keepOnTop()); // NOTE: We do not need to clone childs, because that would mean that // either source or target item tree would get corrupted. diff --git a/src/librssguard/services/gmail/gmailserviceroot.cpp b/src/librssguard/services/gmail/gmailserviceroot.cpp index 6ff022345..ff3750f65 100644 --- a/src/librssguard/services/gmail/gmailserviceroot.cpp +++ b/src/librssguard/services/gmail/gmailserviceroot.cpp @@ -83,8 +83,6 @@ QList GmailServiceRoot::obtainNewMessages(const QList& feeds, bo if (error == Feed::Status::NetworkError || error == Feed::Status::AuthError || error == Feed::Status::ParsingError) { *error_during_obtaining = true; } - - return messages; } return messages; diff --git a/src/librssguard/services/standard/standardserviceroot.cpp b/src/librssguard/services/standard/standardserviceroot.cpp index c2b75c048..63b913a7a 100644 --- a/src/librssguard/services/standard/standardserviceroot.cpp +++ b/src/librssguard/services/standard/standardserviceroot.cpp @@ -352,6 +352,9 @@ bool StandardServiceRoot::mergeImportExportModel(FeedsImportExportModel* model, target_root_node->getParentServiceRoot()->accountId(), target_parent->id()); requestItemReassignment(new_category, target_parent); + + original_parents.push(new_category); + new_parents.push(source_category); } catch (ApplicationException& ex) { // Add category failed, but this can mean that the same category (with same title)