| 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
 |