aboutsummaryrefslogtreecommitdiff
path: root/zenutil/cache/cacherequests.cpp
diff options
context:
space:
mode:
authorDan Engelbrecht <[email protected]>2022-06-30 00:42:54 -0700
committerGitHub <[email protected]>2022-06-30 00:42:54 -0700
commit658f75ed9917ccdc616d046b41c2dc05c4c32167 (patch)
treef67a4357bca1fab4e370d44ff5670d5ab4481556 /zenutil/cache/cacherequests.cpp
parentadd optional filter when writing GetCacheRecordsRequest and GetCacheValuesReq... (diff)
downloadzen-658f75ed9917ccdc616d046b41c2dc05c4c32167.tar.xz
zen-658f75ed9917ccdc616d046b41c2dc05c4c32167.zip
Add ability to control where in the result array results go in GetCacheRecordsResult::Parse and CacheValuesResult::Parse (#138)
Diffstat (limited to 'zenutil/cache/cacherequests.cpp')
-rw-r--r--zenutil/cache/cacherequests.cpp65
1 files changed, 53 insertions, 12 deletions
diff --git a/zenutil/cache/cacherequests.cpp b/zenutil/cache/cacherequests.cpp
index 3f8a89b6f..24f54eede 100644
--- a/zenutil/cache/cacherequests.cpp
+++ b/zenutil/cache/cacherequests.cpp
@@ -415,7 +415,7 @@ namespace cacherequests {
return true;
}
- bool GetCacheRecordsResult::Parse(const CbPackage& Package)
+ bool GetCacheRecordsResult::Parse(const CbPackage& Package, const std::span<const size_t> OptionalRecordResultIndexes)
{
CbObject ResponseObject = Package.GetObject();
CbArrayView ResultsArray = ResponseObject["Result"].AsArrayView();
@@ -425,15 +425,25 @@ namespace cacherequests {
}
Results.reserve(ResultsArray.Num());
- for (CbFieldView RecordView : ResultsArray)
+ if (!OptionalRecordResultIndexes.empty() && ResultsArray.Num() != OptionalRecordResultIndexes.size())
{
+ return false;
+ }
+ for (size_t Index = 0; CbFieldView RecordView : ResultsArray)
+ {
+ size_t ResultIndex = OptionalRecordResultIndexes.empty() ? Index : OptionalRecordResultIndexes[Index];
+ Index++;
+
+ if (Results.size() <= ResultIndex)
+ {
+ Results.resize(ResultIndex + 1);
+ }
if (RecordView.IsNull())
{
- Results.push_back({});
continue;
}
- Results.push_back(GetCacheRecordResult{});
- GetCacheRecordResult& Request = Results.back().value();
+ Results[ResultIndex] = GetCacheRecordResult{};
+ GetCacheRecordResult& Request = Results[ResultIndex].value();
CbObjectView RecordObject = RecordView.AsObjectView();
CbObjectView KeyObject = RecordObject["Key"].AsObjectView();
if (!GetRequestCacheKey(KeyObject, Request.Key))
@@ -707,7 +717,7 @@ namespace cacherequests {
return true;
}
- bool CacheValuesResult::Parse(const CbPackage& Package)
+ bool CacheValuesResult::Parse(const CbPackage& Package, const std::span<const size_t> OptionalValueResultIndexes)
{
CbObject ResponseObject = Package.GetObject();
CbArrayView ResultsArray = ResponseObject["Result"].AsArrayView();
@@ -716,15 +726,26 @@ namespace cacherequests {
return false;
}
Results.reserve(ResultsArray.Num());
- for (CbFieldView RecordView : ResultsArray)
+ if (!OptionalValueResultIndexes.empty() && ResultsArray.Num() != OptionalValueResultIndexes.size())
{
+ return false;
+ }
+ for (size_t Index = 0; CbFieldView RecordView : ResultsArray)
+ {
+ size_t ResultIndex = OptionalValueResultIndexes.empty() ? Index : OptionalValueResultIndexes[Index];
+ Index++;
+
+ if (Results.size() <= ResultIndex)
+ {
+ Results.resize(ResultIndex + 1);
+ }
if (RecordView.IsNull())
{
- Results.push_back({});
continue;
}
- CacheValueResult ValueResult;
- CbObjectView RecordObject = RecordView.AsObjectView();
+
+ CacheValueResult& ValueResult = Results[ResultIndex];
+ CbObjectView RecordObject = RecordView.AsObjectView();
CbFieldView RawHashField = RecordObject["RawHash"];
ValueResult.RawHash = RawHashField.AsHash();
@@ -742,7 +763,6 @@ namespace cacherequests {
ValueResult.RawSize = RecordObject["RawSize"].AsUInt64(UINT64_MAX);
}
}
- Results.emplace_back(ValueResult);
}
return true;
}
@@ -1292,8 +1312,16 @@ namespace cacherequests {
GetCacheRecordsResult FullResultCopy;
CHECK(FullResultCopy.Parse(FullResponsePackage));
CHECK(FullResult.Results[0] == FullResultCopy.Results[0]);
- CHECK(!FullResult.Results[1]);
+ CHECK(!FullResultCopy.Results[1]);
CHECK(FullResult.Results[2] == FullResultCopy.Results[2]);
+
+ GetCacheRecordsResult PartialResultCopy;
+ CHECK(PartialResultCopy.Parse(FullResponsePackage, std::initializer_list<size_t>{0, 3, 4}));
+ CHECK(FullResult.Results[0] == PartialResultCopy.Results[0]);
+ CHECK(!PartialResultCopy.Results[1]);
+ CHECK(!PartialResultCopy.Results[2]);
+ CHECK(!PartialResultCopy.Results[3]);
+ CHECK(FullResult.Results[2] == PartialResultCopy.Results[4]);
}
TEST_CASE("cacherequests.put.cache.values")
@@ -1392,6 +1420,19 @@ namespace cacherequests {
CacheValuesResult FullResultCopy;
CHECK(FullResultCopy.Parse(FullResponsePackage));
CHECK(FullResult == FullResultCopy);
+
+ CacheValuesResult PartialResultCopy;
+ CHECK(PartialResultCopy.Parse(FullResponsePackage, std::initializer_list<size_t>{0, 3, 4, 5, 6, 9}));
+ CHECK(PartialResultCopy.Results[0] == FullResult.Results[0]);
+ CHECK(PartialResultCopy.Results[1].RawHash == IoHash::Zero);
+ CHECK(PartialResultCopy.Results[2].RawHash == IoHash::Zero);
+ CHECK(PartialResultCopy.Results[3] == FullResult.Results[1]);
+ CHECK(PartialResultCopy.Results[4] == FullResult.Results[2]);
+ CHECK(PartialResultCopy.Results[5] == FullResult.Results[3]);
+ CHECK(PartialResultCopy.Results[6] == FullResult.Results[4]);
+ CHECK(PartialResultCopy.Results[7].RawHash == IoHash::Zero);
+ CHECK(PartialResultCopy.Results[8].RawHash == IoHash::Zero);
+ CHECK(PartialResultCopy.Results[9] == FullResult.Results[5]);
}
TEST_CASE("cacherequests.get.cache.chunks")