@@ -18,7 +18,9 @@ import (
1818
1919func commandsScripting (m * Miniredis ) {
2020 m .srv .Register ("EVAL" , m .cmdEval )
21+ m .srv .RegisterWithOptions ("EVAL_RO" , m .cmdEvalro , server .ReadOnlyOption ())
2122 m .srv .Register ("EVALSHA" , m .cmdEvalsha )
23+ m .srv .RegisterWithOptions ("EVALSHA_RO" , m .cmdEvalshaRo , server .ReadOnlyOption ())
2224 m .srv .Register ("SCRIPT" , m .cmdScript )
2325}
2426
2830
2931// Execute lua. Needs to run m.Lock()ed, from within withTx().
3032// Returns true if the lua was OK (and hence should be cached).
31- func (m * Miniredis ) runLuaScript (c * server.Peer , sha , script string , args []string ) bool {
33+ func (m * Miniredis ) runLuaScript (c * server.Peer , sha , script string , readOnly bool , args []string ) bool {
3234 l := lua .NewState (lua.Options {SkipOpenLibs : true })
3335 defer l .Close ()
3436
@@ -85,7 +87,7 @@ func (m *Miniredis) runLuaScript(c *server.Peer, sha, script string, args []stri
8587 }
8688 l .SetGlobal ("ARGV" , argvTable )
8789
88- redisFuncs , redisConstants := mkLua (m .srv , c , sha )
90+ redisFuncs , redisConstants := mkLua (m .srv , c , sha , readOnly )
8991 // Register command handlers
9092 l .Push (l .NewFunction (func (l * lua.LState ) int {
9193 mod := l .RegisterModule ("redis" , redisFuncs ).(* lua.LTable )
@@ -150,7 +152,8 @@ func compile(script string) (*lua.FunctionProto, error) {
150152 return proto , nil
151153}
152154
153- func (m * Miniredis ) cmdEval (c * server.Peer , cmd string , args []string ) {
155+ // Shared implementation for EVAL and EVALRO
156+ func (m * Miniredis ) cmdEvalShared (c * server.Peer , cmd string , readOnly bool , args []string ) {
154157 if ! m .isValidCMD (c , cmd , args , atLeast (2 )) {
155158 return
156159 }
@@ -165,14 +168,20 @@ func (m *Miniredis) cmdEval(c *server.Peer, cmd string, args []string) {
165168
166169 withTx (m , c , func (c * server.Peer , ctx * connCtx ) {
167170 sha := sha1Hex (script )
168- ok := m .runLuaScript (c , sha , script , args )
171+ ok := m .runLuaScript (c , sha , script , readOnly , args )
169172 if ok {
170173 m .scripts [sha ] = script
171174 }
172175 })
173176}
174177
175- func (m * Miniredis ) cmdEvalsha (c * server.Peer , cmd string , args []string ) {
178+ // Wrapper function for EVAL command
179+ func (m * Miniredis ) cmdEval (c * server.Peer , cmd string , args []string ) {
180+ m .cmdEvalShared (c , cmd , false , args )
181+ }
182+
183+ // Shared implementation for EVALSHA and EVALSHA_RO
184+ func (m * Miniredis ) cmdEvalshaShared (c * server.Peer , cmd string , readOnly bool , args []string ) {
176185 if ! m .isValidCMD (c , cmd , args , atLeast (2 )) {
177186 return
178187 }
@@ -192,10 +201,25 @@ func (m *Miniredis) cmdEvalsha(c *server.Peer, cmd string, args []string) {
192201 return
193202 }
194203
195- m .runLuaScript (c , sha , script , args )
204+ m .runLuaScript (c , sha , script , readOnly , args )
196205 })
197206}
198207
208+ // Wrapper function for EVALSHA command
209+ func (m * Miniredis ) cmdEvalsha (c * server.Peer , cmd string , args []string ) {
210+ m .cmdEvalshaShared (c , cmd , false , args )
211+ }
212+
213+ // Wrapper function for EVALRO command
214+ func (m * Miniredis ) cmdEvalro (c * server.Peer , cmd string , args []string ) {
215+ m .cmdEvalShared (c , cmd , true , args )
216+ }
217+
218+ // Wrapper function for EVALSHA_RO command
219+ func (m * Miniredis ) cmdEvalshaRo (c * server.Peer , cmd string , args []string ) {
220+ m .cmdEvalshaShared (c , cmd , true , args )
221+ }
222+
199223func (m * Miniredis ) cmdScript (c * server.Peer , cmd string , args []string ) {
200224 if ! m .isValidCMD (c , cmd , args , atLeast (1 )) {
201225 return
0 commit comments