@@ -18,7 +18,9 @@ import (
18
18
19
19
func commandsScripting (m * Miniredis ) {
20
20
m .srv .Register ("EVAL" , m .cmdEval )
21
+ m .srv .RegisterWithOptions ("EVAL_RO" , m .cmdEvalro , server .ReadOnlyOption ())
21
22
m .srv .Register ("EVALSHA" , m .cmdEvalsha )
23
+ m .srv .RegisterWithOptions ("EVALSHA_RO" , m .cmdEvalshaRo , server .ReadOnlyOption ())
22
24
m .srv .Register ("SCRIPT" , m .cmdScript )
23
25
}
24
26
28
30
29
31
// Execute lua. Needs to run m.Lock()ed, from within withTx().
30
32
// 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 {
32
34
l := lua .NewState (lua.Options {SkipOpenLibs : true })
33
35
defer l .Close ()
34
36
@@ -85,7 +87,7 @@ func (m *Miniredis) runLuaScript(c *server.Peer, sha, script string, args []stri
85
87
}
86
88
l .SetGlobal ("ARGV" , argvTable )
87
89
88
- redisFuncs , redisConstants := mkLua (m .srv , c , sha )
90
+ redisFuncs , redisConstants := mkLua (m .srv , c , sha , readOnly )
89
91
// Register command handlers
90
92
l .Push (l .NewFunction (func (l * lua.LState ) int {
91
93
mod := l .RegisterModule ("redis" , redisFuncs ).(* lua.LTable )
@@ -150,7 +152,8 @@ func compile(script string) (*lua.FunctionProto, error) {
150
152
return proto , nil
151
153
}
152
154
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 ) {
154
157
if ! m .isValidCMD (c , cmd , args , atLeast (2 )) {
155
158
return
156
159
}
@@ -165,14 +168,20 @@ func (m *Miniredis) cmdEval(c *server.Peer, cmd string, args []string) {
165
168
166
169
withTx (m , c , func (c * server.Peer , ctx * connCtx ) {
167
170
sha := sha1Hex (script )
168
- ok := m .runLuaScript (c , sha , script , args )
171
+ ok := m .runLuaScript (c , sha , script , readOnly , args )
169
172
if ok {
170
173
m .scripts [sha ] = script
171
174
}
172
175
})
173
176
}
174
177
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 ) {
176
185
if ! m .isValidCMD (c , cmd , args , atLeast (2 )) {
177
186
return
178
187
}
@@ -192,10 +201,25 @@ func (m *Miniredis) cmdEvalsha(c *server.Peer, cmd string, args []string) {
192
201
return
193
202
}
194
203
195
- m .runLuaScript (c , sha , script , args )
204
+ m .runLuaScript (c , sha , script , readOnly , args )
196
205
})
197
206
}
198
207
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
+
199
223
func (m * Miniredis ) cmdScript (c * server.Peer , cmd string , args []string ) {
200
224
if ! m .isValidCMD (c , cmd , args , atLeast (1 )) {
201
225
return
0 commit comments