From 3faf0b57c625152a8facfca1c4995bd9edc95707 Mon Sep 17 00:00:00 2001 From: Per Larsson Date: Fri, 12 Nov 2021 11:08:53 +0100 Subject: Movec cache utility types to zenutil and fixed unit tests. --- zenutil/cache/cachepolicy.cpp | 161 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 161 insertions(+) create mode 100644 zenutil/cache/cachepolicy.cpp (limited to 'zenutil/cache/cachepolicy.cpp') diff --git a/zenutil/cache/cachepolicy.cpp b/zenutil/cache/cachepolicy.cpp new file mode 100644 index 000000000..968f6aa53 --- /dev/null +++ b/zenutil/cache/cachepolicy.cpp @@ -0,0 +1,161 @@ +// Copyright Epic Games, Inc. All Rights Reserved. + +#include + +#include +#include +#include + +namespace zen { + +using namespace std::literals; + +namespace detail { namespace cacheopt { + constexpr std::string_view Local = "local"sv; + constexpr std::string_view Remote = "remote"sv; + constexpr std::string_view Data = "data"sv; + constexpr std::string_view Meta = "meta"sv; + constexpr std::string_view Value = "value"sv; + constexpr std::string_view Attachments = "attachments"sv; +}} // namespace detail::cacheopt + +CachePolicy +ParseQueryCachePolicy(std::string_view QueryPolicy, CachePolicy Default) +{ + if (QueryPolicy.empty()) + { + return Default; + } + + CachePolicy Result = CachePolicy::None; + + ForEachStrTok(QueryPolicy, ',', [&Result](const std::string_view& Token) { + if (Token == detail::cacheopt::Local) + { + Result |= CachePolicy::QueryLocal; + } + if (Token == detail::cacheopt::Remote) + { + Result |= CachePolicy::QueryRemote; + } + return true; + }); + + return Result; +} + +CachePolicy +ParseStoreCachePolicy(std::string_view StorePolicy, CachePolicy Default) +{ + if (StorePolicy.empty()) + { + return Default; + } + + CachePolicy Result = CachePolicy::None; + + ForEachStrTok(StorePolicy, ',', [&Result](const std::string_view& Token) { + if (Token == detail::cacheopt::Local) + { + Result |= CachePolicy::StoreLocal; + } + if (Token == detail::cacheopt::Remote) + { + Result |= CachePolicy::StoreRemote; + } + return true; + }); + + return Result; +} + +CachePolicy +ParseSkipCachePolicy(std::string_view SkipPolicy, CachePolicy Default) +{ + if (SkipPolicy.empty()) + { + return Default; + } + + CachePolicy Result = CachePolicy::None; + + ForEachStrTok(SkipPolicy, ',', [&Result](const std::string_view& Token) { + if (Token == detail::cacheopt::Meta) + { + Result |= CachePolicy::SkipMeta; + } + if (Token == detail::cacheopt::Value) + { + Result |= CachePolicy::SkipValue; + } + if (Token == detail::cacheopt::Attachments) + { + Result |= CachePolicy::SkipAttachments; + } + if (Token == detail::cacheopt::Data) + { + Result |= CachePolicy::SkipData; + } + return true; + }); + + return Result; +} + +CachePolicy +CacheRecordPolicy::GetPayloadPolicy(const Oid& PayloadId) const +{ + if (const auto It = m_PayloadPolicies.find(PayloadId); It != m_PayloadPolicies.end()) + { + return It->second; + } + + return m_DefaultPayloadPolicy; +} + +bool +CacheRecordPolicy::Load(CbObjectView RecordPolicyObject, CacheRecordPolicy& OutRecordPolicy) +{ + using namespace std::literals; + + const uint32_t RecordPolicy = RecordPolicyObject["RecordPolicy"sv].AsUInt32(static_cast(CachePolicy::Default)); + const uint32_t DefaultPayloadPolicy = + RecordPolicyObject["DefaultPayloadPolicy"sv].AsUInt32(static_cast(CachePolicy::Default)); + + OutRecordPolicy.m_RecordPolicy = static_cast(RecordPolicy); + OutRecordPolicy.m_DefaultPayloadPolicy = static_cast(DefaultPayloadPolicy); + + for (CbFieldView PayloadPolicyView : RecordPolicyObject["PayloadPolicies"sv]) + { + CbObjectView PayloadPolicyObject = PayloadPolicyView.AsObjectView(); + const Oid PayloadId = PayloadPolicyObject["Id"sv].AsObjectId(); + const uint32_t PayloadPolicy = PayloadPolicyObject["Policy"sv].AsUInt32(); + + if (PayloadId != Oid::Zero && PayloadPolicy != 0) + { + OutRecordPolicy.m_PayloadPolicies.emplace(PayloadId, static_cast(PayloadPolicy)); + } + } + + return true; +} + +void +CacheRecordPolicy::Save(const CacheRecordPolicy& Policy, CbWriter& Writer) +{ + Writer << "RecordPolicy"sv << static_cast(Policy.GetRecordPolicy()); + Writer << "DefaultPayloadPolicy"sv << static_cast(Policy.GetDefaultPayloadPolicy()); + + if (!Policy.m_PayloadPolicies.empty()) + { + Writer.BeginArray("PayloadPolicies"sv); + for (const auto& Kv : Policy.m_PayloadPolicies) + { + Writer.AddObjectId("Id"sv, Kv.first); + Writer << "Policy"sv << static_cast(Kv.second); + } + Writer.EndArray(); + } +} + +} // namespace zen -- cgit v1.2.3 From 58bec60cd39b697d5cd3ab6c757a92e528a638fc Mon Sep 17 00:00:00 2001 From: Per Larsson Date: Fri, 12 Nov 2021 14:36:34 +0100 Subject: Fixed bug when cloning CbObject. --- zenutil/cache/cachepolicy.cpp | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'zenutil/cache/cachepolicy.cpp') diff --git a/zenutil/cache/cachepolicy.cpp b/zenutil/cache/cachepolicy.cpp index 968f6aa53..f718bf841 100644 --- a/zenutil/cache/cachepolicy.cpp +++ b/zenutil/cache/cachepolicy.cpp @@ -102,6 +102,12 @@ ParseSkipCachePolicy(std::string_view SkipPolicy, CachePolicy Default) return Result; } +CacheRecordPolicy::CacheRecordPolicy(const CachePolicy RecordPolicy, const CachePolicy PayloadPolicy) +: m_RecordPolicy(RecordPolicy) +, m_DefaultPayloadPolicy(PayloadPolicy) +{ +} + CachePolicy CacheRecordPolicy::GetPayloadPolicy(const Oid& PayloadId) const { -- cgit v1.2.3