diff --git a/error.go b/error.go index 3232851..f87c915 100644 --- a/error.go +++ b/error.go @@ -13,6 +13,17 @@ import ( // ErrClosed performs any operation on the closed client will return this error. var ErrClosed = pool.ErrClosed +// HasErrorPrefix checks if the err is a Redis error and the message contains a prefix. +func HasErrorPrefix(err error, prefix string) bool { + err, ok := err.(Error) + if !ok { + return false + } + msg := err.Error() + msg = strings.TrimPrefix(msg, "ERR ") // KVRocks adds such prefix + return strings.HasPrefix(msg, prefix) +} + type Error interface { error diff --git a/script.go b/script.go index b0425b7..626ab03 100644 --- a/script.go +++ b/script.go @@ -5,7 +5,6 @@ import ( "crypto/sha1" "encoding/hex" "io" - "strings" ) type Scripter interface { @@ -68,7 +67,7 @@ func (s *Script) EvalShaRO(ctx context.Context, c Scripter, keys []string, args // it is retried using EVAL. func (s *Script) Run(ctx context.Context, c Scripter, keys []string, args ...interface{}) *Cmd { r := s.EvalSha(ctx, c, keys, args...) - if err := r.Err(); err != nil && strings.HasPrefix(err.Error(), "NOSCRIPT ") { + if HasErrorPrefix(r.Err(), "NOSCRIPT") { return s.Eval(ctx, c, keys, args...) } return r @@ -78,7 +77,7 @@ func (s *Script) Run(ctx context.Context, c Scripter, keys []string, args ...int // it is retried using EVAL_RO. func (s *Script) RunRO(ctx context.Context, c Scripter, keys []string, args ...interface{}) *Cmd { r := s.EvalShaRO(ctx, c, keys, args...) - if err := r.Err(); err != nil && strings.HasPrefix(err.Error(), "NOSCRIPT ") { + if HasErrorPrefix(r.Err(), "NOSCRIPT") { return s.EvalRO(ctx, c, keys, args...) } return r