// Copyright (c) 2011-present, Facebook, Inc. All rights reserved. // This source code is licensed under both the GPLv2 (found in the // COPYING file in the root directory) and Apache 2.0 License // (found in the LICENSE.Apache file in the root directory). #pragma once #include #include #include #include #include #include #include "util/coding.h" #include "utilities/col_buf_encoder.h" namespace rocksdb { struct ColDeclaration; // ColBufDecoder is a class to decode column buffers. It can be populated from a // ColDeclaration. Before starting decoding, a Init() method should be called. // Each time it takes a column value into Decode() method. class ColBufDecoder { public: virtual ~ColBufDecoder() = 0; virtual size_t Init(const char* src) { return 0; } virtual size_t Decode(const char* src, char** dest) = 0; static ColBufDecoder* NewColBufDecoder(const ColDeclaration& col_declaration); protected: std::string buffer_; static inline bool IsRunLength(ColCompressionType type) { return type == kColRle || type == kColRleVarint || type == kColRleDeltaVarint || type == kColRleDict; } }; class FixedLengthColBufDecoder : public ColBufDecoder { public: explicit FixedLengthColBufDecoder( size_t size, ColCompressionType col_compression_type = kColNoCompression, bool nullable = false, bool big_endian = false) : size_(size), col_compression_type_(col_compression_type), nullable_(nullable), big_endian_(big_endian) {} size_t Init(const char* src) override; size_t Decode(const char* src, char** dest) override; ~FixedLengthColBufDecoder() {} private: size_t size_; ColCompressionType col_compression_type_; bool nullable_; bool big_endian_; // for decoding std::vector dict_vec_; uint64_t remain_runs_; uint64_t run_val_; uint64_t last_val_; }; class LongFixedLengthColBufDecoder : public ColBufDecoder { public: LongFixedLengthColBufDecoder(size_t size, bool nullable) : size_(size), nullable_(nullable) {} size_t Decode(const char* src, char** dest) override; ~LongFixedLengthColBufDecoder() {} private: size_t size_; bool nullable_; }; class VariableLengthColBufDecoder : public ColBufDecoder { public: size_t Decode(const char* src, char** dest) override; ~VariableLengthColBufDecoder() {} }; class VariableChunkColBufDecoder : public VariableLengthColBufDecoder { public: size_t Init(const char* src) override; size_t Decode(const char* src, char** dest) override; explicit VariableChunkColBufDecoder(ColCompressionType col_compression_type) : col_compression_type_(col_compression_type) {} VariableChunkColBufDecoder() : col_compression_type_(kColNoCompression) {} private: ColCompressionType col_compression_type_; std::unordered_map dictionary_; std::vector dict_vec_; }; struct KVPairColBufDecoders { std::vector> key_col_bufs; std::vector> value_col_bufs; std::unique_ptr value_checksum_buf; explicit KVPairColBufDecoders(const KVPairColDeclarations& kvp_cd) { for (auto kcd : *kvp_cd.key_col_declarations) { key_col_bufs.emplace_back( std::move(ColBufDecoder::NewColBufDecoder(kcd))); } for (auto vcd : *kvp_cd.value_col_declarations) { value_col_bufs.emplace_back( std::move(ColBufDecoder::NewColBufDecoder(vcd))); } value_checksum_buf.reset( ColBufDecoder::NewColBufDecoder(*kvp_cd.value_checksum_declaration)); } }; } // namespace rocksdb