(ctx context.Context, c Scripter, keys []string, args ...interface{})
| 126 | } |
| 127 | |
| 128 | func (s *Script) EvalSha(ctx context.Context, c Scripter, keys []string, args ...interface{}) *Cmd { |
| 129 | // Default behavior: use client-side SHA-1 computed in NewScript. |
| 130 | if !s.serverSHA { |
| 131 | s.mu.RLock() |
| 132 | hash := s.hash |
| 133 | s.mu.RUnlock() |
| 134 | return c.EvalSha(ctx, hash, keys, args...) |
| 135 | } |
| 136 | |
| 137 | // Server-side SHA via SCRIPT LOAD + EVALSHA. |
| 138 | if err := s.ensureHash(ctx, c); err != nil { |
| 139 | return s.Eval(ctx, c, keys, args...) |
| 140 | } |
| 141 | |
| 142 | s.mu.RLock() |
| 143 | hash := s.hash |
| 144 | s.mu.RUnlock() |
| 145 | |
| 146 | r := c.EvalSha(ctx, hash, keys, args...) |
| 147 | if HasErrorPrefix(r.Err(), "NOSCRIPT") { |
| 148 | // Script cache was flushed; reload and retry once. |
| 149 | if err := s.ensureHash(ctx, c); err != nil { |
| 150 | return s.Eval(ctx, c, keys, args...) |
| 151 | } |
| 152 | s.mu.RLock() |
| 153 | hash = s.hash |
| 154 | s.mu.RUnlock() |
| 155 | return c.EvalSha(ctx, hash, keys, args...) |
| 156 | } |
| 157 | |
| 158 | return r |
| 159 | } |
| 160 | |
| 161 | func (s *Script) EvalShaRO(ctx context.Context, c Scripter, keys []string, args ...interface{}) *Cmd { |
| 162 | if !s.serverSHA { |
no test coverage detected