refs #545 CAtomicFile used in CValueCache to avoid corruption in case serialization is interrupted.

This commit is contained in:
Mathew Sutcliffe
2016-01-10 23:39:26 +00:00
parent 956d393bb1
commit f9de444a53
3 changed files with 162 additions and 7 deletions

View File

@@ -12,6 +12,7 @@
#include "blackmisc/logmessage.h"
#include "blackmisc/algorithm.h"
#include "blackmisc/lockfree.h"
#include "blackmisc/atomicfile.h"
#include <QThread>
#include <QJsonDocument>
@@ -230,23 +231,25 @@ namespace BlackMisc
}
for (auto it = namespaces.cbegin(); it != namespaces.cend(); ++it)
{
QFile file(dir + "/" + it.key() + ".json");
if (! file.open(QFile::ReadWrite | QFile::Text))
QFile readFile(dir + "/" + it.key() + ".json");
if (! readFile.open(QFile::ReadWrite | QFile::Text))
{
return CLogMessage(this).error("Failed to open %1: %2") << file.fileName() << file.errorString();
return CLogMessage(this).error("Failed to open %1: %2") << readFile.fileName() << readFile.errorString();
}
auto json = QJsonDocument::fromJson(file.readAll());
auto json = QJsonDocument::fromJson(readFile.readAll());
if (json.isArray() || (json.isNull() && ! json.isEmpty()))
{
return CLogMessage(this).error("Invalid JSON format in %1") << file.fileName();
return CLogMessage(this).error("Invalid JSON format in %1") << readFile.fileName();
}
CVariantMap storedValues;
storedValues.convertFromJson(json.object());
storedValues.insert(*it);
json.setObject(storedValues.toJson());
if (! (file.seek(0) && file.resize(0) && file.write(json.toJson()) > 0))
readFile.close();
CAtomicFile writeFile(readFile.fileName());
if (! (writeFile.open(QFile::WriteOnly | QFile::Text) && writeFile.write(json.toJson()) > 0 && writeFile.checkedClose()))
{
return CLogMessage(this).error("Failed to write to %1: %2") << file.fileName() << file.errorString();
return CLogMessage(this).error("Failed to write to %1: %2") << writeFile.fileName() << writeFile.errorString();
}
}
return {};