github.com/scottcagno/storage@v1.8.0/pkg/_junk/_lsmtree/sstable/decode.go (about) 1 package sstable 2 3 import ( 4 "encoding/binary" 5 "io" 6 ) 7 8 func DecodeDataEntry(r io.Reader) (*sstDataEntry, error) { 9 // make buffer for decoding 10 buf := make([]byte, 16) 11 // read key length 12 _, err := r.Read(buf[0:8]) 13 if err != nil { 14 return nil, err 15 } 16 // read val length 17 _, err = r.Read(buf[8:16]) 18 if err != nil { 19 return nil, err 20 } 21 // decode key length 22 klen := binary.LittleEndian.Uint64(buf[0:8]) 23 // decode val length 24 vlen := binary.LittleEndian.Uint64(buf[8:16]) 25 // make buffer to load the key and value into 26 data := make([]byte, klen+vlen) 27 // read key and value 28 _, err = r.Read(data) 29 if err != nil { 30 return nil, err 31 } 32 // fill out sstDataEntry 33 ent := &sstDataEntry{ 34 key: string(data[0:klen]), 35 value: data[klen : klen+vlen], 36 } 37 // return 38 return ent, nil 39 } 40 41 func DecodeDataEntryAt(r io.ReaderAt, offset int64) (*sstDataEntry, error) { 42 // make buffer for decoding 43 buf := make([]byte, 16) 44 // read key length 45 n, err := r.ReadAt(buf[0:8], offset) 46 if err != nil { 47 return nil, err 48 } 49 // update offset for next read 50 offset += int64(n) 51 // read val length 52 n, err = r.ReadAt(buf[8:16], offset) 53 if err != nil { 54 return nil, err 55 } 56 // update offset for next read 57 offset += int64(n) 58 // decode key length 59 klen := binary.LittleEndian.Uint64(buf[0:8]) 60 // decode val length 61 vlen := binary.LittleEndian.Uint64(buf[8:16]) 62 // make buffer to load the key and value into 63 data := make([]byte, klen+vlen) 64 // read key and value 65 _, err = r.ReadAt(data, offset) 66 if err != nil { 67 return nil, err 68 } 69 // fill out sstDataEntry 70 ent := &sstDataEntry{ 71 key: string(data[0:klen]), 72 value: data[klen : klen+vlen], 73 } 74 // return 75 return ent, nil 76 } 77 78 func DecodeIndexEntry(r io.Reader) (*sstIndexEntry, error) { 79 // make buffer for decoding 80 buf := make([]byte, 16) 81 // read key length 82 _, err := r.Read(buf[0:8]) 83 if err != nil { 84 return nil, err 85 } 86 // read data offset 87 _, err = r.Read(buf[8:16]) 88 if err != nil { 89 return nil, err 90 } 91 // decode key length 92 keyLength := binary.LittleEndian.Uint64(buf[0:8]) 93 // decode data offset 94 dataOffset := binary.LittleEndian.Uint64(buf[8:16]) 95 // make buffer to load the key into 96 key := make([]byte, keyLength) 97 // read key 98 _, err = r.Read(key) 99 if err != nil { 100 return nil, err 101 } 102 // fill out sstIndexEntry 103 idx := &sstIndexEntry{ 104 key: string(key), 105 offset: int64(dataOffset), 106 } 107 return idx, nil 108 }