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.
5 #ifndef STORAGE_LEVELDB_TABLE_FORMAT_H_
6 #define STORAGE_LEVELDB_TABLE_FORMAT_H_
10 #include "leveldb/slice.h"
11 #include "leveldb/status.h"
12 #include "leveldb/table_builder.h"
17 class RandomAccessFile
;
20 // BlockHandle is a pointer to the extent of a file that stores a data
21 // block or a meta block.
26 // The offset of the block in the file.
27 uint64_t offset() const { return offset_
; }
28 void set_offset(uint64_t offset
) { offset_
= offset
; }
30 // The size of the stored block
31 uint64_t size() const { return size_
; }
32 void set_size(uint64_t size
) { size_
= size
; }
34 void EncodeTo(std::string
* dst
) const;
35 Status
DecodeFrom(Slice
* input
);
37 // Maximum encoding length of a BlockHandle
38 enum { kMaxEncodedLength
= 10 + 10 };
45 // Footer encapsulates the fixed information stored at the tail
46 // end of every table file.
51 // The block handle for the metaindex block of the table
52 const BlockHandle
& metaindex_handle() const { return metaindex_handle_
; }
53 void set_metaindex_handle(const BlockHandle
& h
) { metaindex_handle_
= h
; }
55 // The block handle for the index block of the table
56 const BlockHandle
& index_handle() const {
59 void set_index_handle(const BlockHandle
& h
) {
63 void EncodeTo(std::string
* dst
) const;
64 Status
DecodeFrom(Slice
* input
);
66 // Encoded length of a Footer. Note that the serialization of a
67 // Footer will always occupy exactly this many bytes. It consists
68 // of two block handles and a magic number.
70 kEncodedLength
= 2*BlockHandle::kMaxEncodedLength
+ 8
74 BlockHandle metaindex_handle_
;
75 BlockHandle index_handle_
;
78 // kTableMagicNumber was picked by running
79 // echo http://code.google.com/p/leveldb/ | sha1sum
80 // and taking the leading 64 bits.
81 static const uint64_t kTableMagicNumber
= 0xdb4775248b80fb57ull
;
83 // 1-byte type + 32-bit crc
84 static const size_t kBlockTrailerSize
= 5;
86 struct BlockContents
{
87 Slice data
; // Actual contents of data
88 bool cachable
; // True iff data can be cached
89 bool heap_allocated
; // True iff caller should delete[] data.data()
92 // Read the block identified by "handle" from "file". On failure
93 // return non-OK. On success fill *result and return OK.
94 extern Status
ReadBlock(RandomAccessFile
* file
,
95 const ReadOptions
& options
,
96 const BlockHandle
& handle
,
97 BlockContents
* result
);
99 // Implementation details follow. Clients should ignore,
101 inline BlockHandle::BlockHandle()
102 : offset_(~static_cast<uint64_t>(0)),
103 size_(~static_cast<uint64_t>(0)) {
106 } // namespace leveldb
108 #endif // STORAGE_LEVELDB_TABLE_FORMAT_H_