Coverage Report

Created: 2025-04-09 20:00

/root/bitcoin/src/leveldb/table/format.h
Line
Count
Source (jump to first uncovered line)
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
#ifndef STORAGE_LEVELDB_TABLE_FORMAT_H_
6
#define STORAGE_LEVELDB_TABLE_FORMAT_H_
7
8
#include <stdint.h>
9
10
#include <string>
11
12
#include "leveldb/slice.h"
13
#include "leveldb/status.h"
14
#include "leveldb/table_builder.h"
15
16
namespace leveldb {
17
18
class Block;
19
class RandomAccessFile;
20
struct ReadOptions;
21
22
// BlockHandle is a pointer to the extent of a file that stores a data
23
// block or a meta block.
24
class BlockHandle {
25
 public:
26
  // Maximum encoding length of a BlockHandle
27
  enum { kMaxEncodedLength = 10 + 10 };
28
29
  BlockHandle();
30
31
  // The offset of the block in the file.
32
0
  uint64_t offset() const { return offset_; }
33
0
  void set_offset(uint64_t offset) { offset_ = offset; }
34
35
  // The size of the stored block
36
0
  uint64_t size() const { return size_; }
37
0
  void set_size(uint64_t size) { size_ = size; }
38
39
  void EncodeTo(std::string* dst) const;
40
  Status DecodeFrom(Slice* input);
41
42
 private:
43
  uint64_t offset_;
44
  uint64_t size_;
45
};
46
47
// Footer encapsulates the fixed information stored at the tail
48
// end of every table file.
49
class Footer {
50
 public:
51
  // Encoded length of a Footer.  Note that the serialization of a
52
  // Footer will always occupy exactly this many bytes.  It consists
53
  // of two block handles and a magic number.
54
  enum { kEncodedLength = 2 * BlockHandle::kMaxEncodedLength + 8 };
55
56
0
  Footer() = default;
57
58
  // The block handle for the metaindex block of the table
59
0
  const BlockHandle& metaindex_handle() const { return metaindex_handle_; }
60
0
  void set_metaindex_handle(const BlockHandle& h) { metaindex_handle_ = h; }
61
62
  // The block handle for the index block of the table
63
0
  const BlockHandle& index_handle() const { return index_handle_; }
64
0
  void set_index_handle(const BlockHandle& h) { index_handle_ = h; }
65
66
  void EncodeTo(std::string* dst) const;
67
  Status DecodeFrom(Slice* input);
68
69
 private:
70
  BlockHandle metaindex_handle_;
71
  BlockHandle index_handle_;
72
};
73
74
// kTableMagicNumber was picked by running
75
//    echo http://code.google.com/p/leveldb/ | sha1sum
76
// and taking the leading 64 bits.
77
static const uint64_t kTableMagicNumber = 0xdb4775248b80fb57ull;
78
79
// 1-byte type + 32-bit crc
80
static const size_t kBlockTrailerSize = 5;
81
82
struct BlockContents {
83
  Slice data;           // Actual contents of data
84
  bool cachable;        // True iff data can be cached
85
  bool heap_allocated;  // True iff caller should delete[] data.data()
86
};
87
88
// Read the block identified by "handle" from "file".  On failure
89
// return non-OK.  On success fill *result and return OK.
90
Status ReadBlock(RandomAccessFile* file, const ReadOptions& options,
91
                 const BlockHandle& handle, BlockContents* result);
92
93
// Implementation details follow.  Clients should ignore,
94
95
inline BlockHandle::BlockHandle()
96
0
    : offset_(~static_cast<uint64_t>(0)), size_(~static_cast<uint64_t>(0)) {}
97
98
}  // namespace leveldb
99
100
#endif  // STORAGE_LEVELDB_TABLE_FORMAT_H_