// 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; } CacheRecordPolicy::CacheRecordPolicy(const CachePolicy RecordPolicy, const CachePolicy PayloadPolicy) : m_RecordPolicy(RecordPolicy) , m_DefaultPayloadPolicy(PayloadPolicy) { } 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.BeginObject(); Writer.AddObjectId("Id"sv, Kv.first); Writer << "Policy"sv << static_cast(Kv.second); Writer.EndObject(); } Writer.EndArray(); } } } // namespace zen