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) { bool DatabaseQueries::markMessagesRead(QSqlDatabase db, const QStringList &ids, RootItem::ReadStatus read) {
QSqlQuery query_read_msg(db); QSqlQuery q(db);
query_read_msg.setForwardOnly(true); q.setForwardOnly(true);
return query_read_msg.exec(QString(QSL("UPDATE Messages SET is_read = %2 WHERE id IN (%1);")) 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"))); .arg(ids.join(QSL(", ")), read == RootItem::Read ? QSL("1") : QSL("0")));
} }
bool DatabaseQueries::markMessageImportant(QSqlDatabase db, int id, RootItem::Importance importance) { bool DatabaseQueries::markMessageImportant(QSqlDatabase db, int id, RootItem::Importance importance) {
QSqlQuery q;(db); QSqlQuery q(db);
q.setForwardOnly(true); q.setForwardOnly(true);
if (!q.prepare(QSL("UPDATE Messages SET is_important = :important WHERE id = :id;"))) { 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(); 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) { bool DatabaseQueries::switchMessagesImportance(QSqlDatabase db, const QStringList &ids) {
QSqlQuery q(db); QSqlQuery q(db);
q.setForwardOnly(true); q.setForwardOnly(true);
@ -68,41 +80,51 @@ bool DatabaseQueries::deleteOrRestoreMessagesToFromBin(QSqlDatabase db, const QS
QString::number(deleted ? 1 : 0))); QString::number(deleted ? 1 : 0)));
} }
bool DatabaseQueries::purgeImportantMessages(QSqlDatabase db) { bool DatabaseQueries::restoreBin(QSqlDatabase db, int account_id) {
QSqlQuery query = QSqlQuery(db); QSqlQuery q(db);
query.setForwardOnly(true); q.setForwardOnly(true);
query.prepare(QSL("DELETE FROM Messages WHERE is_important = 1;")); 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) { bool DatabaseQueries::purgeReadMessages(QSqlDatabase db) {
QSqlQuery query = QSqlQuery(db); QSqlQuery q(db);
query.setForwardOnly(true); q.setForwardOnly(true);
query.prepare(QSL("DELETE FROM Messages WHERE is_important = :is_important AND is_deleted = :is_deleted AND is_read = :is_read;")); q.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); q.bindValue(QSL(":is_read"), 1);
// Remove only messages which are NOT in recycle bin. // 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. // 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) { 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(); const qint64 since_epoch = QDateTime::currentDateTimeUtc().addDays(-older_than_days).toMSecsSinceEpoch();
query.setForwardOnly(true); q.setForwardOnly(true);
query.prepare(QSL("DELETE FROM Messages WHERE is_important = :is_important AND date_created < :date_created;")); q.prepare(QSL("DELETE FROM Messages WHERE is_important = :is_important AND date_created < :date_created;"));
query.bindValue(QSL(":date_created"), since_epoch); q.bindValue(QSL(":date_created"), since_epoch);
// Remove only messages which are NOT starred. // 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) { 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; QList<Message> messages;
QSqlQuery q(db); QSqlQuery q(db);
q.setForwardOnly(true); q.setForwardOnly(true);
@ -257,6 +279,39 @@ QList<Message> DatabaseQueries::getUndeletedMessages(QSqlDatabase db, int feed_c
return messages; 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, int DatabaseQueries::updateMessages(QSqlDatabase db,
const QList<Message> &messages, const QList<Message> &messages,
int feed_custom_id, int feed_custom_id,
@ -444,5 +499,22 @@ int DatabaseQueries::updateMessages(QSqlDatabase db,
return updated_messages; 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() { DatabaseQueries::DatabaseQueries() {
} }

View file

@ -27,9 +27,11 @@ class DatabaseQueries {
public: public:
static bool markMessagesRead(QSqlDatabase db, const QStringList &ids, 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 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 switchMessagesImportance(QSqlDatabase db, const QStringList &ids);
static bool permanentlyDeleteMessages(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 deleteOrRestoreMessagesToFromBin(QSqlDatabase db, const QStringList &ids, bool deleted);
static bool restoreBin(QSqlDatabase db, int account_id);
static bool purgeImportantMessages(QSqlDatabase db); static bool purgeImportantMessages(QSqlDatabase db);
static bool purgeReadMessages(QSqlDatabase db); static bool purgeReadMessages(QSqlDatabase db);
static bool purgeOldMessages(QSqlDatabase db, int older_than_days); 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, static int getMessageCountsForFeed(QSqlDatabase db, int feed_custom_id, int account_id,
bool including_total_counts, bool *ok = NULL); bool including_total_counts, bool *ok = NULL);
static int getMessageCountsForBin(QSqlDatabase db, 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, 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); 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: private:
explicit DatabaseQueries(); explicit DatabaseQueries();

View file

@ -36,7 +36,7 @@ Feed::~Feed() {
QList<Message> Feed::undeletedMessages() const { QList<Message> Feed::undeletedMessages() const {
QSqlDatabase database = qApp->database()->connection(metaObject()->className(), DatabaseFactory::FromSettings); 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 { 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> RecycleBin::undeletedMessages() const {
QList<Message> messages;
const int account_id = getParentServiceRoot()->accountId(); const int account_id = getParentServiceRoot()->accountId();
QSqlDatabase database = qApp->database()->connection(metaObject()->className(), DatabaseFactory::FromSettings); QSqlDatabase database = qApp->database()->connection(metaObject()->className(), DatabaseFactory::FromSettings);
QSqlQuery query_read_msg(database);
query_read_msg.setForwardOnly(true); return DatabaseQueries::getUndeletedMessagesForBin(database, account_id);
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;
} }
bool RecycleBin::markAsReadUnread(RootItem::ReadStatus status) { bool RecycleBin::markAsReadUnread(RootItem::ReadStatus status) {
QSqlDatabase db_handle = qApp->database()->connection(metaObject()->className(), DatabaseFactory::FromSettings); QSqlDatabase database = qApp->database()->connection(metaObject()->className(), DatabaseFactory::FromSettings);
QSqlQuery query_read_msg(db_handle);
ServiceRoot *parent_root = getParentServiceRoot(); ServiceRoot *parent_root = getParentServiceRoot();
query_read_msg.setForwardOnly(true); if (DatabaseQueries::markBinReadUnread(database, parent_root->accountId(), status)) {
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()) {
updateCounts(false); updateCounts(false);
parent_root->itemChanged(QList<RootItem*>() << this); parent_root->itemChanged(QList<RootItem*>() << this);
parent_root->requestReloadMessageList(status == RootItem::Read); parent_root->requestReloadMessageList(status == RootItem::Read);
return true; return true;
@ -136,23 +106,10 @@ bool RecycleBin::markAsReadUnread(RootItem::ReadStatus status) {
} }
bool RecycleBin::cleanMessages(bool clear_only_read) { 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(); ServiceRoot *parent_root = getParentServiceRoot();
QSqlQuery query_empty_bin(db_handle);
query_empty_bin.setForwardOnly(true); if (DatabaseQueries::cleanMessagesFromBin(database, clear_only_read, parent_root->accountId())) {
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()) {
updateCounts(true); updateCounts(true);
parent_root->itemChanged(QList<RootItem*>() << this); parent_root->itemChanged(QList<RootItem*>() << this);
parent_root->requestReloadMessageList(true); parent_root->requestReloadMessageList(true);
@ -168,16 +125,10 @@ bool RecycleBin::empty() {
} }
bool RecycleBin::restore() { 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(); ServiceRoot *parent_root = getParentServiceRoot();
QSqlQuery query_empty_bin(db_handle);
query_empty_bin.setForwardOnly(true); if (DatabaseQueries::restoreBin(database, parent_root->accountId())) {
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()) {
parent_root->updateCounts(true); parent_root->updateCounts(true);
parent_root->itemChanged(parent_root->getSubTree()); parent_root->itemChanged(parent_root->getSubTree());
parent_root->requestReloadMessageList(true); parent_root->requestReloadMessageList(true);