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_DB_VERSION_EDIT_H_ 6 #define STORAGE_LEVELDB_DB_VERSION_EDIT_H_ 7 8 #include <set> 9 #include <utility> 10 #include <vector> 11 12 #include "db/dbformat.h" 13 14 namespace leveldb { 15 16 class VersionSet; 17 18 struct FileMetaData { FileMetaDataFileMetaData19 FileMetaData() : refs(0), allowed_seeks(1 << 30), file_size(0) {} 20 21 int refs; 22 int allowed_seeks; // Seeks allowed until compaction 23 uint64_t number; 24 uint64_t file_size; // File size in bytes 25 InternalKey smallest; // Smallest internal key served by table 26 InternalKey largest; // Largest internal key served by table 27 }; 28 29 class VersionEdit { 30 public: VersionEdit()31 VersionEdit() { Clear(); } 32 ~VersionEdit() = default; 33 34 void Clear(); 35 SetComparatorName(const Slice & name)36 void SetComparatorName(const Slice& name) { 37 has_comparator_ = true; 38 comparator_ = name.ToString(); 39 } SetLogNumber(uint64_t num)40 void SetLogNumber(uint64_t num) { 41 has_log_number_ = true; 42 log_number_ = num; 43 } SetPrevLogNumber(uint64_t num)44 void SetPrevLogNumber(uint64_t num) { 45 has_prev_log_number_ = true; 46 prev_log_number_ = num; 47 } SetNextFile(uint64_t num)48 void SetNextFile(uint64_t num) { 49 has_next_file_number_ = true; 50 next_file_number_ = num; 51 } SetLastSequence(SequenceNumber seq)52 void SetLastSequence(SequenceNumber seq) { 53 has_last_sequence_ = true; 54 last_sequence_ = seq; 55 } SetCompactPointer(int level,const InternalKey & key)56 void SetCompactPointer(int level, const InternalKey& key) { 57 compact_pointers_.push_back(std::make_pair(level, key)); 58 } 59 60 // Add the specified file at the specified number. 61 // REQUIRES: This version has not been saved (see VersionSet::SaveTo) 62 // REQUIRES: "smallest" and "largest" are smallest and largest keys in file AddFile(int level,uint64_t file,uint64_t file_size,const InternalKey & smallest,const InternalKey & largest)63 void AddFile(int level, uint64_t file, uint64_t file_size, 64 const InternalKey& smallest, const InternalKey& largest) { 65 FileMetaData f; 66 f.number = file; 67 f.file_size = file_size; 68 f.smallest = smallest; 69 f.largest = largest; 70 new_files_.push_back(std::make_pair(level, f)); 71 } 72 73 // Delete the specified "file" from the specified "level". RemoveFile(int level,uint64_t file)74 void RemoveFile(int level, uint64_t file) { 75 deleted_files_.insert(std::make_pair(level, file)); 76 } 77 78 void EncodeTo(std::string* dst) const; 79 Status DecodeFrom(const Slice& src); 80 81 std::string DebugString() const; 82 83 private: 84 friend class VersionSet; 85 86 typedef std::set<std::pair<int, uint64_t>> DeletedFileSet; 87 88 std::string comparator_; 89 uint64_t log_number_; 90 uint64_t prev_log_number_; 91 uint64_t next_file_number_; 92 SequenceNumber last_sequence_; 93 bool has_comparator_; 94 bool has_log_number_; 95 bool has_prev_log_number_; 96 bool has_next_file_number_; 97 bool has_last_sequence_; 98 99 std::vector<std::pair<int, InternalKey>> compact_pointers_; 100 DeletedFileSet deleted_files_; 101 std::vector<std::pair<int, FileMetaData>> new_files_; 102 }; 103 104 } // namespace leveldb 105 106 #endif // STORAGE_LEVELDB_DB_VERSION_EDIT_H_ 107