File indexing completed on 2024-05-26 05:14:40

0001 /*
0002     This file is part of Akonadi
0003 
0004     SPDX-FileCopyrightText: 2022-2024 Laurent Montel <montel@kde.org>
0005 
0006     SPDX-License-Identifier: LGPL-2.0-or-later
0007 */
0008 #include "clearcachefoldersjob.h"
0009 #include "akonadiwidgets_debug.h"
0010 #include "dbaccess.h"
0011 #include <KLocalizedString>
0012 #include <KMessageBox>
0013 #include <QSqlError>
0014 #include <QSqlQuery>
0015 
0016 using namespace Akonadi;
0017 ClearCacheFoldersJob::ClearCacheFoldersJob(const Akonadi::Collection &folder, QObject *parent)
0018     : ClearCacheFoldersJob(Akonadi::Collection::List{folder}, parent)
0019 {
0020 }
0021 
0022 ClearCacheFoldersJob::ClearCacheFoldersJob(const Akonadi::Collection::List &folders, QObject *parent)
0023     : QObject{parent}
0024 {
0025     mCollections = folders;
0026     mNumberJob = folders.length();
0027     connect(this, &ClearCacheFoldersJob::clearNextFolder, this, &ClearCacheFoldersJob::slotClearNextFolder);
0028 }
0029 
0030 ClearCacheFoldersJob::~ClearCacheFoldersJob() = default;
0031 
0032 void ClearCacheFoldersJob::slotClearNextFolder()
0033 {
0034     if (mCanceled) {
0035         Q_EMIT clearCacheDone();
0036         Q_EMIT finished(false);
0037         deleteLater();
0038         return;
0039     }
0040     if (mNumberJob == -1) {
0041         KMessageBox::information(mParentWidget, i18n("Collection cache cleared. You should restart Akonadi now."));
0042         Q_EMIT clearCacheDone();
0043         Q_EMIT finished(true);
0044         deleteLater();
0045         return;
0046     }
0047     if (!mCollections.at(mNumberJob).isValid()) {
0048         Q_EMIT clearCacheDone();
0049         Q_EMIT finished(false);
0050         deleteLater();
0051         return;
0052     }
0053 
0054     const auto akonadiId = mCollections.at(mNumberJob).id();
0055     const auto ridCount = QStringLiteral("SELECT COUNT(*) FROM PimItemTable WHERE collectionId=%1 AND remoteId=''").arg(akonadiId);
0056     QSqlQuery query(DbAccess::database());
0057     if (!query.exec(ridCount)) {
0058         qCWarning(AKONADIWIDGETS_LOG) << "Failed to execute query" << ridCount << ":" << query.lastError().text();
0059         KMessageBox::error(mParentWidget, query.lastError().text());
0060         Q_EMIT finished(false);
0061         deleteLater();
0062         return;
0063     }
0064 
0065     query.next();
0066     const int emptyRidCount = query.value(0).toInt();
0067     if (emptyRidCount > 0) {
0068         if (KMessageBox::warningContinueCancel(mParentWidget,
0069                                                i18n("The collection '%1' contains %2 items without Remote ID. "
0070                                                     "Those items were likely never uploaded to the destination server, "
0071                                                     "so clearing this collection means that those <b>data will be lost</b>. "
0072                                                     "Are you sure you want to proceed?",
0073                                                     QString::number(akonadiId),
0074                                                     QString::number(emptyRidCount)),
0075                                                QStringLiteral("POSSIBLE DATA LOSS!"))
0076             == KMessageBox::Cancel) {
0077             Q_EMIT finished(false);
0078             deleteLater();
0079             return;
0080         }
0081     }
0082 
0083     const QString str = QStringLiteral("DELETE FROM PimItemTable WHERE collectionId=%1").arg(akonadiId);
0084     // qCWarning(AKONADIWIDGETS_LOG) << str;
0085     query = QSqlQuery(str, DbAccess::database());
0086     if (query.exec()) {
0087         const auto lastError = query.lastError();
0088         if (lastError.isValid()) {
0089             qCWarning(AKONADIWIDGETS_LOG) << lastError;
0090             KMessageBox::error(mParentWidget, lastError.text());
0091         }
0092     }
0093     mNumberJob--;
0094     Q_EMIT clearNextFolder();
0095 }
0096 
0097 bool ClearCacheFoldersJob::canceled() const
0098 {
0099     return mCanceled;
0100 }
0101 
0102 void ClearCacheFoldersJob::setCanceled(bool newCanceled)
0103 {
0104     mCanceled = newCanceled;
0105 }
0106 
0107 void ClearCacheFoldersJob::start()
0108 {
0109     if (!canStart()) {
0110         deleteLater();
0111         Q_EMIT finished(false);
0112         return;
0113     }
0114     mNumberJob--;
0115     Q_EMIT clearNextFolder();
0116 }
0117 
0118 bool ClearCacheFoldersJob::canStart() const
0119 {
0120     return !mCollections.isEmpty();
0121 }
0122 
0123 QWidget *ClearCacheFoldersJob::parentWidget() const
0124 {
0125     return mParentWidget;
0126 }
0127 
0128 void ClearCacheFoldersJob::setParentWidget(QWidget *newParentWidget)
0129 {
0130     mParentWidget = newParentWidget;
0131 }
0132 
0133 #include "moc_clearcachefoldersjob.cpp"