File indexing completed on 2024-05-12 15:55:24

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: