• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright (c) 2011 The LevelDB Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. See the AUTHORS file for names of contributors.
4 //
5 // TableBuilder provides the interface used to build a Table
6 // (an immutable and sorted map from keys to values).
7 //
8 // Multiple threads can invoke const methods on a TableBuilder without
9 // external synchronization, but if any of the threads may call a
10 // non-const method, all threads accessing the same TableBuilder must use
11 // external synchronization.
12 
13 #ifndef STORAGE_LEVELDB_INCLUDE_TABLE_BUILDER_H_
14 #define STORAGE_LEVELDB_INCLUDE_TABLE_BUILDER_H_
15 
16 #include <cstdint>
17 
18 #include "leveldb/export.h"
19 #include "leveldb/options.h"
20 #include "leveldb/status.h"
21 
22 namespace leveldb {
23 
24 class BlockBuilder;
25 class BlockHandle;
26 class WritableFile;
27 
28 class LEVELDB_EXPORT TableBuilder {
29  public:
30   // Create a builder that will store the contents of the table it is
31   // building in *file.  Does not close the file.  It is up to the
32   // caller to close the file after calling Finish().
33   TableBuilder(const Options& options, WritableFile* file);
34 
35   TableBuilder(const TableBuilder&) = delete;
36   TableBuilder& operator=(const TableBuilder&) = delete;
37 
38   // REQUIRES: Either Finish() or Abandon() has been called.
39   ~TableBuilder();
40 
41   // Change the options used by this builder.  Note: only some of the
42   // option fields can be changed after construction.  If a field is
43   // not allowed to change dynamically and its value in the structure
44   // passed to the constructor is different from its value in the
45   // structure passed to this method, this method will return an error
46   // without changing any fields.
47   Status ChangeOptions(const Options& options);
48 
49   // Add key,value to the table being constructed.
50   // REQUIRES: key is after any previously added key according to comparator.
51   // REQUIRES: Finish(), Abandon() have not been called
52   void Add(const Slice& key, const Slice& value);
53 
54   // Advanced operation: flush any buffered key/value pairs to file.
55   // Can be used to ensure that two adjacent entries never live in
56   // the same data block.  Most clients should not need to use this method.
57   // REQUIRES: Finish(), Abandon() have not been called
58   void Flush();
59 
60   // Return non-ok iff some error has been detected.
61   Status status() const;
62 
63   // Finish building the table.  Stops using the file passed to the
64   // constructor after this function returns.
65   // REQUIRES: Finish(), Abandon() have not been called
66   Status Finish();
67 
68   // Indicate that the contents of this builder should be abandoned.  Stops
69   // using the file passed to the constructor after this function returns.
70   // If the caller is not going to call Finish(), it must call Abandon()
71   // before destroying this builder.
72   // REQUIRES: Finish(), Abandon() have not been called
73   void Abandon();
74 
75   // Number of calls to Add() so far.
76   uint64_t NumEntries() const;
77 
78   // Size of the file generated so far.  If invoked after a successful
79   // Finish() call, returns the size of the final generated file.
80   uint64_t FileSize() const;
81 
82  private:
ok()83   bool ok() const { return status().ok(); }
84   void WriteBlock(BlockBuilder* block, BlockHandle* handle);
85   void WriteRawBlock(const Slice& data, CompressionType, BlockHandle* handle);
86 
87   struct Rep;
88   Rep* rep_;
89 };
90 
91 }  // namespace leveldb
92 
93 #endif  // STORAGE_LEVELDB_INCLUDE_TABLE_BUILDER_H_
94