diff options
| author | Dan Engelbrecht <[email protected]> | 2022-06-30 00:42:54 -0700 |
|---|---|---|
| committer | GitHub <[email protected]> | 2022-06-30 00:42:54 -0700 |
| commit | 658f75ed9917ccdc616d046b41c2dc05c4c32167 (patch) | |
| tree | f67a4357bca1fab4e370d44ff5670d5ab4481556 /zenutil/cache/cacherequests.cpp | |
| parent | add optional filter when writing GetCacheRecordsRequest and GetCacheValuesReq... (diff) | |
| download | zen-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.cpp | 65 |
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") |