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 <string> 9 #include <stdint.h> 10 #include "leveldb/slice.h" 11 #include "leveldb/status.h" 12 #include "leveldb/table_builder.h" 13 14 namespace leveldb { 15 16 class Block; 17 class RandomAccessFile; 18 struct ReadOptions; 19 20 // BlockHandle is a pointer to the extent of a file that stores a data 21 // block or a meta block. 22 class BlockHandle { 23 public: 24 BlockHandle(); 25 26 // The offset of the block in the file. offset()27 uint64_t offset() const { return offset_; } set_offset(uint64_t offset)28 void set_offset(uint64_t offset) { offset_ = offset; } 29 30 // The size of the stored block size()31 uint64_t size() const { return size_; } set_size(uint64_t size)32 void set_size(uint64_t size) { size_ = size; } 33 34 void EncodeTo(std::string* dst) const; 35 Status DecodeFrom(Slice* input); 36 37 // Maximum encoding length of a BlockHandle 38 enum { kMaxEncodedLength = 10 + 10 }; 39 40 private: 41 uint64_t offset_; 42 uint64_t size_; 43 }; 44 45 // Footer encapsulates the fixed information stored at the tail 46 // end of every table file. 47 class Footer { 48 public: Footer()49 Footer() { } 50 51 // The block handle for the metaindex block of the table metaindex_handle()52 const BlockHandle& metaindex_handle() const { return metaindex_handle_; } set_metaindex_handle(const BlockHandle & h)53 void set_metaindex_handle(const BlockHandle& h) { metaindex_handle_ = h; } 54 55 // The block handle for the index block of the table index_handle()56 const BlockHandle& index_handle() const { 57 return index_handle_; 58 } set_index_handle(const BlockHandle & h)59 void set_index_handle(const BlockHandle& h) { 60 index_handle_ = h; 61 } 62 63 void EncodeTo(std::string* dst) const; 64 Status DecodeFrom(Slice* input); 65 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. 69 enum { 70 kEncodedLength = 2*BlockHandle::kMaxEncodedLength + 8 71 }; 72 73 private: 74 BlockHandle metaindex_handle_; 75 BlockHandle index_handle_; 76 }; 77 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; 82 83 // 1-byte type + 32-bit crc 84 static const size_t kBlockTrailerSize = 5; 85 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() 90 }; 91 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); 98 99 // Implementation details follow. Clients should ignore, 100 BlockHandle()101inline BlockHandle::BlockHandle() 102 : offset_(~static_cast<uint64_t>(0)), 103 size_(~static_cast<uint64_t>(0)) { 104 } 105 106 } // namespace leveldb 107 108 #endif // STORAGE_LEVELDB_TABLE_FORMAT_H_ 109