File indexing completed on 2024-05-19 04:23:37
0001 // SPDX-FileCopyrightText: 2005-2010 Jesper K. Pedersen <jesper.pedersen@kdab.com> 0002 // SPDX-FileCopyrightText: 2007 Dirk Mueller <mueller@kde.org> 0003 // SPDX-FileCopyrightText: 2007-2008 Laurent Montel <montel@kde.org> 0004 // SPDX-FileCopyrightText: 2012 Miika Turkia <miika.turkia@gmail.com> 0005 // SPDX-FileCopyrightText: 2012-2023 Johannes Zarl-Zierl <johannes@zarl-zierl.at> 0006 // SPDX-FileCopyrightText: 2020 Tobias Leupold <tl@stonemx.de> 0007 // 0008 // SPDX-License-Identifier: GPL-2.0-or-later 0009 0010 #include "NumberedBackup.h" 0011 0012 #include <Utilities/FileUtil.h> 0013 #include <kpabase/Logging.h> 0014 #include <kpabase/SettingsData.h> 0015 #include <kpabase/UIDelegate.h> 0016 0017 #include <KLocalizedString> 0018 #include <KZip> 0019 #include <QDir> 0020 #include <QRegExp> 0021 0022 DB::NumberedBackup::NumberedBackup(DB::UIDelegate &ui) 0023 : m_ui(ui) 0024 { 0025 } 0026 0027 void DB::NumberedBackup::makeNumberedBackup() 0028 { 0029 deleteOldBackupFiles(); 0030 0031 const QString fileName = QStringLiteral("index.xml~%1~").arg(getMaxId() + 1, 4, 10, QLatin1Char('0')); 0032 0033 if (!QFileInfo::exists(QStringLiteral("%1/index.xml").arg(Settings::SettingsData::instance()->imageDirectory()))) 0034 return; 0035 0036 if (Settings::SettingsData::instance()->compressBackup()) { 0037 const QString fileNameWithExt = fileName + QLatin1String(".zip"); 0038 const QString fileAndDir = QStringLiteral("%1/%2").arg(Settings::SettingsData::instance()->imageDirectory(), fileNameWithExt); 0039 KZip zip(fileAndDir); 0040 if (!zip.open(QIODevice::WriteOnly)) { 0041 m_ui.error(DB::LogMessage { DBLog(), QStringLiteral("Error creating zip file %1").arg(fileAndDir) }, i18n("Error creating zip file %1", fileAndDir), i18n("Error Making Numbered Backup")); 0042 return; 0043 } 0044 0045 if (!zip.addLocalFile(QStringLiteral("%1/index.xml").arg(Settings::SettingsData::instance()->imageDirectory()), fileName)) { 0046 m_ui.error(DB::LogMessage { DBLog(), QStringLiteral("Error writing file %1 to zip file %2").arg(fileName, fileAndDir) }, i18n("Error writing file %1 to zip file %2", fileName, fileAndDir), i18n("Error Making Numbered Backup")); 0047 } 0048 zip.close(); 0049 } else { 0050 Utilities::copyOrOverwrite(QStringLiteral("%1/index.xml").arg(Settings::SettingsData::instance()->imageDirectory()), 0051 QStringLiteral("%1/%2").arg(Settings::SettingsData::instance()->imageDirectory(), fileName)); 0052 } 0053 } 0054 0055 int DB::NumberedBackup::getMaxId() const 0056 { 0057 const QStringList files = backupFiles(); 0058 int max = 0; 0059 for (QStringList::ConstIterator fileIt = files.constBegin(); fileIt != files.constEnd(); ++fileIt) { 0060 bool OK; 0061 max = qMax(max, idForFile(*fileIt, OK)); 0062 } 0063 return max; 0064 } 0065 0066 QStringList DB::NumberedBackup::backupFiles() const 0067 { 0068 QDir dir(Settings::SettingsData::instance()->imageDirectory()); 0069 return dir.entryList(QStringList() << QStringLiteral("index.xml~*~*"), QDir::Files); 0070 } 0071 0072 int DB::NumberedBackup::idForFile(const QString &fileName, bool &OK) const 0073 { 0074 QRegExp reg(QStringLiteral("index\\.xml~([0-9]+)~(.zip)?")); 0075 if (reg.exactMatch(fileName)) { 0076 OK = true; 0077 return reg.cap(1).toInt(); 0078 } else { 0079 OK = false; 0080 return -1; 0081 } 0082 } 0083 0084 void DB::NumberedBackup::deleteOldBackupFiles() 0085 { 0086 int maxId = getMaxId(); 0087 int maxBackupFiles = Settings::SettingsData::instance()->backupCount(); 0088 if (maxBackupFiles == -1) 0089 return; 0090 0091 QStringList files = backupFiles(); 0092 0093 for (QStringList::ConstIterator fileIt = files.constBegin(); fileIt != files.constEnd(); ++fileIt) { 0094 bool OK; 0095 int num = idForFile(*fileIt, OK); 0096 if (OK && num <= maxId + 1 - maxBackupFiles) { 0097 (QDir(Settings::SettingsData::instance()->imageDirectory())).remove(*fileIt); 0098 } 0099 } 0100 } 0101 // vi:expandtab:tabstop=4 shiftwidth=4: