diff --git a/api.go b/api.go index 968404c..e9542bc 100644 --- a/api.go +++ b/api.go @@ -3,6 +3,7 @@ package pudge import ( "bytes" "encoding/gob" + "log" "os" ) @@ -321,21 +322,29 @@ func (db *Db) Keys(from interface{}, limit, offset int, asc bool) ([][]byte, err excludeFrom = 1 k, err := KeyToBinary(from) + log.Println(bytes.Equal(k[len(k)-1:], []byte("*"))) if err != nil { return arr, err } if len(k) > 1 && bytes.Equal(k[len(k)-1:], []byte("*")) { - prefix := make([]byte, len(k)-1) - copy(prefix, k) - return db.KeysByPrefix(prefix, limit, offset, asc) + byteOrStr := false + switch from.(type) { + case []byte: + byteOrStr = true + case string: + byteOrStr = true + } + if byteOrStr { + prefix := make([]byte, len(k)-1) + copy(prefix, k) + return db.KeysByPrefix(prefix, limit, offset, asc) + } } } db.RLock() defer db.RUnlock() - find, _ := db.findKey(from, asc) start, end := checkInterval(find, limit, offset, excludeFrom, len(db.keys), asc) - //log.Println(from, find, start, end) if start < 0 || start >= len(db.keys) { return arr, nil } diff --git a/pudge_test.go b/pudge_test.go index 1f29fe5..26622b2 100644 --- a/pudge_test.go +++ b/pudge_test.go @@ -574,3 +574,19 @@ func TestInMemoryWithoutPersist(t *testing.T) { } } + +func Test42(t *testing.T) { + DefaultConfig.StoreMode = 0 + f := "test/int64" + for i := 1; i < 64; i++ { + Set(f, int64(i), int64(i)) + } + keys, err := Keys(f, int64(42), 100, 0, true) + if err != nil { + t.Error(err) + } + if len(keys) != 22 { + t.Error("not 21", len(keys)) + } + DeleteFile(f) +}