作者: 韩晨旭@ArcueidType(Arcueid) 10225101440 李畅@wesley 10225102463 设计文档为PLAN.md,md版本报告为README.md,pdf版本报告为Report.pdf
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

92 lines
2.2 KiB

#include "table/vtable_format.h"
#include <locale>
#include "util/coding.h"
namespace leveldb {
namespace {
bool GetChar(Slice* input, unsigned char* value) {
if (input->empty()) {
return false;
}
*value = *input->data();
input->remove_prefix(1);
return true;
}
}
void VTableRecord::Encode(std::string* target) const {
PutLengthPrefixedSlice(target, key);
PutLengthPrefixedSlice(target, value);
}
Status VTableRecord::Decode(Slice* input) {
if (!GetLengthPrefixedSlice(input, &key) ||
!GetLengthPrefixedSlice(input, &value)) {
return Status::Corruption("Error decode VTableRecord");
}
return Status::OK();
}
void RecordEncoder::Encode(const VTableRecord& record) {
record_buff_.clear();
record.Encode(&record_buff_);
record_ = Slice(record_buff_.data(), record_buff_.size());
assert(record.size() < std::numeric_limits<uint32_t>::max());
EncodeFixed32(header_, static_cast<uint32_t>(record_.size()));
}
Status RecordDecoder::DecodeHeader(Slice* input) {
if (!GetFixed32(input, &record_size_)) {
return Status::Corruption("Error decode record header");
}
return Status::OK();
}
Status RecordDecoder::DecodeRecord(Slice* input, VTableRecord* record) const {
Slice record_input(input->data(), record_size_);
input->remove_prefix(record_size_);
return DecodeSrcIntoObj(record_input, record);
}
void VTableHandle::Encode(std::string* target) const {
PutVarint64(target, offset);
PutVarint64(target, size);
}
Status VTableHandle::Decode(Slice* input) {
if (!GetVarint64(input, &offset) || !GetVarint64(input, &size)) {
return Status::Corruption("Error decode VTableHandle");
}
return Status::OK();
}
void VTableIndex::Encode(std::string* target) const {
target->push_back(kVTableIndex);
PutVarint64(target, file_number);
vtable_handle.Encode(target);
}
Status VTableIndex::Decode(Slice* input) {
unsigned char type;
if (!GetChar(input, &type) || type != kVTableIndex ||
!GetVarint64(input, &file_number)) {
return Status::Corruption("Error decode VTableIndex");
}
Status s = vtable_handle.Decode(input);
if (!s.ok()) {
return Status::Corruption("Error decode VTableHandle", s.ToString());
}
return s;
}
} // namespace leveldb