github.com/fibonacci-chain/fbc@v0.0.0-20231124064014-c7636198c1e9/libs/tm-db/remotedb/iterator.go (about)

     1  package remotedb
     2  
     3  import (
     4  	"fmt"
     5  
     6  	db "github.com/fibonacci-chain/fbc/libs/tm-db"
     7  	protodb "github.com/fibonacci-chain/fbc/libs/tm-db/remotedb/proto"
     8  )
     9  
    10  func makeIterator(dic protodb.DB_IteratorClient) db.Iterator {
    11  	return &iterator{dic: dic}
    12  }
    13  
    14  func makeReverseIterator(dric protodb.DB_ReverseIteratorClient) db.Iterator {
    15  	return &reverseIterator{dric: dric}
    16  }
    17  
    18  type reverseIterator struct {
    19  	dric protodb.DB_ReverseIteratorClient
    20  	cur  *protodb.Iterator
    21  }
    22  
    23  var _ db.Iterator = (*iterator)(nil)
    24  
    25  // Valid implements Iterator.
    26  func (rItr *reverseIterator) Valid() bool {
    27  	return rItr.cur != nil && rItr.cur.Valid
    28  }
    29  
    30  // Domain implements Iterator.
    31  func (rItr *reverseIterator) Domain() (start, end []byte) {
    32  	if rItr.cur == nil || rItr.cur.Domain == nil {
    33  		return nil, nil
    34  	}
    35  	return rItr.cur.Domain.Start, rItr.cur.Domain.End
    36  }
    37  
    38  // Next implements Iterator.
    39  func (rItr *reverseIterator) Next() {
    40  	var err error
    41  	rItr.cur, err = rItr.dric.Recv()
    42  	if err != nil {
    43  		panic(fmt.Sprintf("RemoteDB.ReverseIterator.Next error: %v", err))
    44  	}
    45  }
    46  
    47  // Key implements Iterator.
    48  func (rItr *reverseIterator) Key() []byte {
    49  	if rItr.cur == nil {
    50  		panic("key does not exist")
    51  	}
    52  	return rItr.cur.Key
    53  }
    54  
    55  // Value implements Iterator.
    56  func (rItr *reverseIterator) Value() []byte {
    57  	if rItr.cur == nil {
    58  		panic("key does not exist")
    59  	}
    60  	return rItr.cur.Value
    61  }
    62  
    63  // Error implements Iterator.
    64  func (rItr *reverseIterator) Error() error {
    65  	return nil
    66  }
    67  
    68  // Close implements Iterator.
    69  func (rItr *reverseIterator) Close() {}
    70  
    71  // iterator implements the db.Iterator by retrieving
    72  // streamed iterators from the remote backend as
    73  // needed. It is NOT safe for concurrent usage,
    74  // matching the behavior of other iterators.
    75  type iterator struct {
    76  	dic protodb.DB_IteratorClient
    77  	cur *protodb.Iterator
    78  }
    79  
    80  var _ db.Iterator = (*iterator)(nil)
    81  
    82  // Valid implements Iterator.
    83  func (itr *iterator) Valid() bool {
    84  	return itr.cur != nil && itr.cur.Valid
    85  }
    86  
    87  // Domain implements Iterator.
    88  func (itr *iterator) Domain() (start, end []byte) {
    89  	if itr.cur == nil || itr.cur.Domain == nil {
    90  		return nil, nil
    91  	}
    92  	return itr.cur.Domain.Start, itr.cur.Domain.End
    93  }
    94  
    95  // Next implements Iterator.
    96  func (itr *iterator) Next() {
    97  	var err error
    98  	itr.cur, err = itr.dic.Recv()
    99  	if err != nil {
   100  		panic(fmt.Sprintf("remoteDB.Iterator.Next error: %v", err))
   101  	}
   102  }
   103  
   104  // Key implements Iterator.
   105  func (itr *iterator) Key() []byte {
   106  	if itr.cur == nil {
   107  		return nil
   108  	}
   109  	return itr.cur.Key
   110  }
   111  
   112  // Value implements Iterator.
   113  func (itr *iterator) Value() []byte {
   114  	if itr.cur == nil {
   115  		panic("current poisition is not valid")
   116  	}
   117  	return itr.cur.Value
   118  }
   119  
   120  // Error implements Iterator.
   121  func (itr *iterator) Error() error {
   122  	return nil
   123  }
   124  
   125  // Close implements Iterator.
   126  func (itr *iterator) Close() {
   127  	err := itr.dic.CloseSend()
   128  	if err != nil {
   129  		panic(fmt.Sprintf("Error closing iterator: %v", err))
   130  	}
   131  }