github.com/treeverse/lakefs@v1.24.1-0.20240520134607-95648127bfb0/pkg/graveler/ref/repository_iterator.go (about) 1 package ref 2 3 import ( 4 "context" 5 "errors" 6 7 "github.com/treeverse/lakefs/pkg/graveler" 8 "github.com/treeverse/lakefs/pkg/kv" 9 ) 10 11 type RepositoryIterator struct { 12 ctx context.Context 13 it kv.MessageIterator 14 err error 15 value *graveler.RepositoryRecord 16 store kv.Store 17 closed bool 18 } 19 20 func NewRepositoryIterator(ctx context.Context, store kv.Store) (*RepositoryIterator, error) { 21 it, err := kv.NewPrimaryIterator(ctx, store, (&graveler.RepositoryData{}).ProtoReflect().Type(), graveler.RepositoriesPartition(), []byte(graveler.RepoPath("")), kv.IteratorOptionsAfter([]byte{})) 22 if err != nil { 23 return nil, err 24 } 25 return &RepositoryIterator{ 26 ctx: ctx, 27 it: it, 28 store: store, 29 closed: false, 30 }, nil 31 } 32 33 func (ri *RepositoryIterator) Next() bool { 34 if ri.Err() != nil || ri.closed { 35 return false 36 } 37 38 if !ri.it.Next() { 39 ri.value = nil 40 return false 41 } 42 e := ri.it.Entry() 43 if e == nil { 44 ri.err = graveler.ErrInvalid 45 return false 46 } 47 48 repo, ok := e.Value.(*graveler.RepositoryData) 49 if repo == nil || !ok { 50 ri.err = graveler.ErrReadingFromStore 51 return false 52 } 53 54 ri.value = graveler.RepoFromProto(repo) 55 return true 56 } 57 58 func (ri *RepositoryIterator) SeekGE(id graveler.RepositoryID) { 59 if errors.Is(ri.Err(), kv.ErrClosedEntries) { 60 return 61 } 62 ri.Close() 63 ri.it, ri.err = kv.NewPrimaryIterator(ri.ctx, ri.store, (&graveler.RepositoryData{}).ProtoReflect().Type(), graveler.RepositoriesPartition(), []byte(graveler.RepoPath("")), kv.IteratorOptionsFrom([]byte(graveler.RepoPath(id)))) 64 ri.closed = ri.err != nil 65 ri.value = nil 66 } 67 68 func (ri *RepositoryIterator) Value() *graveler.RepositoryRecord { 69 if ri.Err() != nil { 70 return nil 71 } 72 return ri.value 73 } 74 75 func (ri *RepositoryIterator) Err() error { 76 if ri.err != nil { 77 return ri.err 78 } 79 if !ri.closed { 80 return ri.it.Err() 81 } 82 return nil 83 } 84 85 func (ri *RepositoryIterator) Close() { 86 if ri.closed { 87 return 88 } 89 ri.it.Close() 90 ri.closed = true 91 }