#pragma once
#include <stdint.h>
#include <string>
#include <vector>
#include "db/version_edit.h"
#include "rocksdb/options.h"
#include "rocksdb/status.h"
#include "rocksdb/table.h"
#include "rocksdb/table_properties.h"
#include "table/plain/plain_table_bloom.h"
#include "table/plain/plain_table_index.h"
#include "table/plain/plain_table_key_coding.h"
#include "table/table_builder.h"
namespace ROCKSDB_NAMESPACE {
class BlockBuilder;
class BlockHandle;
class WritableFile;
class TableBuilder;
class PlainTableBuilder : public TableBuilder {
public:
PlainTableBuilder(
const ImmutableOptions& ioptions, const MutableCFOptions& moptions,
const InternalTblPropCollFactories* internal_tbl_prop_coll_factories,
uint32_t column_family_id, int level_at_creation,
WritableFileWriter* file, uint32_t user_key_size,
EncodingType encoding_type, size_t index_sparseness,
uint32_t bloom_bits_per_key, const std::string& column_family_name,
uint32_t num_probes = 6, size_t huge_page_tlb_size = 0,
double hash_table_ratio = 0, bool store_index_in_file = false,
const std::string& db_id = "", const std::string& db_session_id = "",
uint64_t file_number = 0);
PlainTableBuilder(const PlainTableBuilder&) = delete;
void operator=(const PlainTableBuilder&) = delete;
~PlainTableBuilder();
void Add(const Slice& key, const Slice& value) override;
Status status() const override { return status_; }
IOStatus io_status() const override { return io_status_; }
Status Finish() override;
void Abandon() override;
uint64_t NumEntries() const override;
uint64_t FileSize() const override;
TableProperties GetTableProperties() const override { return properties_; }
bool SaveIndexInFile() const { return store_index_in_file_; }
std::string GetFileChecksum() const override;
const char* GetFileChecksumFuncName() const override;
void SetSeqnoTimeTableProperties(const SeqnoToTimeMapping& relevant_mapping,
uint64_t uint_64) override;
private:
Arena arena_;
const ImmutableOptions& ioptions_;
const MutableCFOptions& moptions_;
std::vector<std::unique_ptr<InternalTblPropColl>>
table_properties_collectors_;
BloomBlockBuilder bloom_block_;
std::unique_ptr<PlainTableIndexBuilder> index_builder_;
WritableFileWriter* file_;
uint64_t offset_ = 0;
uint32_t bloom_bits_per_key_;
size_t huge_page_tlb_size_;
Status status_;
IOStatus io_status_;
TableProperties properties_;
PlainTableKeyEncoder encoder_;
bool store_index_in_file_;
std::vector<uint32_t> keys_or_prefixes_hashes_;
bool closed_ = false;
const SliceTransform* prefix_extractor_;
Slice GetPrefix(const Slice& target) const {
assert(target.size() >= 8); return GetPrefixFromUserKey(ExtractUserKey(target));
}
Slice GetPrefix(const ParsedInternalKey& target) const {
return GetPrefixFromUserKey(target.user_key);
}
Slice GetPrefixFromUserKey(const Slice& user_key) const {
if (!IsTotalOrderMode()) {
return prefix_extractor_->Transform(user_key);
} else {
return Slice();
}
}
bool IsTotalOrderMode() const { return (prefix_extractor_ == nullptr); }
};
}