summaryrefslogtreecommitdiffstats
path: root/src/rocksdb/db/history_trimming_iterator.h
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/rocksdb/db/history_trimming_iterator.h91
1 files changed, 91 insertions, 0 deletions
diff --git a/src/rocksdb/db/history_trimming_iterator.h b/src/rocksdb/db/history_trimming_iterator.h
new file mode 100644
index 000000000..b445ced33
--- /dev/null
+++ b/src/rocksdb/db/history_trimming_iterator.h
@@ -0,0 +1,91 @@
+// Copyright (c) 2011-present, Facebook, Inc. All rights reserved.
+// This source code is licensed under both the GPLv2 (found in the
+// COPYING file in the root directory) and Apache 2.0 License
+// (found in the LICENSE.Apache file in the root directory).
+#pragma once
+
+#include <string>
+#include <vector>
+
+#include "db/dbformat.h"
+#include "rocksdb/iterator.h"
+#include "rocksdb/slice.h"
+#include "table/internal_iterator.h"
+
+namespace ROCKSDB_NAMESPACE {
+
+class HistoryTrimmingIterator : public InternalIterator {
+ public:
+ explicit HistoryTrimmingIterator(InternalIterator* input,
+ const Comparator* cmp, const std::string& ts)
+ : input_(input), filter_ts_(ts), cmp_(cmp) {
+ assert(cmp_->timestamp_size() > 0 && !ts.empty());
+ }
+
+ bool filter() const {
+ if (!input_->Valid()) {
+ return true;
+ }
+ Slice current_ts = ExtractTimestampFromKey(key(), cmp_->timestamp_size());
+ return cmp_->CompareTimestamp(current_ts, Slice(filter_ts_)) <= 0;
+ }
+
+ bool Valid() const override { return input_->Valid(); }
+
+ void SeekToFirst() override {
+ input_->SeekToFirst();
+ while (!filter()) {
+ input_->Next();
+ }
+ }
+
+ void SeekToLast() override {
+ input_->SeekToLast();
+ while (!filter()) {
+ input_->Prev();
+ }
+ }
+
+ void Seek(const Slice& target) override {
+ input_->Seek(target);
+ while (!filter()) {
+ input_->Next();
+ }
+ }
+
+ void SeekForPrev(const Slice& target) override {
+ input_->SeekForPrev(target);
+ while (!filter()) {
+ input_->Prev();
+ }
+ }
+
+ void Next() override {
+ do {
+ input_->Next();
+ } while (!filter());
+ }
+
+ void Prev() override {
+ do {
+ input_->Prev();
+ } while (!filter());
+ }
+
+ Slice key() const override { return input_->key(); }
+
+ Slice value() const override { return input_->value(); }
+
+ Status status() const override { return input_->status(); }
+
+ bool IsKeyPinned() const override { return input_->IsKeyPinned(); }
+
+ bool IsValuePinned() const override { return input_->IsValuePinned(); }
+
+ private:
+ InternalIterator* input_;
+ const std::string filter_ts_;
+ const Comparator* const cmp_;
+};
+
+} // namespace ROCKSDB_NAMESPACE