github.com/vescale/zgraph@v0.0.0-20230410094002-959c02d50f95/storage/mvcc/decoders.go (about) 1 // Copyright 2022 zGraph Authors. All rights reserved. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 15 package mvcc 16 17 import ( 18 "bytes" 19 20 "github.com/cockroachdb/pebble" 21 ) 22 23 // LockDecoder is used to decode Lock entry of low-level key-value store. 24 type LockDecoder struct { 25 Lock Lock 26 ExpectKey []byte 27 } 28 29 // Decode decodes the Lock value if current iterator is at expectKey::Lock. 30 func (dec *LockDecoder) Decode(iter *pebble.Iterator) (bool, error) { 31 if iter.Error() != nil || !iter.Valid() { 32 return false, iter.Error() 33 } 34 35 iterKey := iter.Key() 36 key, ver, err := Decode(iterKey) 37 if err != nil { 38 return false, err 39 } 40 if !bytes.Equal(key, dec.ExpectKey) { 41 return false, nil 42 } 43 if ver != LockVer { 44 return false, nil 45 } 46 47 var lock Lock 48 val, err := iter.ValueAndErr() 49 if err != nil { 50 return false, err 51 } 52 err = lock.UnmarshalBinary(val) 53 if err != nil { 54 return false, err 55 } 56 dec.Lock = lock 57 iter.Next() 58 return true, nil 59 } 60 61 // ValueDecoder is used to decode the value entries. There will be multiple 62 // versions of specified key. 63 type ValueDecoder struct { 64 Value Value 65 ExpectKey []byte 66 } 67 68 // Decode decodes a mvcc value if iter key is expectKey. 69 func (dec *ValueDecoder) Decode(iter *pebble.Iterator) (bool, error) { 70 if iter.Error() != nil || !iter.Valid() { 71 return false, iter.Error() 72 } 73 74 key, ver, err := Decode(iter.Key()) 75 if err != nil { 76 return false, err 77 } 78 if !bytes.Equal(key, dec.ExpectKey) { 79 return false, nil 80 } 81 if ver == LockVer { 82 return false, nil 83 } 84 85 var value Value 86 val, err := iter.ValueAndErr() 87 if err != nil { 88 return false, err 89 } 90 err = value.UnmarshalBinary(val) 91 if err != nil { 92 return false, err 93 } 94 dec.Value = value 95 iter.Next() 96 return true, nil 97 } 98 99 // SkipDecoder is used to decode useless versions of value entry. 100 type SkipDecoder struct { 101 CurrKey []byte 102 } 103 104 // Decode skips the iterator as long as its key is currKey, the new key would be stored. 105 func (dec *SkipDecoder) Decode(iter *pebble.Iterator) (bool, error) { 106 if iter.Error() != nil { 107 return false, iter.Error() 108 } 109 for iter.Valid() { 110 key, _, err := Decode(iter.Key()) 111 if err != nil { 112 return false, err 113 } 114 if !bytes.Equal(key, dec.CurrKey) { 115 dec.CurrKey = key 116 return true, nil 117 } 118 iter.Next() 119 } 120 return false, nil 121 }