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"