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