mirror of
https://github.com/taigrr/bitcask
synced 2025-01-18 04:03:17 -08:00
Return error if invalid range
This commit is contained in:
parent
20983b6713
commit
877b6a175c
@ -57,6 +57,7 @@ var (
|
|||||||
// (typically opened by another process)
|
// (typically opened by another process)
|
||||||
ErrDatabaseLocked = errors.New("error: database locked")
|
ErrDatabaseLocked = errors.New("error: database locked")
|
||||||
|
|
||||||
|
ErrInvalidRange = errors.New("error: invalid range")
|
||||||
ErrInvalidVersion = errors.New("error: invalid db version")
|
ErrInvalidVersion = errors.New("error: invalid db version")
|
||||||
|
|
||||||
// ErrMergeInProgress is the error returned if merge is called when already a merge
|
// ErrMergeInProgress is the error returned if merge is called when already a merge
|
||||||
@ -276,15 +277,18 @@ func (b *Bitcask) Scan(prefix []byte, f func(key []byte) error) (err error) {
|
|||||||
// If the function returns an error no further keys are processed and the
|
// If the function returns an error no further keys are processed and the
|
||||||
// first error returned.
|
// first error returned.
|
||||||
func (b *Bitcask) Range(start, end []byte, f func(key []byte) error) (err error) {
|
func (b *Bitcask) Range(start, end []byte, f func(key []byte) error) (err error) {
|
||||||
|
if bytes.Compare(start, end) == 1 {
|
||||||
|
return ErrInvalidRange
|
||||||
|
}
|
||||||
|
|
||||||
b.trie.ForEach(func(node art.Node) bool {
|
b.trie.ForEach(func(node art.Node) bool {
|
||||||
if bytes.Compare(node.Key(), start) >= 0 && bytes.Compare(node.Key(), end) <= 0 {
|
if bytes.Compare(node.Key(), start) >= 0 && bytes.Compare(node.Key(), end) <= 0 {
|
||||||
if err = f(node.Key()); err != nil {
|
if err = f(node.Key()); err != nil {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
return true
|
return true
|
||||||
} else {
|
|
||||||
return false
|
|
||||||
}
|
}
|
||||||
|
return false
|
||||||
})
|
})
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -1679,6 +1679,14 @@ func TestRange(t *testing.T) {
|
|||||||
assert.Error(err)
|
assert.Error(err)
|
||||||
assert.Equal(ErrMockError, err)
|
assert.Equal(ErrMockError, err)
|
||||||
})
|
})
|
||||||
|
|
||||||
|
t.Run("InvalidRange", func(t *testing.T) {
|
||||||
|
err = db.Range([]byte("foo_3"), []byte("foo_1"), func(key []byte) error {
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
assert.Error(err)
|
||||||
|
assert.Equal(ErrInvalidRange, err)
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestLocking(t *testing.T) {
|
func TestLocking(t *testing.T) {
|
||||||
|
@ -53,7 +53,7 @@ func _range(path, start, end string) int {
|
|||||||
return nil
|
return nil
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.WithError(err).Error("error rangening keys")
|
log.WithError(err).Error("error ranging over keys")
|
||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user