#include "rocksdb/comparator.h"
#include "rocksdb/iterator.h"
#include "util/arena.h"
+#include "util/cast_util.h"
#include "utilities/write_batch_with_index/write_batch_with_index_internal.h"
namespace rocksdb {
Status WriteBatchWithIndex::GetFromBatchAndDB(
DB* db, const ReadOptions& read_options, ColumnFamilyHandle* column_family,
const Slice& key, PinnableSlice* pinnable_val, ReadCallback* callback) {
- if (UNLIKELY(db->GetRootDB() != db)) {
- return Status::NotSupported("The DB must be of DBImpl type");
- // Otherwise the cast below would fail
- }
Status s;
MergeContext merge_context;
const ImmutableDBOptions& immuable_db_options =
- reinterpret_cast<DBImpl*>(db)->immutable_db_options();
+ static_cast_with_check<DBImpl, DB>(db->GetRootDB())
+ ->immutable_db_options();
// Since the lifetime of the WriteBatch is the same as that of the transaction
// we cannot pin it as otherwise the returned value will not be available
if (!callback) {
s = db->Get(read_options, column_family, key, pinnable_val);
} else {
- s = reinterpret_cast<DBImpl*>(db)->GetImpl(read_options, column_family, key,
- pinnable_val, nullptr, callback);
+ s = static_cast_with_check<DBImpl, DB>(db->GetRootDB())
+ ->GetImpl(read_options, column_family, key, pinnable_val, nullptr,
+ callback);
}
if (s.ok() || s.IsNotFound()) { // DB Get Succeeded