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 }