| 103 | } |
| 104 | |
| 105 | Status VersionEdit::DecodeFrom(const Slice& src) { |
| 106 | Clear(); |
| 107 | Slice input = src; |
| 108 | const char* msg = nullptr; |
| 109 | uint32_t tag; |
| 110 | |
| 111 | // Temporary storage for parsing |
| 112 | int level; |
| 113 | uint64_t number; |
| 114 | FileMetaData f; |
| 115 | Slice str; |
| 116 | InternalKey key; |
| 117 | |
| 118 | while (msg == nullptr && GetVarint32(&input, &tag)) { |
| 119 | switch (tag) { |
| 120 | case kComparator: |
| 121 | if (GetLengthPrefixedSlice(&input, &str)) { |
| 122 | comparator_ = str.ToString(); |
| 123 | has_comparator_ = true; |
| 124 | } else { |
| 125 | msg = "comparator name"; |
| 126 | } |
| 127 | break; |
| 128 | |
| 129 | case kLogNumber: |
| 130 | if (GetVarint64(&input, &log_number_)) { |
| 131 | has_log_number_ = true; |
| 132 | } else { |
| 133 | msg = "log number"; |
| 134 | } |
| 135 | break; |
| 136 | |
| 137 | case kPrevLogNumber: |
| 138 | if (GetVarint64(&input, &prev_log_number_)) { |
| 139 | has_prev_log_number_ = true; |
| 140 | } else { |
| 141 | msg = "previous log number"; |
| 142 | } |
| 143 | break; |
| 144 | |
| 145 | case kNextFileNumber: |
| 146 | if (GetVarint64(&input, &next_file_number_)) { |
| 147 | has_next_file_number_ = true; |
| 148 | } else { |
| 149 | msg = "next file number"; |
| 150 | } |
| 151 | break; |
| 152 | |
| 153 | case kLastSequence: |
| 154 | if (GetVarint64(&input, &last_sequence_)) { |
| 155 | has_last_sequence_ = true; |
| 156 | } else { |
| 157 | msg = "last sequence number"; |
| 158 | } |
| 159 | break; |
| 160 | |
| 161 | case kCompactPointer: |
| 162 | if (GetLevel(&input, &level) && GetInternalKey(&input, &key)) { |