diff --git a/bitcask.go b/bitcask.go index 2cc5303..6ffdfa4 100644 --- a/bitcask.go +++ b/bitcask.go @@ -57,6 +57,7 @@ var ( // (typically opened by another process) ErrDatabaseLocked = errors.New("error: database locked") + ErrInvalidRange = errors.New("error: invalid range") ErrInvalidVersion = errors.New("error: invalid db version") // 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 // first error returned. 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 { if bytes.Compare(node.Key(), start) >= 0 && bytes.Compare(node.Key(), end) <= 0 { if err = f(node.Key()); err != nil { return false } return true - } else { - return false } + return false }) return } diff --git a/bitcask_test.go b/bitcask_test.go index 807c69a..0aac2c0 100644 --- a/bitcask_test.go +++ b/bitcask_test.go @@ -1679,6 +1679,14 @@ func TestRange(t *testing.T) { assert.Error(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) { diff --git a/cmd/bitcask/range.go b/cmd/bitcask/range.go index 191262b..fc63852 100644 --- a/cmd/bitcask/range.go +++ b/cmd/bitcask/range.go @@ -53,7 +53,7 @@ func _range(path, start, end string) int { return nil }) if err != nil { - log.WithError(err).Error("error rangening keys") + log.WithError(err).Error("error ranging over keys") return 1 }