github.com/unicornultrafoundation/go-u2u@v1.0.0-rc1.0.20240205080301-e74a83d3fadc/utils/iodb/io_db.go (about) 1 package iodb 2 3 import ( 4 "io" 5 6 "github.com/unicornultrafoundation/go-helios/common/bigendian" 7 "github.com/unicornultrafoundation/go-helios/u2udb" 8 9 "github.com/unicornultrafoundation/go-u2u/utils/ioread" 10 ) 11 12 func Write(writer io.Writer, it u2udb.Iterator) error { 13 for it.Next() { 14 _, err := writer.Write(bigendian.Uint32ToBytes(uint32(len(it.Key())))) 15 if err != nil { 16 return err 17 } 18 _, err = writer.Write(it.Key()) 19 if err != nil { 20 return err 21 } 22 _, err = writer.Write(bigendian.Uint32ToBytes(uint32(len(it.Value())))) 23 if err != nil { 24 return err 25 } 26 _, err = writer.Write(it.Value()) 27 if err != nil { 28 return err 29 } 30 } 31 return nil 32 } 33 34 func NewIterator(reader io.Reader) u2udb.Iterator { 35 return &Iterator{ 36 reader: reader, 37 } 38 } 39 40 type Iterator struct { 41 reader io.Reader 42 key, value []byte 43 err error 44 } 45 46 func (it *Iterator) Next() bool { 47 if it.err != nil { 48 return false 49 } 50 var lenB [4]byte 51 it.err = ioread.ReadAll(it.reader, lenB[:]) 52 if it.err == io.EOF { 53 it.err = nil 54 return false 55 } 56 if it.err != nil { 57 return false 58 } 59 60 lenKey := bigendian.BytesToUint32(lenB[:]) 61 key := make([]byte, lenKey) 62 it.err = ioread.ReadAll(it.reader, key) 63 if it.err != nil { 64 return false 65 } 66 67 it.err = ioread.ReadAll(it.reader, lenB[:]) 68 if it.err != nil { 69 return false 70 } 71 72 lenValue := bigendian.BytesToUint32(lenB[:]) 73 value := make([]byte, lenValue) 74 it.err = ioread.ReadAll(it.reader, value) 75 if it.err != nil { 76 return false 77 } 78 79 it.key = key 80 it.value = value 81 return true 82 } 83 84 func (it *Iterator) Error() error { 85 return it.err 86 } 87 88 func (it *Iterator) Key() []byte { 89 return it.key 90 } 91 92 func (it *Iterator) Value() []byte { 93 return it.value 94 } 95 96 func (it *Iterator) Release() { 97 it.reader = nil 98 }