1 // For license of this file, see <project-root-folder>/LICENSE.md.
2 
3 #include "database/databasecleaner.h"
4 
5 #include "database/databasequeries.h"
6 #include "miscellaneous/application.h"
7 
8 #include <QDebug>
9 #include <QThread>
10 
DatabaseCleaner(QObject * parent)11 DatabaseCleaner::DatabaseCleaner(QObject* parent) : QObject(parent) {}
12 
purgeDatabaseData(CleanerOrders which_data)13 void DatabaseCleaner::purgeDatabaseData(CleanerOrders which_data) {
14   qDebugNN << LOGSEC_DB << "Performing database cleanup in thread: '" << QThread::currentThreadId() << "'.";
15 
16   // Inform everyone about the start of the process.
17   emit purgeStarted();
18   bool result = true;
19   const int difference = 99 / 12;
20   int progress = 0;
21   QSqlDatabase database = qApp->database()->driver()->connection(metaObject()->className());
22 
23   if (which_data.m_removeReadMessages) {
24     progress += difference;
25     emit purgeProgress(progress, tr("Removing read articles..."));
26 
27     // Remove read messages.
28     result &= purgeReadMessages(database);
29     progress += difference;
30     emit purgeProgress(progress, tr("Read articles purged..."));
31   }
32 
33   if (which_data.m_removeRecycleBin) {
34     progress += difference;
35     emit purgeProgress(progress, tr("Purging recycle bin..."));
36 
37     // Remove read messages.
38     result &= purgeRecycleBin(database);
39     progress += difference;
40     emit purgeProgress(progress, tr("Recycle bin purged..."));
41   }
42 
43   if (which_data.m_removeOldMessages) {
44     progress += difference;
45     emit purgeProgress(progress, tr("Removing old articles..."));
46 
47     // Remove old messages.
48     result &= purgeOldMessages(database, which_data.m_barrierForRemovingOldMessagesInDays);
49     progress += difference;
50     emit purgeProgress(progress, tr("Old articles purged..."));
51   }
52 
53   if (which_data.m_removeStarredMessages) {
54     progress += difference;
55     emit purgeProgress(progress, tr("Removing starred articles..."));
56 
57     // Remove old messages.
58     result &= purgeStarredMessages(database);
59     progress += difference;
60     emit purgeProgress(progress, tr("Starred articles purged..."));
61   }
62 
63   result &= DatabaseQueries::purgeLeftoverLabelAssignments(database);
64 
65   if (which_data.m_shrinkDatabase) {
66     progress += difference;
67     emit purgeProgress(progress, tr("Shrinking database file..."));
68 
69     // Call driver-specific vacuuming function.
70     result &= qApp->database()->driver()->vacuumDatabase();
71     progress += difference;
72     emit purgeProgress(progress, tr("Database file shrinked..."));
73   }
74 
75   emit purgeFinished(result);
76 }
77 
purgeStarredMessages(const QSqlDatabase & database)78 bool DatabaseCleaner::purgeStarredMessages(const QSqlDatabase& database) {
79   return DatabaseQueries::purgeImportantMessages(database);
80 }
81 
purgeReadMessages(const QSqlDatabase & database)82 bool DatabaseCleaner::purgeReadMessages(const QSqlDatabase& database) {
83   return DatabaseQueries::purgeReadMessages(database);
84 }
85 
purgeOldMessages(const QSqlDatabase & database,int days)86 bool DatabaseCleaner::purgeOldMessages(const QSqlDatabase& database, int days) {
87   return DatabaseQueries::purgeOldMessages(database, days);
88 }
89 
purgeRecycleBin(const QSqlDatabase & database)90 bool DatabaseCleaner::purgeRecycleBin(const QSqlDatabase& database) {
91   return DatabaseQueries::purgeRecycleBin(database);
92 }
93