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
14namespace leveldb {
15
16class VersionSet;
17
18struct 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
29class 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 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