SQL refactoring.

This commit is contained in:
Martin Rotter 2016-04-05 11:31:34 +02:00
parent ef2438e3bc
commit ebb498f7b2
4 changed files with 109 additions and 82 deletions

View File

@ -23,15 +23,15 @@
bool DatabaseQueries::markMessagesRead(QSqlDatabase db, const QStringList &ids, RootItem::ReadStatus read) {
QSqlQuery query_read_msg(db);
query_read_msg.setForwardOnly(true);
QSqlQuery q(db);
q.setForwardOnly(true);
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")));
return q.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 q;(db);
QSqlQuery q(db);
q.setForwardOnly(true);
if (!q.prepare(QSL("UPDATE Messages SET is_important = :important WHERE id = :id;"))) {
@ -46,6 +46,18 @@ bool DatabaseQueries::markMessageImportant(QSqlDatabase db, int id, RootItem::Im
return q.exec();
}
bool DatabaseQueries::markBinReadUnread(QSqlDatabase db, int account_id, RootItem::ReadStatus read) {
QSqlQuery q(db);
q.setForwardOnly(true);
q.prepare("UPDATE Messages SET is_read = :read "
"WHERE is_deleted = 1 AND is_pdeleted = 0 AND account_id = :account_id;");
q.bindValue(QSL(":read"), read == RootItem::Read ? 1 : 0);
q.bindValue(QSL(":account_id"), account_id);
return q.exec();
}
bool DatabaseQueries::switchMessagesImportance(QSqlDatabase db, const QStringList &ids) {
QSqlQuery q(db);
q.setForwardOnly(true);
@ -68,41 +80,51 @@ bool DatabaseQueries::deleteOrRestoreMessagesToFromBin(QSqlDatabase db, const QS
QString::number(deleted ? 1 : 0)));
}
bool DatabaseQueries::purgeImportantMessages(QSqlDatabase db) {
QSqlQuery query = QSqlQuery(db);
query.setForwardOnly(true);
query.prepare(QSL("DELETE FROM Messages WHERE is_important = 1;"));
bool DatabaseQueries::restoreBin(QSqlDatabase db, int account_id) {
QSqlQuery q(db);
q.setForwardOnly(true);
q.prepare("UPDATE Messages SET is_deleted = 0 "
"WHERE is_deleted = 1 AND is_pdeleted = 0 AND account_id = :account_id;");
q.bindValue(QSL(":account_id"), account_id);
return query.exec();
return q.exec();
}
bool DatabaseQueries::purgeImportantMessages(QSqlDatabase db) {
QSqlQuery q(db);
q.setForwardOnly(true);
q.prepare(QSL("DELETE FROM Messages WHERE is_important = 1;"));
return q.exec();
}
bool DatabaseQueries::purgeReadMessages(QSqlDatabase db) {
QSqlQuery query = QSqlQuery(db);
query.setForwardOnly(true);
query.prepare(QSL("DELETE FROM Messages WHERE is_important = :is_important AND is_deleted = :is_deleted AND is_read = :is_read;"));
query.bindValue(QSL(":is_read"), 1);
QSqlQuery q(db);
q.setForwardOnly(true);
q.prepare(QSL("DELETE FROM Messages WHERE is_important = :is_important AND is_deleted = :is_deleted AND is_read = :is_read;"));
q.bindValue(QSL(":is_read"), 1);
// Remove only messages which are NOT in recycle bin.
query.bindValue(QSL(":is_deleted"), 0);
q.bindValue(QSL(":is_deleted"), 0);
// Remove only messages which are NOT starred.
query.bindValue(QSL(":is_important"), 0);
q.bindValue(QSL(":is_important"), 0);
return query.exec();
return q.exec();
}
bool DatabaseQueries::purgeOldMessages(QSqlDatabase db, int older_than_days) {
QSqlQuery query = QSqlQuery(db);
QSqlQuery q = QSqlQuery(db);
const qint64 since_epoch = QDateTime::currentDateTimeUtc().addDays(-older_than_days).toMSecsSinceEpoch();
query.setForwardOnly(true);
query.prepare(QSL("DELETE FROM Messages WHERE is_important = :is_important AND date_created < :date_created;"));
query.bindValue(QSL(":date_created"), since_epoch);
q.setForwardOnly(true);
q.prepare(QSL("DELETE FROM Messages WHERE is_important = :is_important AND date_created < :date_created;"));
q.bindValue(QSL(":date_created"), since_epoch);
// Remove only messages which are NOT starred.
query.bindValue(QSL(":is_important"), 0);
q.bindValue(QSL(":is_important"), 0);
return query.exec();
return q.exec();
}
bool DatabaseQueries::purgeRecycleBin(QSqlDatabase db) {
@ -223,7 +245,7 @@ int DatabaseQueries::getMessageCountsForBin(QSqlDatabase db, int account_id, boo
}
}
QList<Message> DatabaseQueries::getUndeletedMessages(QSqlDatabase db, int feed_custom_id, int account_id, bool *ok) {
QList<Message> DatabaseQueries::getUndeletedMessagesForFeed(QSqlDatabase db, int feed_custom_id, int account_id, bool *ok) {
QList<Message> messages;
QSqlQuery q(db);
q.setForwardOnly(true);
@ -257,6 +279,39 @@ QList<Message> DatabaseQueries::getUndeletedMessages(QSqlDatabase db, int feed_c
return messages;
}
QList<Message> DatabaseQueries::getUndeletedMessagesForBin(QSqlDatabase db, int account_id, bool *ok) {
QList<Message> messages;
QSqlQuery q(db);
q.setForwardOnly(true);
q.prepare("SELECT * "
"FROM Messages "
"WHERE is_deleted = 1 AND is_pdeleted = 0 AND account_id = :account_id;");
q.bindValue(QSL(":account_id"), account_id);
if (q.exec()) {
while (q.next()) {
bool decoded;
Message message = Message::fromSqlRecord(q.record(), &decoded);
if (decoded) {
messages.append(message);
}
}
if (ok != NULL) {
*ok = true;
}
}
else {
if (ok != NULL) {
*ok = false;
}
}
return messages;
}
int DatabaseQueries::updateMessages(QSqlDatabase db,
const QList<Message> &messages,
int feed_custom_id,
@ -444,5 +499,22 @@ int DatabaseQueries::updateMessages(QSqlDatabase db,
return updated_messages;
}
bool DatabaseQueries::cleanMessagesFromBin(QSqlDatabase db, bool clear_only_read, int account_id) {
QSqlQuery query_empty_bin(db);
query_empty_bin.setForwardOnly(true);
if (clear_only_read) {
query_empty_bin.prepare("UPDATE Messages SET is_pdeleted = 1 "
"WHERE is_read = 1 AND is_deleted = 1 AND account_id = :account_id;");
}
else {
query_empty_bin.prepare(QSL("UPDATE Messages SET is_pdeleted = 1 WHERE is_deleted = 1 AND account_id = :account_id;"));
}
query_empty_bin.bindValue(QSL(":account_id"), account_id);
return query_empty_bin.exec();
}
DatabaseQueries::DatabaseQueries() {
}

View File

@ -27,9 +27,11 @@ class DatabaseQueries {
public:
static bool markMessagesRead(QSqlDatabase db, const QStringList &ids, RootItem::ReadStatus read);
static bool markMessageImportant(QSqlDatabase db, int id, RootItem::Importance importance);
static bool markBinReadUnread(QSqlDatabase db, int account_id, RootItem::ReadStatus read);
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);
static bool restoreBin(QSqlDatabase db, int account_id);
static bool purgeImportantMessages(QSqlDatabase db);
static bool purgeReadMessages(QSqlDatabase db);
static bool purgeOldMessages(QSqlDatabase db, int older_than_days);
@ -39,9 +41,11 @@ class DatabaseQueries {
static int getMessageCountsForFeed(QSqlDatabase db, int feed_custom_id, int account_id,
bool including_total_counts, bool *ok = NULL);
static int getMessageCountsForBin(QSqlDatabase db, int account_id, bool including_total_counts, bool *ok = NULL);
static QList<Message> getUndeletedMessages(QSqlDatabase db, int feed_custom_id, int account_id, bool *ok = NULL);
static QList<Message> getUndeletedMessagesForFeed(QSqlDatabase db, int feed_custom_id, int account_id, bool *ok = NULL);
static QList<Message> getUndeletedMessagesForBin(QSqlDatabase db, int account_id, bool *ok = NULL);
static int updateMessages(QSqlDatabase db, const QList<Message> &messages, int feed_custom_id,
int account_id, const QString &url, bool *any_message_changed, bool *ok = NULL);
static bool cleanMessagesFromBin(QSqlDatabase db, bool clear_only_read, int account_id);
private:
explicit DatabaseQueries();

View File

@ -36,7 +36,7 @@ Feed::~Feed() {
QList<Message> Feed::undeletedMessages() const {
QSqlDatabase database = qApp->database()->connection(metaObject()->className(), DatabaseFactory::FromSettings);
return DatabaseQueries::getUndeletedMessages(database, customId(), getParentServiceRoot()->accountId());
return DatabaseQueries::getUndeletedMessagesForFeed(database, customId(), getParentServiceRoot()->accountId());
}
QVariant Feed::data(int column, int role) const {

View File

@ -84,48 +84,18 @@ QList<QAction*> RecycleBin::contextMenu() {
}
QList<Message> RecycleBin::undeletedMessages() const {
QList<Message> messages;
const int account_id = getParentServiceRoot()->accountId();
QSqlDatabase database = qApp->database()->connection(metaObject()->className(), DatabaseFactory::FromSettings);
QSqlQuery query_read_msg(database);
query_read_msg.setForwardOnly(true);
query_read_msg.prepare("SELECT * "
"FROM Messages "
"WHERE is_deleted = 1 AND is_pdeleted = 0 AND account_id = :account_id;");
query_read_msg.bindValue(QSL(":account_id"), account_id);
if (query_read_msg.exec()) {
while (query_read_msg.next()) {
bool decoded;
Message message = Message::fromSqlRecord(query_read_msg.record(), &decoded);
if (decoded) {
messages.append(message);
}
messages.append(message);
}
}
return messages;
return DatabaseQueries::getUndeletedMessagesForBin(database, account_id);
}
bool RecycleBin::markAsReadUnread(RootItem::ReadStatus status) {
QSqlDatabase db_handle = qApp->database()->connection(metaObject()->className(), DatabaseFactory::FromSettings);
QSqlQuery query_read_msg(db_handle);
QSqlDatabase database = qApp->database()->connection(metaObject()->className(), DatabaseFactory::FromSettings);
ServiceRoot *parent_root = getParentServiceRoot();
query_read_msg.setForwardOnly(true);
query_read_msg.prepare("UPDATE Messages SET is_read = :read "
"WHERE is_deleted = 1 AND is_pdeleted = 0 AND account_id = :account_id;");
query_read_msg.bindValue(QSL(":read"), status == RootItem::Read ? 1 : 0);
query_read_msg.bindValue(QSL(":account_id"), parent_root->accountId());
if (query_read_msg.exec()) {
if (DatabaseQueries::markBinReadUnread(database, parent_root->accountId(), status)) {
updateCounts(false);
parent_root->itemChanged(QList<RootItem*>() << this);
parent_root->requestReloadMessageList(status == RootItem::Read);
return true;
@ -136,23 +106,10 @@ bool RecycleBin::markAsReadUnread(RootItem::ReadStatus status) {
}
bool RecycleBin::cleanMessages(bool clear_only_read) {
QSqlDatabase db_handle = qApp->database()->connection(metaObject()->className(), DatabaseFactory::FromSettings);
QSqlDatabase database = qApp->database()->connection(metaObject()->className(), DatabaseFactory::FromSettings);
ServiceRoot *parent_root = getParentServiceRoot();
QSqlQuery query_empty_bin(db_handle);
query_empty_bin.setForwardOnly(true);
if (clear_only_read) {
query_empty_bin.prepare("UPDATE Messages SET is_pdeleted = 1 "
"WHERE is_read = 1 AND is_deleted = 1 AND account_id = :account_id;");
}
else {
query_empty_bin.prepare(QSL("UPDATE Messages SET is_pdeleted = 1 WHERE is_deleted = 1 AND account_id = :account_id;"));
}
query_empty_bin.bindValue(QSL(":account_id"), parent_root->accountId());
if (query_empty_bin.exec()) {
if (DatabaseQueries::cleanMessagesFromBin(database, clear_only_read, parent_root->accountId())) {
updateCounts(true);
parent_root->itemChanged(QList<RootItem*>() << this);
parent_root->requestReloadMessageList(true);
@ -168,16 +125,10 @@ bool RecycleBin::empty() {
}
bool RecycleBin::restore() {
QSqlDatabase db_handle = qApp->database()->connection(metaObject()->className(), DatabaseFactory::FromSettings);
QSqlDatabase database = qApp->database()->connection(metaObject()->className(), DatabaseFactory::FromSettings);
ServiceRoot *parent_root = getParentServiceRoot();
QSqlQuery query_empty_bin(db_handle);
query_empty_bin.setForwardOnly(true);
query_empty_bin.prepare("UPDATE Messages SET is_deleted = 0 "
"WHERE is_deleted = 1 AND is_pdeleted = 0 AND account_id = :account_id;");
query_empty_bin.bindValue(QSL(":account_id"), parent_root->accountId());
if (query_empty_bin.exec()) {
if (DatabaseQueries::restoreBin(database, parent_root->accountId())) {
parent_root->updateCounts(true);
parent_root->itemChanged(parent_root->getSubTree());
parent_root->requestReloadMessageList(true);