1 // Copyright (c) 2011-present, Facebook, Inc. All rights reserved. 2 // This source code is licensed under both the GPLv2 (found in the 3 // COPYING file in the root directory) and Apache 2.0 License 4 // (found in the LICENSE.Apache file in the root directory). 5 // 6 // Copyright (c) 2011 The LevelDB Authors. All rights reserved. 7 // Use of this source code is governed by a BSD-style license that can be 8 // found in the LICENSE file. See the AUTHORS file for names of contributors. 9 10 #pragma once 11 #include <vector> 12 13 #include <stdint.h> 14 #include "rocksdb/slice.h" 15 #include "rocksdb/table.h" 16 #include "table/block_based/data_block_hash_index.h" 17 18 namespace ROCKSDB_NAMESPACE { 19 20 class BlockBuilder { 21 public: 22 BlockBuilder(const BlockBuilder&) = delete; 23 void operator=(const BlockBuilder&) = delete; 24 25 explicit BlockBuilder(int block_restart_interval, 26 bool use_delta_encoding = true, 27 bool use_value_delta_encoding = false, 28 BlockBasedTableOptions::DataBlockIndexType index_type = 29 BlockBasedTableOptions::kDataBlockBinarySearch, 30 double data_block_hash_table_util_ratio = 0.75); 31 32 // Reset the contents as if the BlockBuilder was just constructed. 33 void Reset(); 34 35 // REQUIRES: Finish() has not been called since the last call to Reset(). 36 // REQUIRES: key is larger than any previously added key 37 void Add(const Slice& key, const Slice& value, 38 const Slice* const delta_value = nullptr); 39 40 // Finish building the block and return a slice that refers to the 41 // block contents. The returned slice will remain valid for the 42 // lifetime of this builder or until Reset() is called. 43 Slice Finish(); 44 45 // Returns an estimate of the current (uncompressed) size of the block 46 // we are building. CurrentSizeEstimate()47 inline size_t CurrentSizeEstimate() const { 48 return estimate_ + (data_block_hash_index_builder_.Valid() 49 ? data_block_hash_index_builder_.EstimateSize() 50 : 0); 51 } 52 53 // Returns an estimated block size after appending key and value. 54 size_t EstimateSizeAfterKV(const Slice& key, const Slice& value) const; 55 56 // Return true iff no entries have been added since the last Reset() empty()57 bool empty() const { return buffer_.empty(); } 58 59 private: 60 const int block_restart_interval_; 61 // TODO(myabandeh): put it into a separate IndexBlockBuilder 62 const bool use_delta_encoding_; 63 // Refer to BlockIter::DecodeCurrentValue for format of delta encoded values 64 const bool use_value_delta_encoding_; 65 66 std::string buffer_; // Destination buffer 67 std::vector<uint32_t> restarts_; // Restart points 68 size_t estimate_; 69 int counter_; // Number of entries emitted since restart 70 bool finished_; // Has Finish() been called? 71 std::string last_key_; 72 DataBlockHashIndexBuilder data_block_hash_index_builder_; 73 }; 74 75 } // namespace ROCKSDB_NAMESPACE 76