diff --git a/src/librssguard/core/messagesmodelsqllayer.cpp b/src/librssguard/core/messagesmodelsqllayer.cpp index 0eb58236a..d177b32bc 100644 --- a/src/librssguard/core/messagesmodelsqllayer.cpp +++ b/src/librssguard/core/messagesmodelsqllayer.cpp @@ -12,7 +12,7 @@ MessagesModelSqlLayer::MessagesModelSqlLayer() m_db = qApp->database()->driver()->connection(QSL("MessagesModel")); // Used in : SELECT , FROM ....; - m_fieldNames = DatabaseQueries::messageTableAttributes(false); + m_fieldNames = DatabaseQueries::messageTableAttributes(false, m_db.driverName() == QSL(APP_DB_SQLITE_DRIVER)); // Used in : SELECT ... FROM ... ORDER BY DESC, ASC; m_orderByNames[MSG_DB_ID_INDEX] = QSL("Messages.id"); diff --git a/src/librssguard/database/databasequeries.cpp b/src/librssguard/database/databasequeries.cpp index 3ce6739ce..a92cbc365 100644 --- a/src/librssguard/database/databasequeries.cpp +++ b/src/librssguard/database/databasequeries.cpp @@ -13,7 +13,7 @@ #include #include -QMap DatabaseQueries::messageTableAttributes(bool only_msg_table) { +QMap DatabaseQueries::messageTableAttributes(bool only_msg_table, bool is_sqlite) { QMap field_names; field_names[MSG_DB_ID_INDEX] = QSL("Messages.id"); @@ -38,7 +38,17 @@ QMap DatabaseQueries::messageTableAttributes(bool only_msg_table) "ELSE 'false' " "END AS has_enclosures"); - field_names[MSG_DB_LABELS] = QSL("1 as msg_labels"); + if (is_sqlite) { + field_names[MSG_DB_LABELS] = + QSL("(SELECT GROUP_CONCAT(Labels.name) FROM Labels WHERE Messages.labels LIKE \"%.\" || " + "Labels.custom_id || \".%\") as msg_labels"); + } + else { + field_names[MSG_DB_LABELS] = + QSL("(SELECT GROUP_CONCAT(Labels.name) FROM Labels WHERE Messages.labels LIKE CONCAT(\"%.\", " + "Labels.custom_id, \".%\")) as msg_labels"); + } + field_names[MSG_DB_LABELS_IDS] = QSL("Messages.labels"); // TODO: zpomaluje zobrazení seznamu zpráv @@ -877,7 +887,9 @@ QList DatabaseQueries::getUndeletedMessagesWithLabel(const QSqlDatabase " Messages.is_pdeleted = 0 AND " " Messages.account_id = :account_id AND " " Messages.labels LIKE :label;") - .arg(messageTableAttributes(true).values().join(QSL(", ")))); + .arg(messageTableAttributes(true, db.driverName() == QSL(APP_DB_SQLITE_DRIVER)) + .values() + .join(QSL(", ")))); q.bindValue(QSL(":account_id"), label->getParentServiceRoot()->accountId()); q.bindValue(QSL(":label"), QSL("%.%1.%").arg(label->customId())); @@ -917,7 +929,9 @@ QList DatabaseQueries::getUndeletedLabelledMessages(const QSqlDatabase& " Messages.is_pdeleted = 0 AND " " Messages.account_id = :account_id AND " " LENGTH(Messages.labels) > 2;") - .arg(messageTableAttributes(true).values().join(QSL(", ")))); + .arg(messageTableAttributes(true, db.driverName() == QSL(APP_DB_SQLITE_DRIVER)) + .values() + .join(QSL(", ")))); q.bindValue(QSL(":account_id"), account_id); if (q.exec()) { @@ -954,7 +968,9 @@ QList DatabaseQueries::getUndeletedImportantMessages(const QSqlDatabase "FROM Messages " "WHERE is_important = 1 AND is_deleted = 0 AND " " is_pdeleted = 0 AND account_id = :account_id;") - .arg(messageTableAttributes(true).values().join(QSL(", ")))); + .arg(messageTableAttributes(true, db.driverName() == QSL(APP_DB_SQLITE_DRIVER)) + .values() + .join(QSL(", ")))); q.bindValue(QSL(":account_id"), account_id); if (q.exec()) { @@ -989,7 +1005,9 @@ QList DatabaseQueries::getUndeletedUnreadMessages(const QSqlDatabase& d "FROM Messages " "WHERE is_read = 0 AND is_deleted = 0 AND " " is_pdeleted = 0 AND account_id = :account_id;") - .arg(messageTableAttributes(true).values().join(QSL(", ")))); + .arg(messageTableAttributes(true, db.driverName() == QSL(APP_DB_SQLITE_DRIVER)) + .values() + .join(QSL(", ")))); q.bindValue(QSL(":account_id"), account_id); if (q.exec()) { @@ -1027,7 +1045,9 @@ QList DatabaseQueries::getUndeletedMessagesForFeed(const QSqlDatabase& "FROM Messages " "WHERE is_deleted = 0 AND is_pdeleted = 0 AND " " feed = :feed AND account_id = :account_id;") - .arg(messageTableAttributes(true).values().join(QSL(", ")))); + .arg(messageTableAttributes(true, db.driverName() == QSL(APP_DB_SQLITE_DRIVER)) + .values() + .join(QSL(", ")))); q.bindValue(QSL(":feed"), feed_custom_id); q.bindValue(QSL(":account_id"), account_id); @@ -1062,7 +1082,9 @@ QList DatabaseQueries::getUndeletedMessagesForBin(const QSqlDatabase& d q.prepare(QSL("SELECT %1 " "FROM Messages " "WHERE is_deleted = 1 AND is_pdeleted = 0 AND account_id = :account_id;") - .arg(messageTableAttributes(true).values().join(QSL(", ")))); + .arg(messageTableAttributes(true, db.driverName() == QSL(APP_DB_SQLITE_DRIVER)) + .values() + .join(QSL(", ")))); q.bindValue(QSL(":account_id"), account_id); if (q.exec()) { @@ -1096,7 +1118,9 @@ QList DatabaseQueries::getUndeletedMessagesForAccount(const QSqlDatabas q.prepare(QSL("SELECT %1 " "FROM Messages " "WHERE is_deleted = 0 AND is_pdeleted = 0 AND account_id = :account_id;") - .arg(messageTableAttributes(true).values().join(QSL(", ")))); + .arg(messageTableAttributes(true, db.driverName() == QSL(APP_DB_SQLITE_DRIVER)) + .values() + .join(QSL(", ")))); q.bindValue(QSL(":account_id"), account_id); if (q.exec()) { diff --git a/src/librssguard/database/databasequeries.h b/src/librssguard/database/databasequeries.h index 9347ae455..1a65e7df1 100644 --- a/src/librssguard/database/databasequeries.h +++ b/src/librssguard/database/databasequeries.h @@ -27,7 +27,7 @@ struct ArticleCounts { class DatabaseQueries { public: - static QMap messageTableAttributes(bool only_msg_table); + static QMap messageTableAttributes(bool only_msg_table, bool is_sqlite); // Custom data serializers. static QString serializeCustomData(const QVariantHash& data);