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