| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980 |
- // 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).
- #ifndef ROCKSDB_LITE
- #include "rocksdb/utilities/debug.h"
- #include "db/db_impl/db_impl.h"
- namespace ROCKSDB_NAMESPACE {
- Status GetAllKeyVersions(DB* db, Slice begin_key, Slice end_key,
- size_t max_num_ikeys,
- std::vector<KeyVersion>* key_versions) {
- if (nullptr == db) {
- return Status::InvalidArgument("db cannot be null.");
- }
- return GetAllKeyVersions(db, db->DefaultColumnFamily(), begin_key, end_key,
- max_num_ikeys, key_versions);
- }
- Status GetAllKeyVersions(DB* db, ColumnFamilyHandle* cfh, Slice begin_key,
- Slice end_key, size_t max_num_ikeys,
- std::vector<KeyVersion>* key_versions) {
- if (nullptr == db) {
- return Status::InvalidArgument("db cannot be null.");
- }
- if (nullptr == cfh) {
- return Status::InvalidArgument("Column family handle cannot be null.");
- }
- if (nullptr == key_versions) {
- return Status::InvalidArgument("key_versions cannot be null.");
- }
- key_versions->clear();
- DBImpl* idb = static_cast<DBImpl*>(db->GetRootDB());
- auto icmp = InternalKeyComparator(idb->GetOptions(cfh).comparator);
- ReadRangeDelAggregator range_del_agg(&icmp,
- kMaxSequenceNumber /* upper_bound */);
- Arena arena;
- ScopedArenaIterator iter(idb->NewInternalIterator(&arena, &range_del_agg,
- kMaxSequenceNumber, cfh));
- if (!begin_key.empty()) {
- InternalKey ikey;
- ikey.SetMinPossibleForUserKey(begin_key);
- iter->Seek(ikey.Encode());
- } else {
- iter->SeekToFirst();
- }
- size_t num_keys = 0;
- for (; iter->Valid(); iter->Next()) {
- ParsedInternalKey ikey;
- if (!ParseInternalKey(iter->key(), &ikey)) {
- return Status::Corruption("Internal Key [" + iter->key().ToString() +
- "] parse error!");
- }
- if (!end_key.empty() &&
- icmp.user_comparator()->Compare(ikey.user_key, end_key) > 0) {
- break;
- }
- key_versions->emplace_back(ikey.user_key.ToString() /* _user_key */,
- iter->value().ToString() /* _value */,
- ikey.sequence /* _sequence */,
- static_cast<int>(ikey.type) /* _type */);
- if (++num_keys >= max_num_ikeys) {
- break;
- }
- }
- return Status::OK();
- }
- } // namespace ROCKSDB_NAMESPACE
- #endif // ROCKSDB_LITE
|