SQL refactoring.

This commit is contained in:
Martin Rotter 2016-04-05 08:00:00 +02:00
parent 74194ea6a6
commit 78d6301f35
4 changed files with 52 additions and 71 deletions

View File

@ -26,10 +26,6 @@
#include "services/abstract/serviceroot.h"
#include "miscellaneous/databasequeries.h"
#include <QSqlRecord>
#include <QSqlError>
#include <QSqlQuery>
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>() << 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<QPair<Message,RootItem::Importance> > 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 {

View File

@ -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 <QScrollBar>
#include <QToolBar>
#include <QSqlQuery>
#include <QToolTip>
@ -136,14 +136,9 @@ void MessagePreviewer::markMessageAsRead() {
if (m_root->getParentServiceRoot()->onBeforeSetMessagesRead(m_root.data(),
QList<Message>() << 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<Message>() << m_message,
RootItem::Read);
@ -161,14 +156,9 @@ void MessagePreviewer::markMessageAsUnread() {
if (m_root->getParentServiceRoot()->onBeforeSetMessagesRead(m_root.data(),
QList<Message>() << 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<Message>() << 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>() << ImportanceChange(m_message,

View File

@ -20,35 +20,50 @@
#include <QVariant>
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() {

View File

@ -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();