#include #include "leveldb/env.h" #include "table/vtable_reader.h" namespace leveldb { Status VTableReader::Open(const Options& options, std::string fname) { options_ = options; Status s = options_.env->NewRandomAccessFile(fname, &file_); if (manager_ != nullptr) { manager_->RefVTable(fnum_); } return s; } Status VTableReader::Get(const VTableHandle& handle, VTableRecord* record) const { auto buf = new char[handle.size]; Slice input; Status s; if (file_ != nullptr) { s = file_->Read(handle.offset, handle.size, &input, buf); } else { s = Status::TimeOutRead("Get for another time"); } if (!s.ok()) { return s; } if (handle.size != static_cast(input.size())) { return Status::Corruption("Read input size not equal to record size: " + std::to_string(input.size()) + ":" + std::to_string(handle.size)); } RecordDecoder decoder; s = decoder.DecodeHeader(&input); if (!s.ok()) { return s; } s = decoder.DecodeRecord(&input, record); return s; } void VTableReader::Close() { file_ = nullptr; if (manager_ != nullptr) { manager_->UnrefVTable(fnum_); } } } // namespace leveldb