Allow begin >= end for unversionedRead

This commit is contained in:
2024-05-15 13:49:48 -07:00
parent 3bdf345ae7
commit 63fdc5e4f5

View File

@@ -25,16 +25,19 @@ struct Facade {
const int64_t v[] = {version, version};
facade->versioned.firstGeq(key, v, versionedIter, 2);
const uint8_t zero[] = {0};
static const uint8_t zero_[] = {0};
static const String zero{zero_, 1};
if (reverse) {
weaselab::VersionedMap::Iterator iter = versionedIter[1];
weaselab::VersionedMap::Iterator endIter = versionedIter[0];
String readUntil = end;
for (; iter != endIter; --iter) {
auto m = *iter;
auto mEnd = m.type == weaselab::VersionedMap::Set
? String(m.param1, m.param1Len) + String(zero, 1)
: String(m.param2, m.param2Len);
const auto mEnd =
m.type == weaselab::VersionedMap::Set || m.param2Len == 0
? String(m.param1, m.param1Len) + zero
: String(m.param2, m.param2Len);
auto remaining =
facade->unversionedRead(mEnd, readUntil, limit, true);
result.insert(result.end(), remaining.begin(), remaining.end());
@@ -65,22 +68,21 @@ struct Facade {
String readThrough = begin;
for (; iter != endIter; ++iter) {
auto m = *iter;
auto remaining = facade->unversionedRead(
readThrough, String(m.param1, m.param1Len), limit, false);
const auto mBegin = String(m.param1, m.param1Len);
auto remaining =
facade->unversionedRead(readThrough, mBegin, limit, false);
result.insert(result.end(), remaining.begin(), remaining.end());
if (limit == 0) {
return result;
}
switch (m.type) {
case weaselab::VersionedMap::Set: {
result.push_back(
{String(m.param1, m.param1Len), String(m.param2, m.param2Len)});
result.push_back({mBegin, String(m.param2, m.param2Len)});
--limit;
if (limit == 0) {
return result;
}
uint8_t zero[] = {0};
readThrough = String(m.param1, m.param1Len) + String(zero, 1);
readThrough = mBegin + zero;
} break;
case weaselab::VersionedMap::Clear:
readThrough = String(m.param2, m.param2Len);
@@ -140,15 +142,26 @@ struct Facade {
const String &end,
int &limit,
bool reverse) const {
if (begin >= end) {
return {};
}
std::vector<std::pair<String, String>> result;
if (reverse) {
if (unversioned.empty()) {
return result;
}
for (auto iter = --unversioned.lower_bound(end);
iter->first >= begin && limit > 0; --iter) {
auto iter = unversioned.lower_bound(end);
const auto beginIter = unversioned.begin();
if (iter == beginIter) {
return result;
}
--iter;
for (; iter->first >= begin && limit > 0; --iter) {
result.push_back(*iter);
--limit;
if (iter == beginIter) {
return result;
}
}
} else {
for (auto iter = unversioned.lower_bound(begin),