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