12 #include "port/port.h" 20 static void DumpInternalIter(Iterator* iter) {
21 for (iter->SeekToFirst(); iter->Valid(); iter->Next()) {
24 fprintf(stderr,
"Corrupt '%s'\n",
EscapeString(iter->key()).c_str());
26 fprintf(stderr,
"@ '%s'\n", k.DebugString().c_str());
54 user_comparator_(cmp),
60 bytes_counter_(RandomPeriod()) {
65 virtual bool Valid()
const {
return valid_; }
68 return (direction_ == kForward) ?
ExtractUserKey(iter_->key()) : saved_key_;
72 return (direction_ == kForward) ? iter_->value() : saved_value_;
76 return iter_->status();
84 virtual void Seek(
const Slice& target);
85 virtual void SeekToFirst();
86 virtual void SeekToLast();
89 void FindNextUserEntry(
bool skipping, std::string* skip);
90 void FindPrevUserEntry();
98 if (saved_value_.capacity() > 1048576) {
100 swap(empty, saved_value_);
102 saved_value_.clear();
127 void operator=(
const DBIter&);
131 Slice k = iter_->key();
132 ssize_t n = k.
size() + iter_->value().size();
134 while (bytes_counter_ < 0) {
135 bytes_counter_ += RandomPeriod();
136 db_->RecordReadSample(k);
146 void DBIter::Next() {
149 if (direction_ == kReverse) {
150 direction_ = kForward;
154 if (!iter_->Valid()) {
155 iter_->SeekToFirst();
159 if (!iter_->Valid()) {
170 FindNextUserEntry(
true, &saved_key_);
173 void DBIter::FindNextUserEntry(
bool skipping, std::string* skip) {
175 assert(iter_->Valid());
176 assert(direction_ == kForward);
179 if (ParseKey(&ikey) && ikey.
sequence <= sequence_) {
189 user_comparator_->Compare(ikey.
user_key, *skip) <= 0) {
200 }
while (iter_->Valid());
205 void DBIter::Prev() {
208 if (direction_ == kForward) {
211 assert(iter_->Valid());
215 if (!iter_->Valid()) {
226 direction_ = kReverse;
232 void DBIter::FindPrevUserEntry() {
233 assert(direction_ == kReverse);
236 if (iter_->Valid()) {
239 if (ParseKey(&ikey) && ikey.
sequence <= sequence_) {
241 user_comparator_->Compare(ikey.
user_key, saved_key_) < 0) {
245 value_type = ikey.
type;
250 Slice raw_value = iter_->value();
251 if (saved_value_.capacity() > raw_value.
size() + 1048576) {
253 swap(empty, saved_value_);
256 saved_value_.assign(raw_value.
data(), raw_value.
size());
260 }
while (iter_->Valid());
268 direction_ = kForward;
274 void DBIter::Seek(
const Slice& target) {
275 direction_ = kForward;
280 iter_->Seek(saved_key_);
281 if (iter_->Valid()) {
282 FindNextUserEntry(
false, &saved_key_ );
288 void DBIter::SeekToFirst() {
289 direction_ = kForward;
291 iter_->SeekToFirst();
292 if (iter_->Valid()) {
293 FindNextUserEntry(
false, &saved_key_ );
299 void DBIter::SeekToLast() {
300 direction_ = kReverse;
314 return new DBIter(db, user_key_comparator, internal_iter, sequence, seed);
DBIter(DBImpl *db, const Comparator *cmp, Iterator *iter, SequenceNumber s, uint32_t seed)
SequenceNumber const sequence_
Iterator * NewDBIterator(DBImpl *db, const Comparator *user_key_comparator, Iterator *internal_iter, SequenceNumber sequence, uint32_t seed)
bool ParseInternalKey(const Slice &internal_key, ParsedInternalKey *result)
void AppendInternalKey(std::string *result, const ParsedInternalKey &key)
virtual Slice key() const
static Status Corruption(const Slice &msg, const Slice &msg2=Slice())
static const int kReadBytesPeriod
static const ValueType kValueTypeForSeek
std::string EscapeString(const Slice &value)
const Comparator *const user_comparator_
void SaveKey(const Slice &k, std::string *dst)
virtual bool Valid() const
Slice ExtractUserKey(const Slice &internal_key)
virtual Status status() const
const char * data() const
virtual Slice value() const