SQL refactoring.
This commit is contained in:
parent
ef2438e3bc
commit
ebb498f7b2
|
@ -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() {
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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);
|
||||
|
|
Loading…
Reference in New Issue