diff options
Diffstat (limited to 'src/zenserver/projectstore/projectstore.cpp')
| -rw-r--r-- | src/zenserver/projectstore/projectstore.cpp | 66 |
1 files changed, 43 insertions, 23 deletions
diff --git a/src/zenserver/projectstore/projectstore.cpp b/src/zenserver/projectstore/projectstore.cpp index 4ddbdded7..4402e4486 100644 --- a/src/zenserver/projectstore/projectstore.cpp +++ b/src/zenserver/projectstore/projectstore.cpp @@ -1239,15 +1239,37 @@ ProjectStore::Project::ReadAccessTimes() if (ValidationError == CbValidateError::None) { - CbObject Reader = LoadCompactBinaryObject(Obj); - CbArrayView LastAccessTimes = Reader["lastaccess"sv].AsArrayView(); + CbObject Reader = LoadCompactBinaryObject(Obj); - for (CbFieldView& Entry : LastAccessTimes) + uint64_t Count = Reader["count"sv].AsUInt64(0); + if (Count > 0) { - CbObjectView AccessTime = Entry.AsObjectView(); - std::string_view Id = AccessTime["id"sv].AsString(); - GcClock::Tick AccessTick = AccessTime["tick"sv].AsUInt64(); - m_LastAccessTimes.insert_or_assign(std::string(Id), AccessTick); + std::vector<uint64_t> Ticks; + Ticks.reserve(Count); + CbArrayView TicksArray = Reader["ticks"sv].AsArrayView(); + for (CbFieldView& TickView : TicksArray) + { + Ticks.emplace_back(TickView.AsUInt64()); + } + CbArrayView IdArray = Reader["ids"sv].AsArrayView(); + uint64_t Index = 0; + for (CbFieldView& IdView : IdArray) + { + std::string_view Id = IdView.AsString(); + m_LastAccessTimes.insert_or_assign(std::string(Id), Ticks[Index++]); + } + } + + ////// Legacy format read + { + CbArrayView LastAccessTimes = Reader["lastaccess"sv].AsArrayView(); + for (CbFieldView& Entry : LastAccessTimes) + { + CbObjectView AccessTime = Entry.AsObjectView(); + std::string_view Id = AccessTime["id"sv].AsString(); + GcClock::Tick AccessTick = AccessTime["tick"sv].AsUInt64(); + m_LastAccessTimes.insert_or_assign(std::string(Id), AccessTick); + } } } else @@ -1261,26 +1283,27 @@ ProjectStore::Project::WriteAccessTimes() { using namespace std::literals; - RwLock::ExclusiveLockScope _(m_ProjectLock); + CbObjectWriter Writer; - BinaryWriter Mem; + Writer.AddInteger("count", gsl::narrow<uint64_t>(m_LastAccessTimes.size())); + Writer.BeginArray("ids"); - CbObjectWriter Writer; - Writer.BeginArray("lastaccess"); { + RwLock::SharedLockScope _(m_ProjectLock); for (const auto& It : m_LastAccessTimes) { - Writer.BeginObject(); - { - Writer << "id"sv << It.first; - Writer << "tick"sv << gsl::narrow<uint64_t>(It.second); - } - Writer.EndObject(); + Writer << It.first; } + Writer.EndArray(); + Writer.BeginArray("ticks"); + for (const auto& It : m_LastAccessTimes) + { + Writer << gsl::narrow<uint64_t>(It.second); + } + Writer.EndArray(); } - Writer.EndArray(); - Writer.Save(Mem); + CbObject Data = Writer.Save(); try { @@ -1290,10 +1313,7 @@ ProjectStore::Project::WriteAccessTimes() ZEN_INFO("persisting access times for project '{}' to {}", Identifier, ProjectAccessTimesFilePath); - BasicFile Blob; - Blob.Open(ProjectAccessTimesFilePath, BasicFile::Mode::kTruncate); - Blob.Write(Mem.Data(), Mem.Size(), 0); - Blob.Flush(); + WriteFile(ProjectAccessTimesFilePath, Data.GetBuffer().AsIoBuffer()); } catch (std::exception& Err) { |