// Copyright (c) 2013, Facebook, Inc. All rights reserved.
// This source code is licensed under the BSD-style license found in the
// LICENSE file in the root directory of this source tree. An additional grant
// of patent rights can be found in the PATENTS file in the same directory.
//
// Copyright (c) 2011 The LevelDB Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file. See the AUTHORS file for names of contributors.
#pragma once
#include <stdint.h>
#include "rocksdb/flush_block_policy.h"
#include "rocksdb/options.h"
#include "rocksdb/status.h"
#include "rocksdb/table.h"
namespace
rocksdb {
class
BlockBuilder;
class
BlockHandle;
class
WritableFile;
class
BlockBasedTableBuilder :
public
TableBuilder {
public
:
// Create a builder that will store the contents of the table it is
// building in *file. Does not close the file. It is up to the
// caller to close the file after calling Finish().
BlockBasedTableBuilder(
const
Options& options,
WritableFile* file,
FlushBlockPolicyFactory* flush_block_policy_factory,
CompressionType compression_type);
// REQUIRES: Either Finish() or Abandon() has been called.
~BlockBasedTableBuilder();
// Add key,value to the table being constructed.
// REQUIRES: key is after any previously added key according to comparator.
// REQUIRES: Finish(), Abandon() have not been called
void
Add(
const
Slice& key,
const
Slice& value) override;
// Return non-ok iff some error has been detected.
Status status()
const
override;
// Finish building the table. Stops using the file passed to the
// constructor after this function returns.
// REQUIRES: Finish(), Abandon() have not been called
Status Finish() override;
// Indicate that the contents of this builder should be abandoned. Stops
// using the file passed to the constructor after this function returns.
// If the caller is not going to call Finish(), it must call Abandon()
// before destroying this builder.
// REQUIRES: Finish(), Abandon() have not been called
void
Abandon() override;
// Number of calls to Add() so far.
uint64_t NumEntries()
const
override;
// Size of the file generated so far. If invoked after a successful
// Finish() call, returns the size of the final generated file.
uint64_t FileSize()
const
override;
private
:
bool
ok()
const
{
return
status().ok(); }
void
WriteBlock(BlockBuilder* block, BlockHandle* handle);
void
WriteRawBlock(
const
Slice& data, CompressionType, BlockHandle* handle);
Status InsertBlockInCache(
const
Slice& block_contents,
const
CompressionType type,
const
BlockHandle* handle);
struct
Rep;
Rep* rep_;
// Advanced operation: flush any buffered key/value pairs to file.
// Can be used to ensure that two adjacent entries never live in
// the same data block. Most clients should not need to use this method.
// REQUIRES: Finish(), Abandon() have not been called
void
Flush();
// No copying allowed
BlockBasedTableBuilder(
const
BlockBasedTableBuilder&) =
delete
;
void
operator=(
const
BlockBasedTableBuilder&) =
delete
;
};
}
// namespace rocksdb