diff --git a/src/core/messagesmodel.cpp b/src/core/messagesmodel.cpp index f6a8fc9e8..110633b28 100755 --- a/src/core/messagesmodel.cpp +++ b/src/core/messagesmodel.cpp @@ -26,10 +26,6 @@ #include "services/abstract/serviceroot.h" #include "miscellaneous/databasequeries.h" -#include -#include -#include - MessagesModel::MessagesModel(QObject *parent) : QSqlTableModel(parent, qApp->database()->connection(QSL("MessagesModel"), DatabaseFactory::FromSettings)), @@ -259,7 +255,7 @@ bool MessagesModel::setMessageRead(int row_index, RootItem::ReadStatus read) { return false; } - if (DatabaseQueries::markMessageRead(database(), message.m_id, read)) { + if (DatabaseQueries::markMessagesRead(database(), QStringList() << QString::number(message.m_id), read)) { return m_selectedItem->getParentServiceRoot()->onAfterSetMessagesRead(m_selectedItem, QList() << message, read); } else { @@ -300,12 +296,9 @@ bool MessagesModel::switchMessageImportance(int row_index) { } bool MessagesModel::switchBatchMessageImportance(const QModelIndexList &messages) { - QSqlQuery query_read_msg(database()); QStringList message_ids; QList > message_states; - query_read_msg.setForwardOnly(true); - // Obtain IDs of all desired messages. foreach (const QModelIndex &message, messages) { const Message msg = messageAt(message.row()); @@ -321,8 +314,7 @@ bool MessagesModel::switchBatchMessageImportance(const QModelIndexList &messages return false; } - if (query_read_msg.exec(QString(QSL("UPDATE Messages SET is_important = NOT is_important WHERE id IN (%1);")) - .arg(message_ids.join(QSL(", "))))) { + if (DatabaseQueries::switchMessagesImportance(database(), message_ids)) { fetchAllData(); return m_selectedItem->getParentServiceRoot()->onAfterSwitchMessageImportance(m_selectedItem, message_states); } @@ -347,19 +339,16 @@ bool MessagesModel::setBatchMessagesDeleted(const QModelIndexList &messages) { return false; } - QSqlQuery query_read_msg(database()); - QString sql_delete_query; - - query_read_msg.setForwardOnly(true); + bool deleted; if (m_selectedItem->kind() != RootItemKind::Bin) { - sql_delete_query = QString(QSL("UPDATE Messages SET is_deleted = 1 WHERE id IN (%1);")).arg(message_ids.join(QSL(", "))); + deleted = DatabaseQueries::deleteOrRestoreMessagesToFromBin(database(), message_ids, true); } else { - sql_delete_query = QString(QSL("UPDATE Messages SET is_pdeleted = 1 WHERE id IN (%1);")).arg(message_ids.join(QSL(", "))); + deleted = DatabaseQueries::permanentlyDeleteMessages(database(), message_ids); } - if (query_read_msg.exec(sql_delete_query)) { + if (deleted) { fetchAllData(); return m_selectedItem->getParentServiceRoot()->onAfterMessagesDelete(m_selectedItem, msgs); } @@ -384,13 +373,8 @@ bool MessagesModel::setBatchMessagesRead(const QModelIndexList &messages, RootIt return false; } - QSqlQuery query_read_msg(database()); - query_read_msg.setForwardOnly(true); - - if (query_read_msg.exec(QString(QSL("UPDATE Messages SET is_read = %2 WHERE id IN (%1);")) - .arg(message_ids.join(QSL(", ")), read == RootItem::Read ? QSL("1") : QSL("0")))) { + if (DatabaseQueries::markMessagesRead(database(), message_ids, read)) { fetchAllData(); - return m_selectedItem->getParentServiceRoot()->onAfterSetMessagesRead(m_selectedItem, msgs, read); } else { @@ -414,14 +398,8 @@ bool MessagesModel::setBatchMessagesRestored(const QModelIndexList &messages) { return false; } - QSqlQuery query_read_msg(database()); - QString sql_delete_query = QString(QSL("UPDATE Messages SET is_deleted = 0 WHERE id IN (%1);")).arg(message_ids.join(QSL(", "))); - - query_read_msg.setForwardOnly(true); - - if (query_read_msg.exec(sql_delete_query)) { + if (DatabaseQueries::deleteOrRestoreMessagesToFromBin(database(), message_ids, false)) { fetchAllData(); - return m_selectedItem->getParentServiceRoot()->onAfterMessagesRestoredFromBin(m_selectedItem, msgs); } else { diff --git a/src/gui/messagepreviewer.cpp b/src/gui/messagepreviewer.cpp index 040af2ed0..b539a4838 100644 --- a/src/gui/messagepreviewer.cpp +++ b/src/gui/messagepreviewer.cpp @@ -19,13 +19,13 @@ #include "miscellaneous/application.h" #include "network-web/webfactory.h" +#include "miscellaneous/databasequeries.h" #include "gui/messagebox.h" #include "gui/dialogs/formmain.h" #include "services/abstract/serviceroot.h" #include #include -#include #include @@ -136,14 +136,9 @@ void MessagePreviewer::markMessageAsRead() { if (m_root->getParentServiceRoot()->onBeforeSetMessagesRead(m_root.data(), QList() << m_message, RootItem::Read)) { - QSqlQuery query_read_msg(qApp->database()->connection(objectName(), DatabaseFactory::FromSettings)); - query_read_msg.setForwardOnly(true); - - query_read_msg.prepare(QSL("UPDATE Messages SET is_read = :read WHERE id = :id;")); - query_read_msg.bindValue(QSL(":id"), m_message.m_id); - query_read_msg.bindValue(QSL(":read"), 1); - query_read_msg.exec(); - + DatabaseQueries::markMessagesRead(qApp->database()->connection(objectName(), DatabaseFactory::FromSettings), + QStringList() << QString::number(m_message.m_id), + RootItem::Read); m_root->getParentServiceRoot()->onAfterSetMessagesRead(m_root.data(), QList() << m_message, RootItem::Read); @@ -161,14 +156,9 @@ void MessagePreviewer::markMessageAsUnread() { if (m_root->getParentServiceRoot()->onBeforeSetMessagesRead(m_root.data(), QList() << m_message, RootItem::Unread)) { - QSqlQuery query_read_msg(qApp->database()->connection(objectName(), DatabaseFactory::FromSettings)); - query_read_msg.setForwardOnly(true); - - query_read_msg.prepare(QSL("UPDATE Messages SET is_read = :read WHERE id = :id;")); - query_read_msg.bindValue(QSL(":id"), m_message.m_id); - query_read_msg.bindValue(QSL(":read"), 0); - query_read_msg.exec(); - + DatabaseQueries::markMessagesRead(qApp->database()->connection(objectName(), DatabaseFactory::FromSettings), + QStringList() << QString::number(m_message.m_id), + RootItem::Unread); m_root->getParentServiceRoot()->onAfterSetMessagesRead(m_root.data(), QList() << m_message, RootItem::Unread); @@ -188,13 +178,8 @@ void MessagePreviewer::switchMessageImportance(bool checked) { m_message.m_isImportant ? RootItem::NotImportant : RootItem::Important))) { - QSqlQuery query_read_msg(qApp->database()->connection(objectName(), DatabaseFactory::FromSettings)); - query_read_msg.setForwardOnly(true); - - query_read_msg.prepare(QSL("UPDATE Messages SET is_important = :important WHERE id = :id;")); - query_read_msg.bindValue(QSL(":id"), m_message.m_id); - query_read_msg.bindValue(QSL(":important"), (int) checked); - query_read_msg.exec(); + DatabaseQueries::switchMessagesImportance(qApp->database()->connection(objectName(), DatabaseFactory::FromSettings), + QStringList() << QString::number(m_message.m_id)); m_root->getParentServiceRoot()->onBeforeSwitchMessageImportance(m_root.data(), QList() << ImportanceChange(m_message, diff --git a/src/miscellaneous/databasequeries.cpp b/src/miscellaneous/databasequeries.cpp index f9501a20f..9598591dd 100644 --- a/src/miscellaneous/databasequeries.cpp +++ b/src/miscellaneous/databasequeries.cpp @@ -20,35 +20,50 @@ #include -bool DatabaseQueries::markMessageRead(QSqlDatabase db, int id, RootItem::ReadStatus read) { +bool DatabaseQueries::markMessagesRead(QSqlDatabase db, const QStringList &ids, RootItem::ReadStatus read) { QSqlQuery query_read_msg(db); query_read_msg.setForwardOnly(true); - if (!query_read_msg.prepare(QSL("UPDATE Messages SET is_read = :read WHERE id = :id;"))) { - qWarning("Query preparation failed for message read change."); - return false; - } - - query_read_msg.bindValue(QSL(":id"), id); - query_read_msg.bindValue(QSL(":read"), (int) read); - - return query_read_msg.exec(); + return query_read_msg.exec(QString(QSL("UPDATE Messages SET is_read = %2 WHERE id IN (%1);")) + .arg(ids.join(QSL(", ")), read == RootItem::Read ? QSL("1") : QSL("0"))); } bool DatabaseQueries::markMessageImportant(QSqlDatabase db, int id, RootItem::Importance importance) { - QSqlQuery query_importance_msg(db); - query_importance_msg.setForwardOnly(true); + QSqlQuery q;(db); + q.setForwardOnly(true); - if (!query_importance_msg.prepare(QSL("UPDATE Messages SET is_important = :important WHERE id = :id;"))) { + if (!q.prepare(QSL("UPDATE Messages SET is_important = :important WHERE id = :id;"))) { qWarning("Query preparation failed for message importance switch."); return false; } - query_importance_msg.bindValue(QSL(":id"), id); - query_importance_msg.bindValue(QSL(":important"), (int) importance); + q.bindValue(QSL(":id"), id); + q.bindValue(QSL(":important"), (int) importance); // Commit changes. - return query_importance_msg.exec(); + return q.exec(); +} + +bool DatabaseQueries::switchMessagesImportance(QSqlDatabase db, const QStringList &ids) { + QSqlQuery q(db); + q.setForwardOnly(true); + + return q.exec(QString(QSL("UPDATE Messages SET is_important = NOT is_important WHERE id IN (%1);")).arg(ids.join(QSL(", ")))); +} + +bool DatabaseQueries::permanentlyDeleteMessages(QSqlDatabase db, const QStringList &ids) { + QSqlQuery q(db); + q.setForwardOnly(true); + + return q.exec(QString(QSL("UPDATE Messages SET is_pdeleted = 1 WHERE id IN (%1);")).arg(ids.join(QSL(", ")))); +} + +bool DatabaseQueries::deleteOrRestoreMessagesToFromBin(QSqlDatabase db, const QStringList &ids, bool deleted) { + QSqlQuery q(db); + q.setForwardOnly(true); + + return q.exec(QString(QSL("UPDATE Messages SET is_deleted = %2 WHERE id IN (%1);")).arg(ids.join(QSL(", ")), + QString::number(deleted ? 1 : 0))); } DatabaseQueries::DatabaseQueries() { diff --git a/src/miscellaneous/databasequeries.h b/src/miscellaneous/databasequeries.h index a73892a5e..2904c04f7 100644 --- a/src/miscellaneous/databasequeries.h +++ b/src/miscellaneous/databasequeries.h @@ -25,8 +25,11 @@ class DatabaseQueries { public: - static bool markMessageRead(QSqlDatabase db, int id, RootItem::ReadStatus read); + static bool markMessagesRead(QSqlDatabase db, const QStringList &ids, RootItem::ReadStatus read); static bool markMessageImportant(QSqlDatabase db, int id, RootItem::Importance importance); + static bool switchMessagesImportance(QSqlDatabase db, const QStringList &ids); + static bool permanentlyDeleteMessages(QSqlDatabase db, const QStringList &ids); + static bool deleteOrRestoreMessagesToFromBin(QSqlDatabase db, const QStringList &ids, bool deleted); private: explicit DatabaseQueries();