github.com/btcsuite/btcd@v0.24.0/database/ffldb/ldbtreapiter.go (about) 1 // Copyright (c) 2015-2016 The btcsuite developers 2 // Use of this source code is governed by an ISC 3 // license that can be found in the LICENSE file. 4 5 package ffldb 6 7 import ( 8 "github.com/btcsuite/btcd/database/internal/treap" 9 "github.com/syndtr/goleveldb/leveldb/iterator" 10 "github.com/syndtr/goleveldb/leveldb/util" 11 ) 12 13 // ldbTreapIter wraps a treap iterator to provide the additional functionality 14 // needed to satisfy the leveldb iterator.Iterator interface. 15 type ldbTreapIter struct { 16 *treap.Iterator 17 tx *transaction 18 released bool 19 } 20 21 // Enforce ldbTreapIter implements the leveldb iterator.Iterator interface. 22 var _ iterator.Iterator = (*ldbTreapIter)(nil) 23 24 // Error is only provided to satisfy the iterator interface as there are no 25 // errors for this memory-only structure. 26 // 27 // This is part of the leveldb iterator.Iterator interface implementation. 28 func (iter *ldbTreapIter) Error() error { 29 return nil 30 } 31 32 // SetReleaser is only provided to satisfy the iterator interface as there is no 33 // need to override it. 34 // 35 // This is part of the leveldb iterator.Iterator interface implementation. 36 func (iter *ldbTreapIter) SetReleaser(releaser util.Releaser) { 37 } 38 39 // Release releases the iterator by removing the underlying treap iterator from 40 // the list of active iterators against the pending keys treap. 41 // 42 // This is part of the leveldb iterator.Iterator interface implementation. 43 func (iter *ldbTreapIter) Release() { 44 if !iter.released { 45 iter.tx.removeActiveIter(iter.Iterator) 46 iter.released = true 47 } 48 } 49 50 // newLdbTreapIter creates a new treap iterator for the given slice against the 51 // pending keys for the passed transaction and returns it wrapped in an 52 // ldbTreapIter so it can be used as a leveldb iterator. It also adds the new 53 // iterator to the list of active iterators for the transaction. 54 func newLdbTreapIter(tx *transaction, slice *util.Range) *ldbTreapIter { 55 iter := tx.pendingKeys.Iterator(slice.Start, slice.Limit) 56 tx.addActiveIter(iter) 57 return &ldbTreapIter{Iterator: iter, tx: tx} 58 }