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());
39 class DBIter:
public Iterator {
65 virtual bool Valid()
const {
return valid_; }
66 virtual Slice key()
const {
70 virtual Slice
value()
const {
74 virtual Status status()
const {
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();
91 bool ParseKey(ParsedInternalKey* key);
93 inline void SaveKey(
const Slice& k, std::string* dst) {
94 dst->assign(k.data(), k.size());
97 inline void ClearSavedValue() {
107 ssize_t RandomPeriod() {
108 return rnd_.Uniform(2*config::kReadBytesPeriod);
126 DBIter(
const DBIter&);
127 void operator=(
const DBIter&);
130 inline bool DBIter::ParseKey(ParsedInternalKey* ikey) {
146 void DBIter::Next() {
169 FindNextUserEntry(
true, skip);
172 void DBIter::FindNextUserEntry(
bool skipping, std::string* skip) {
177 ParsedInternalKey ikey;
178 if (ParseKey(&ikey) && ikey.sequence <=
sequence_) {
183 SaveKey(ikey.user_key, skip);
204 void DBIter::Prev() {
231 void DBIter::FindPrevUserEntry() {
237 ParsedInternalKey ikey;
238 if (ParseKey(&ikey) && ikey.sequence <=
sequence_) {
244 value_type = ikey.type;
250 if (
saved_value_.capacity() > raw_value.size() + 1048576) {
255 saved_value_.assign(raw_value.data(), raw_value.size());
273 void DBIter::Seek(
const Slice& target) {
287 void DBIter::SeekToFirst() {
298 void DBIter::SeekToLast() {
313 return new DBIter(db, user_key_comparator, internal_iter, sequence, seed);
static Status Corruption(const Slice &msg, const Slice &msg2=Slice())
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 value() const =0
virtual void SeekToLast()=0
SequenceNumber const sequence_
virtual void Seek(const Slice &target)=0
std::string EscapeString(const Slice &value)
virtual void SeekToFirst()=0
virtual int Compare(const Slice &a, const Slice &b) const =0
virtual bool Valid() const =0
Slice ExtractUserKey(const Slice &internal_key)
virtual Slice key() const =0
const Comparator *const user_comparator_
void RecordReadSample(Slice key)