Coverage Report

Created: 2026-04-10 07:52

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/rocksdb/table/iterator.cc
Line
Count
Source
1
//  Copyright (c) 2011-present, Facebook, Inc.  All rights reserved.
2
//  This source code is licensed under both the GPLv2 (found in the
3
//  COPYING file in the root directory) and Apache 2.0 License
4
//  (found in the LICENSE.Apache file in the root directory).
5
//
6
// Copyright (c) 2011 The LevelDB Authors. All rights reserved.
7
// Use of this source code is governed by a BSD-style license that can be
8
// found in the LICENSE file. See the AUTHORS file for names of contributors.
9
10
#include "rocksdb/iterator.h"
11
12
#include "memory/arena.h"
13
#include "table/internal_iterator.h"
14
#include "table/iterator_wrapper.h"
15
16
namespace ROCKSDB_NAMESPACE {
17
18
0
Status Iterator::GetProperty(std::string prop_name, std::string* prop) {
19
0
  if (prop == nullptr) {
20
0
    return Status::InvalidArgument("prop is nullptr");
21
0
  }
22
0
  if (prop_name == "rocksdb.iterator.is-key-pinned") {
23
0
    *prop = "0";
24
0
    return Status::OK();
25
0
  }
26
0
  if (prop_name == "rocksdb.iterator.is-value-pinned") {
27
0
    *prop = "0";
28
0
    return Status::OK();
29
0
  }
30
0
  return Status::InvalidArgument("Unidentified property.");
31
0
}
32
33
namespace {
34
class EmptyIterator : public Iterator {
35
 public:
36
0
  explicit EmptyIterator(const Status& s) : status_(s) {}
37
0
  bool Valid() const override { return false; }
38
0
  void Seek(const Slice& /*target*/) override {}
39
0
  void SeekForPrev(const Slice& /*target*/) override {}
40
0
  void SeekToFirst() override {}
41
0
  void SeekToLast() override {}
42
0
  void Next() override { assert(false); }
43
0
  void Prev() override { assert(false); }
44
0
  Slice key() const override {
45
0
    assert(false);
46
0
    return Slice();
47
0
  }
48
0
  Slice value() const override {
49
0
    assert(false);
50
0
    return Slice();
51
0
  }
52
0
  Status status() const override { return status_; }
53
54
 private:
55
  Status status_;
56
};
57
58
template <class TValue = Slice>
59
class EmptyInternalIterator : public InternalIteratorBase<TValue> {
60
 public:
61
0
  explicit EmptyInternalIterator(const Status& s) : status_(s) {}
Unexecuted instantiation: iterator.cc:rocksdb::(anonymous namespace)::EmptyInternalIterator<rocksdb::IndexValue>::EmptyInternalIterator(rocksdb::Status const&)
Unexecuted instantiation: iterator.cc:rocksdb::(anonymous namespace)::EmptyInternalIterator<rocksdb::Slice>::EmptyInternalIterator(rocksdb::Status const&)
62
0
  bool Valid() const override { return false; }
Unexecuted instantiation: iterator.cc:rocksdb::(anonymous namespace)::EmptyInternalIterator<rocksdb::IndexValue>::Valid() const
Unexecuted instantiation: iterator.cc:rocksdb::(anonymous namespace)::EmptyInternalIterator<rocksdb::Slice>::Valid() const
63
0
  void Seek(const Slice& /*target*/) override {}
Unexecuted instantiation: iterator.cc:rocksdb::(anonymous namespace)::EmptyInternalIterator<rocksdb::IndexValue>::Seek(rocksdb::Slice const&)
Unexecuted instantiation: iterator.cc:rocksdb::(anonymous namespace)::EmptyInternalIterator<rocksdb::Slice>::Seek(rocksdb::Slice const&)
64
0
  void SeekForPrev(const Slice& /*target*/) override {}
Unexecuted instantiation: iterator.cc:rocksdb::(anonymous namespace)::EmptyInternalIterator<rocksdb::IndexValue>::SeekForPrev(rocksdb::Slice const&)
Unexecuted instantiation: iterator.cc:rocksdb::(anonymous namespace)::EmptyInternalIterator<rocksdb::Slice>::SeekForPrev(rocksdb::Slice const&)
65
0
  void SeekToFirst() override {}
Unexecuted instantiation: iterator.cc:rocksdb::(anonymous namespace)::EmptyInternalIterator<rocksdb::IndexValue>::SeekToFirst()
Unexecuted instantiation: iterator.cc:rocksdb::(anonymous namespace)::EmptyInternalIterator<rocksdb::Slice>::SeekToFirst()
66
0
  void SeekToLast() override {}
Unexecuted instantiation: iterator.cc:rocksdb::(anonymous namespace)::EmptyInternalIterator<rocksdb::IndexValue>::SeekToLast()
Unexecuted instantiation: iterator.cc:rocksdb::(anonymous namespace)::EmptyInternalIterator<rocksdb::Slice>::SeekToLast()
67
0
  void Next() override { assert(false); }
Unexecuted instantiation: iterator.cc:rocksdb::(anonymous namespace)::EmptyInternalIterator<rocksdb::IndexValue>::Next()
Unexecuted instantiation: iterator.cc:rocksdb::(anonymous namespace)::EmptyInternalIterator<rocksdb::Slice>::Next()
68
0
  void Prev() override { assert(false); }
Unexecuted instantiation: iterator.cc:rocksdb::(anonymous namespace)::EmptyInternalIterator<rocksdb::IndexValue>::Prev()
Unexecuted instantiation: iterator.cc:rocksdb::(anonymous namespace)::EmptyInternalIterator<rocksdb::Slice>::Prev()
69
0
  Slice key() const override {
70
0
    assert(false);
71
0
    return Slice();
72
0
  }
Unexecuted instantiation: iterator.cc:rocksdb::(anonymous namespace)::EmptyInternalIterator<rocksdb::IndexValue>::key() const
Unexecuted instantiation: iterator.cc:rocksdb::(anonymous namespace)::EmptyInternalIterator<rocksdb::Slice>::key() const
73
0
  TValue value() const override {
74
0
    assert(false);
75
0
    return TValue();
76
0
  }
Unexecuted instantiation: iterator.cc:rocksdb::(anonymous namespace)::EmptyInternalIterator<rocksdb::IndexValue>::value() const
Unexecuted instantiation: iterator.cc:rocksdb::(anonymous namespace)::EmptyInternalIterator<rocksdb::Slice>::value() const
77
0
  uint64_t write_unix_time() const override {
78
0
    assert(false);
79
0
    return std::numeric_limits<uint64_t>::max();
80
0
  }
Unexecuted instantiation: iterator.cc:rocksdb::(anonymous namespace)::EmptyInternalIterator<rocksdb::IndexValue>::write_unix_time() const
Unexecuted instantiation: iterator.cc:rocksdb::(anonymous namespace)::EmptyInternalIterator<rocksdb::Slice>::write_unix_time() const
81
0
  Status status() const override { return status_; }
Unexecuted instantiation: iterator.cc:rocksdb::(anonymous namespace)::EmptyInternalIterator<rocksdb::IndexValue>::status() const
Unexecuted instantiation: iterator.cc:rocksdb::(anonymous namespace)::EmptyInternalIterator<rocksdb::Slice>::status() const
82
83
 private:
84
  Status status_;
85
};
86
}  // namespace
87
88
0
Iterator* NewEmptyIterator() { return new EmptyIterator(Status::OK()); }
89
90
0
Iterator* NewErrorIterator(const Status& status) {
91
0
  return new EmptyIterator(status);
92
0
}
93
94
template <class TValue>
95
0
InternalIteratorBase<TValue>* NewErrorInternalIterator(const Status& status) {
96
0
  return new EmptyInternalIterator<TValue>(status);
97
0
}
Unexecuted instantiation: rocksdb::InternalIteratorBase<rocksdb::IndexValue>* rocksdb::NewErrorInternalIterator<rocksdb::IndexValue>(rocksdb::Status const&)
Unexecuted instantiation: rocksdb::InternalIteratorBase<rocksdb::Slice>* rocksdb::NewErrorInternalIterator<rocksdb::Slice>(rocksdb::Status const&)
98
template InternalIteratorBase<IndexValue>* NewErrorInternalIterator(
99
    const Status& status);
100
template InternalIteratorBase<Slice>* NewErrorInternalIterator(
101
    const Status& status);
102
103
template <class TValue>
104
InternalIteratorBase<TValue>* NewErrorInternalIterator(const Status& status,
105
0
                                                       Arena* arena) {
106
0
  if (arena == nullptr) {
107
0
    return NewErrorInternalIterator<TValue>(status);
108
0
  } else {
109
0
    auto mem = arena->AllocateAligned(sizeof(EmptyInternalIterator<TValue>));
110
0
    return new (mem) EmptyInternalIterator<TValue>(status);
111
0
  }
112
0
}
Unexecuted instantiation: rocksdb::InternalIteratorBase<rocksdb::IndexValue>* rocksdb::NewErrorInternalIterator<rocksdb::IndexValue>(rocksdb::Status const&, rocksdb::Arena*)
Unexecuted instantiation: rocksdb::InternalIteratorBase<rocksdb::Slice>* rocksdb::NewErrorInternalIterator<rocksdb::Slice>(rocksdb::Status const&, rocksdb::Arena*)
113
template InternalIteratorBase<IndexValue>* NewErrorInternalIterator(
114
    const Status& status, Arena* arena);
115
template InternalIteratorBase<Slice>* NewErrorInternalIterator(
116
    const Status& status, Arena* arena);
117
118
template <class TValue>
119
0
InternalIteratorBase<TValue>* NewEmptyInternalIterator() {
120
0
  return new EmptyInternalIterator<TValue>(Status::OK());
121
0
}
Unexecuted instantiation: rocksdb::InternalIteratorBase<rocksdb::IndexValue>* rocksdb::NewEmptyInternalIterator<rocksdb::IndexValue>()
Unexecuted instantiation: rocksdb::InternalIteratorBase<rocksdb::Slice>* rocksdb::NewEmptyInternalIterator<rocksdb::Slice>()
122
template InternalIteratorBase<IndexValue>* NewEmptyInternalIterator();
123
template InternalIteratorBase<Slice>* NewEmptyInternalIterator();
124
125
template <class TValue>
126
0
InternalIteratorBase<TValue>* NewEmptyInternalIterator(Arena* arena) {
127
0
  if (arena == nullptr) {
128
0
    return NewEmptyInternalIterator<TValue>();
129
0
  } else {
130
0
    auto mem = arena->AllocateAligned(sizeof(EmptyInternalIterator<TValue>));
131
0
    return new (mem) EmptyInternalIterator<TValue>(Status::OK());
132
0
  }
133
0
}
Unexecuted instantiation: rocksdb::InternalIteratorBase<rocksdb::IndexValue>* rocksdb::NewEmptyInternalIterator<rocksdb::IndexValue>(rocksdb::Arena*)
Unexecuted instantiation: rocksdb::InternalIteratorBase<rocksdb::Slice>* rocksdb::NewEmptyInternalIterator<rocksdb::Slice>(rocksdb::Arena*)
134
template InternalIteratorBase<IndexValue>* NewEmptyInternalIterator(
135
    Arena* arena);
136
template InternalIteratorBase<Slice>* NewEmptyInternalIterator(Arena* arena);
137
138
}  // namespace ROCKSDB_NAMESPACE