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  }