diff options
Diffstat (limited to 'zenserver/cache/cachekey.cpp')
| -rw-r--r-- | zenserver/cache/cachekey.cpp | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/zenserver/cache/cachekey.cpp b/zenserver/cache/cachekey.cpp index 57993d424..85d57745d 100644 --- a/zenserver/cache/cachekey.cpp +++ b/zenserver/cache/cachekey.cpp @@ -2,6 +2,7 @@ #include "cachekey.h" +#include <zencore/compactbinary.h> #include <zencore/string.h> namespace zen { @@ -100,6 +101,44 @@ ParseSkipCachePolicy(std::string_view SkipPolicy, CachePolicy Default) 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::FromCompactBinary(CbObjectView RecordPolicyObject, CacheRecordPolicy& OutRecordPolicy) +{ + using namespace std::literals; + + const uint32_t RecordPolicy = RecordPolicyObject["recordpolicy"sv].AsUInt32(static_cast<uint32_t>(CachePolicy::Default)); + const uint32_t DefaultPayloadPolicy = + RecordPolicyObject["defaultpayloadpolicy"sv].AsUInt32(static_cast<uint32_t>(CachePolicy::Default)); + + OutRecordPolicy.m_RecordPolicy = static_cast<CachePolicy>(RecordPolicy); + OutRecordPolicy.m_DefaultPayloadPolicy = static_cast<CachePolicy>(DefaultPayloadPolicy); + + for (CbFieldView PayloadPolicyView : RecordPolicyObject["payloadpolicies"sv]) + { + CbObjectView PayloadPolicyObject = PayloadPolicyView.AsObjectView(); + const Oid PayloadId = PayloadPolicyObject["payloadid"sv].AsObjectId(); + const uint32_t PayloadPolicy = PayloadPolicyObject["policy"sv].AsUInt32(); + + if (PayloadId != Oid::Zero && PayloadPolicy != 0) + { + OutRecordPolicy.m_PayloadPolicies.emplace(PayloadId, static_cast<CachePolicy>(PayloadPolicy)); + } + } + + return true; +} + const CacheKey CacheKey::Empty = CacheKey{.Bucket = std::string(), .Hash = IoHash()}; } // namespace zen |