10215300402 朱维清 10222140408 谷杰
Non puoi selezionare più di 25 argomenti Gli argomenti devono iniziare con una lettera o un numero, possono includere trattini ('-') e possono essere lunghi fino a 35 caratteri.
 
 

58 righe
1.7 KiB

#ifndef LEVELDB_VLOG_READER_H
#define LEVELDB_VLOG_READER_H
#include <cstdint>
#include "db/log_format.h"
#include "leveldb/slice.h"
#include "leveldb/status.h"
namespace leveldb {
class SequentialFile;
class RandomAccessFile;
namespace log {
class VlogReader {
public:
class Reporter {
public:
virtual ~Reporter() = default;
virtual void Corruption(size_t bytes, const Status& status) = 0;
};
explicit VlogReader(SequentialFile* file, Reporter* reporter);
explicit VlogReader(RandomAccessFile* file, Reporter* reporter);
VlogReader(const VlogReader&) = delete;
VlogReader& operator=(const VlogReader&) = delete;
~VlogReader();
// 从 vlog 中读取一条具体的值
bool ReadValue(uint64_t offset, size_t length, Slice* key_value, char* scratch);
bool ReadRecord(Slice* record, std::string* scratch);
// 返回 ReadRecord 函数读取的最后一条 record 的偏移(last_record_offset_)
uint64_t LastRecordOffset() const;
private:
/* 读取 vlog 物理记录( data 部分) */
bool ReadPhysicalRecord(std::string* result);
void ReportCorruption(uint64_t bytes, const Status &reason);
SequentialFile* const file_;
RandomAccessFile* const file_random_;
Reporter* const reporter_;
char* const backing_store_;
Slice buffer_;
bool eof_; // Last Read() indicated EOF by returning < kBlockSize
// Offset of the last record returned by ReadRecord.
uint64_t last_record_offset_;
};
} // namespace log
} // namespace leveldb
#endif // LEVELDB_VLOG_READER_H