diff --git a/request.go b/request.go index 8fb1fa1..af1deda 100644 --- a/request.go +++ b/request.go @@ -88,6 +88,7 @@ func (req *Request) getKey() (string, bool) { var key string if req.Args.Next(&key) { + key = parseKey(key) req.key = &key req.Args = MultiArgs(List(key), req.Args) } @@ -99,3 +100,24 @@ func (req *Request) getKey() (string, bool) { return *req.key, true } + +func parseKey(k string) string { + var key string + var s bool + for i := 0; i < len(k); i++ { + switch string(k[i]) { + case "{": + s = true + case "}": + break + default: + if s { + key += string(k[i]) + } + } + } + if key == "" { + return k + } + return key +} diff --git a/request_test.go b/request_test.go new file mode 100644 index 0000000..fdc59cb --- /dev/null +++ b/request_test.go @@ -0,0 +1,27 @@ +package redis + +import "testing" + +func TestGetKey(t *testing.T) { + req1 := NewRequest("localhost:6379", "SET", List("foo{bar}", "42")) + + k1, ok1 := req1.getKey() + if !ok1 { + t.Errorf("got no key for %s", req1.Args) + } + + if k1 != "bar" { + t.Errorf("expected 1 got %s", k1) + } + + req2 := NewRequest("localhost:6379", "SET", List("foo", "bar")) + + k2, ok2 := req2.getKey() + if !ok2 { + t.Errorf("got no key for %s", req2.Args) + } + + if k2 != "foo" { + t.Errorf("expected foo got %s", k2) + } +}