github.com/scottcagno/storage@v1.8.0/pkg/_junk/_lsmtree/sstable/encode.go (about) 1 package sstable 2 3 import ( 4 "encoding/binary" 5 "io" 6 ) 7 8 func EncodeDataEntry(w io.WriteSeeker, ent *sstDataEntry) (int64, error) { 9 // get offset of where this entry is located 10 offset, err := w.Seek(0, io.SeekCurrent) 11 if err != nil { 12 return -1, err 13 } 14 // make buffer for encoding 15 buf := make([]byte, 16) 16 // encode key length 17 binary.LittleEndian.PutUint64(buf[0:8], uint64(len(ent.key))) 18 // encode value length 19 binary.LittleEndian.PutUint64(buf[8:16], uint64(len(ent.value))) 20 // write key and value length 21 _, err = w.Write(buf) 22 if err != nil { 23 return -1, err 24 } 25 // write key data 26 _, err = w.Write([]byte(ent.key)) 27 if err != nil { 28 return -1, err 29 } 30 // write value data 31 _, err = w.Write(ent.value) 32 if err != nil { 33 return -1, err 34 } 35 // return offset of entry 36 return offset, nil 37 } 38 39 func EncodeIndexEntry(w io.WriteSeeker, idx *sstIndexEntry) (int64, error) { 40 // get offset of where this entry is located 41 offset, err := w.Seek(0, io.SeekCurrent) 42 if err != nil { 43 return -1, err 44 } 45 // make buffer for encoding 46 buf := make([]byte, 16) 47 // encode key length 48 binary.LittleEndian.PutUint64(buf[0:8], uint64(len(idx.key))) 49 // encode offset value 50 binary.LittleEndian.PutUint64(buf[8:16], uint64(idx.offset)) 51 // write key length and offset value 52 _, err = w.Write(buf) 53 if err != nil { 54 return -1, err 55 } 56 // write key data 57 _, err = w.Write([]byte(idx.key)) 58 if err != nil { 59 return -1, err 60 } 61 // return offset of entry 62 return offset, nil 63 }