@@ -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