version_edit.h raw

   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 {
  19    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:
  31    VersionEdit() { Clear(); }
  32    ~VersionEdit() = default;
  33  
  34    void Clear();
  35  
  36    void SetComparatorName(const Slice& name) {
  37      has_comparator_ = true;
  38      comparator_ = name.ToString();
  39    }
  40    void SetLogNumber(uint64_t num) {
  41      has_log_number_ = true;
  42      log_number_ = num;
  43    }
  44    void SetPrevLogNumber(uint64_t num) {
  45      has_prev_log_number_ = true;
  46      prev_log_number_ = num;
  47    }
  48    void SetNextFile(uint64_t num) {
  49      has_next_file_number_ = true;
  50      next_file_number_ = num;
  51    }
  52    void SetLastSequence(SequenceNumber seq) {
  53      has_last_sequence_ = true;
  54      last_sequence_ = seq;
  55    }
  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
  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".
  74    void DeleteFile(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