refs #815 When a cache/settings file has errors, back it up before it can be overwritten.

This commit is contained in:
Mathew Sutcliffe
2016-12-23 02:25:05 +00:00
parent bda0f42c60
commit 045b2a9f59
2 changed files with 23 additions and 1 deletions

View File

@@ -22,7 +22,6 @@
#include <QCoreApplication> #include <QCoreApplication>
#include <QDBusMetaType> #include <QDBusMetaType>
#include <QDir> #include <QDir>
#include <QFile>
#include <QFileInfo> #include <QFileInfo>
#include <QFlags> #include <QFlags>
#include <QIODevice> #include <QIODevice>
@@ -450,6 +449,7 @@ namespace BlackMisc
if (! messages.isEmpty()) if (! messages.isEmpty())
{ {
ok = false; ok = false;
backupFile(file);
CLogMessage::preformatted(messages); CLogMessage::preformatted(messages);
} }
temp.removeDuplicates(currentValues); temp.removeDuplicates(currentValues);
@@ -459,6 +459,26 @@ namespace BlackMisc
(keysMessage.isEmpty() ? o_values.keys().to<QStringList>().join(",") : keysMessage) << dir << (ok ? "successfully" : "with errors"); (keysMessage.isEmpty() ? o_values.keys().to<QStringList>().join(",") : keysMessage) << dir << (ok ? "successfully" : "with errors");
} }
void CValueCache::backupFile(QFile &file) const
{
QDir dir = getCacheRootDirectory();
QString relative = "backups/" + dir.relativeFilePath(file.fileName());
QString absolute = dir.absoluteFilePath(relative);
absolute += "." + QDateTime::currentDateTime().toString(QStringLiteral("yyMMddhhmmss"));
if (QFile::exists(absolute)) { return; }
if (! dir.mkpath(QFileInfo(relative).path()))
{
CLogMessage(this).error("Failed to create %1") << QFileInfo(absolute).path();
return;
}
if (! file.copy(absolute))
{
CLogMessage(this).error("Failed to back up %1: %2") << QFileInfo(file).fileName() << file.errorString();
return;
}
CLogMessage(this).info("Backed up %1 to %2") << QFileInfo(file).fileName() << dir.absoluteFilePath("backups");
}
void CValueCache::markAllAsSaved(const QString &keyPrefix) void CValueCache::markAllAsSaved(const QString &keyPrefix)
{ {
QMutexLocker lock(&m_mutex); QMutexLocker lock(&m_mutex);

View File

@@ -29,6 +29,7 @@
#include <QChar> #include <QChar>
#include <QDBusArgument> #include <QDBusArgument>
#include <QDateTime> #include <QDateTime>
#include <QFile>
#include <QJsonObject> #include <QJsonObject>
#include <QMap> #include <QMap>
#include <QMetaType> #include <QMetaType>
@@ -320,6 +321,7 @@ namespace BlackMisc
Element &getElement(const QString &key); Element &getElement(const QString &key);
Element &getElement(const QString &key, QMap<QString, ElementPtr>::const_iterator pos); Element &getElement(const QString &key, QMap<QString, ElementPtr>::const_iterator pos);
std::tuple<CVariant, qint64, bool> getValue(const QString &key); std::tuple<CVariant, qint64, bool> getValue(const QString &key);
void backupFile(QFile &file) const;
virtual void connectPage(Private::CValuePage *page); virtual void connectPage(Private::CValuePage *page);