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  }