#ifndef VTABLE_FORMAT_H #define VTABLE_FORMAT_H #include "leveldb/slice.h" #include "leveldb/status.h" #include "table/format.h" namespace leveldb { const uint64_t kRecordHeaderSize = 4; struct VTableRecord { Slice key; Slice value; void Encode(std::string* target) const; Status Decode(Slice* input); size_t size() const { return key.size() + value.size(); } friend bool operator==(const VTableRecord& a, const VTableRecord& b) { return a.key == b.key && a.value == b.value; } }; class RecordEncoder { public: // TODO: Support compression while encoding a record RecordEncoder() = default; // Encode a vTable record void Encode(const VTableRecord& record); // Get the size of encoded record size_t GetEncodedSize() const { return sizeof(header_) + record_.size(); } // Get the header Slice GetHeader() const { return {header_, sizeof(header_)}; } // Get the encoded record Slice GetRecord() const {return record_; } private: char header_[kRecordHeaderSize]; Slice record_; std::string record_buff_; }; class RecordDecoder { public: Status DecodeHeader(Slice* input); Status DecodeRecord(Slice* input, VTableRecord* record) const; size_t GetDecodedSize() const { return record_size_; } private: uint32_t record_size_{0}; }; struct VTableHandle { uint64_t offset{0}; uint64_t size{0}; void Encode(std::string* target) const; Status Decode(Slice* input); friend bool operator==(const VTableHandle& a, const VTableHandle& b) { return a.offset == b.offset && a.size == b.size; } }; struct VTableIndex { enum Type : unsigned char { kVTableIndex = 1, }; uint64_t file_number{0}; VTableHandle vtable_handle; void Encode(std::string* target) const; Status Decode(Slice* input); friend bool operator==(const VTableIndex& a, const VTableIndex& b) { return a.file_number == b.file_number && a.vtable_handle == b.vtable_handle; } }; template Status DecodeSrcIntoObj(const Slice& src, T* target) { Slice input = src; Status s = target->Decode(&input); if (s.ok() && !input.empty()) { s = Status::Corruption(Slice()); } return s; } } // namespace leveldb #endif //VTABLE_FORMAT_H