From 045b2a9f59be88ddf14f855f60e2a3e807a349c7 Mon Sep 17 00:00:00 2001 From: Mathew Sutcliffe Date: Fri, 23 Dec 2016 02:25:05 +0000 Subject: [PATCH] refs #815 When a cache/settings file has errors, back it up before it can be overwritten. --- src/blackmisc/valuecache.cpp | 22 +++++++++++++++++++++- src/blackmisc/valuecache.h | 2 ++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/src/blackmisc/valuecache.cpp b/src/blackmisc/valuecache.cpp index fc3c99da2..d626eb979 100644 --- a/src/blackmisc/valuecache.cpp +++ b/src/blackmisc/valuecache.cpp @@ -22,7 +22,6 @@ #include #include #include -#include #include #include #include @@ -450,6 +449,7 @@ namespace BlackMisc if (! messages.isEmpty()) { ok = false; + backupFile(file); CLogMessage::preformatted(messages); } temp.removeDuplicates(currentValues); @@ -459,6 +459,26 @@ namespace BlackMisc (keysMessage.isEmpty() ? o_values.keys().to().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) { QMutexLocker lock(&m_mutex); diff --git a/src/blackmisc/valuecache.h b/src/blackmisc/valuecache.h index 12c3f3755..defff18c4 100644 --- a/src/blackmisc/valuecache.h +++ b/src/blackmisc/valuecache.h @@ -29,6 +29,7 @@ #include #include #include +#include #include #include #include @@ -320,6 +321,7 @@ namespace BlackMisc Element &getElement(const QString &key); Element &getElement(const QString &key, QMap::const_iterator pos); std::tuple getValue(const QString &key); + void backupFile(QFile &file) const; virtual void connectPage(Private::CValuePage *page);