package redis import "context" type ScriptingFunctionsCmdable interface { Eval(ctx context.Context, script string, keys []string, args ...interface{}) *Cmd EvalSha(ctx context.Context, sha1 string, keys []string, args ...interface{}) *Cmd EvalRO(ctx context.Context, script string, keys []string, args ...interface{}) *Cmd EvalShaRO(ctx context.Context, sha1 string, keys []string, args ...interface{}) *Cmd ScriptExists(ctx context.Context, hashes ...string) *BoolSliceCmd ScriptFlush(ctx context.Context) *StatusCmd ScriptKill(ctx context.Context) *StatusCmd ScriptLoad(ctx context.Context, script string) *StringCmd FunctionLoad(ctx context.Context, code string) *StringCmd FunctionLoadReplace(ctx context.Context, code string) *StringCmd FunctionDelete(ctx context.Context, libName string) *StringCmd FunctionFlush(ctx context.Context) *StringCmd FunctionKill(ctx context.Context) *StringCmd FunctionFlushAsync(ctx context.Context) *StringCmd FunctionList(ctx context.Context, q FunctionListQuery) *FunctionListCmd FunctionDump(ctx context.Context) *StringCmd FunctionRestore(ctx context.Context, libDump string) *StringCmd FunctionStats(ctx context.Context) *FunctionStatsCmd FCall(ctx context.Context, function string, keys []string, args ...interface{}) *Cmd FCallRo(ctx context.Context, function string, keys []string, args ...interface{}) *Cmd FCallRO(ctx context.Context, function string, keys []string, args ...interface{}) *Cmd } func (c cmdable) Eval(ctx context.Context, script string, keys []string, args ...interface{}) *Cmd { return c.eval(ctx, "eval", script, keys, args...) } func (c cmdable) EvalRO(ctx context.Context, script string, keys []string, args ...interface{}) *Cmd { return c.eval(ctx, "eval_ro", script, keys, args...) } func (c cmdable) EvalSha(ctx context.Context, sha1 string, keys []string, args ...interface{}) *Cmd { return c.eval(ctx, "evalsha", sha1, keys, args...) } func (c cmdable) EvalShaRO(ctx context.Context, sha1 string, keys []string, args ...interface{}) *Cmd { return c.eval(ctx, "evalsha_ro", sha1, keys, args...) } func (c cmdable) eval(ctx context.Context, name, payload string, keys []string, args ...interface{}) *Cmd { cmdArgs := make([]interface{}, 3+len(keys), 3+len(keys)+len(args)) cmdArgs[0] = name cmdArgs[1] = payload cmdArgs[2] = len(keys) for i, key := range keys { cmdArgs[3+i] = key } cmdArgs = appendArgs(cmdArgs, args) cmd := NewCmd(ctx, cmdArgs...) // it is possible that only args exist without a key. // rdb.eval(ctx, eval, script, nil, arg1, arg2) if len(keys) > 0 { cmd.SetFirstKeyPos(3) } _ = c(ctx, cmd) return cmd } func (c cmdable) ScriptExists(ctx context.Context, hashes ...string) *BoolSliceCmd { args := make([]interface{}, 2+len(hashes)) args[0] = "script" args[1] = "exists" for i, hash := range hashes { args[2+i] = hash } cmd := NewBoolSliceCmd(ctx, args...) _ = c(ctx, cmd) return cmd } func (c cmdable) ScriptFlush(ctx context.Context) *StatusCmd { cmd := NewStatusCmd(ctx, "script", "flush") _ = c(ctx, cmd) return cmd } func (c cmdable) ScriptKill(ctx context.Context) *StatusCmd { cmd := NewStatusCmd(ctx, "script", "kill") _ = c(ctx, cmd) return cmd } func (c cmdable) ScriptLoad(ctx context.Context, script string) *StringCmd { cmd := NewStringCmd(ctx, "script", "load", script) _ = c(ctx, cmd) return cmd } // ------------------------------------------------------------------------------ // FunctionListQuery is used with FunctionList to query for Redis libraries // // LibraryNamePattern - Use an empty string to get all libraries. // - Use a glob-style pattern to match multiple libraries with a matching name // - Use a library's full name to match a single library // WithCode - If true, it will return the code of the library type FunctionListQuery struct { LibraryNamePattern string WithCode bool } func (c cmdable) FunctionLoad(ctx context.Context, code string) *StringCmd { cmd := NewStringCmd(ctx, "function", "load", code) _ = c(ctx, cmd) return cmd } func (c cmdable) FunctionLoadReplace(ctx context.Context, code string) *StringCmd { cmd := NewStringCmd(ctx, "function", "load", "replace", code) _ = c(ctx, cmd) return cmd } func (c cmdable) FunctionDelete(ctx context.Context, libName string) *StringCmd { cmd := NewStringCmd(ctx, "function", "delete", libName) _ = c(ctx, cmd) return cmd } func (c cmdable) FunctionFlush(ctx context.Context) *StringCmd { cmd := NewStringCmd(ctx, "function", "flush") _ = c(ctx, cmd) return cmd } func (c cmdable) FunctionKill(ctx context.Context) *StringCmd { cmd := NewStringCmd(ctx, "function", "kill") _ = c(ctx, cmd) return cmd } func (c cmdable) FunctionFlushAsync(ctx context.Context) *StringCmd { cmd := NewStringCmd(ctx, "function", "flush", "async") _ = c(ctx, cmd) return cmd } func (c cmdable) FunctionList(ctx context.Context, q FunctionListQuery) *FunctionListCmd { args := make([]interface{}, 2, 5) args[0] = "function" args[1] = "list" if q.LibraryNamePattern != "" { args = append(args, "libraryname", q.LibraryNamePattern) } if q.WithCode { args = append(args, "withcode") } cmd := NewFunctionListCmd(ctx, args...) _ = c(ctx, cmd) return cmd } func (c cmdable) FunctionDump(ctx context.Context) *StringCmd { cmd := NewStringCmd(ctx, "function", "dump") _ = c(ctx, cmd) return cmd } func (c cmdable) FunctionRestore(ctx context.Context, libDump string) *StringCmd { cmd := NewStringCmd(ctx, "function", "restore", libDump) _ = c(ctx, cmd) return cmd } func (c cmdable) FunctionStats(ctx context.Context) *FunctionStatsCmd { cmd := NewFunctionStatsCmd(ctx, "function", "stats") _ = c(ctx, cmd) return cmd } func (c cmdable) FCall(ctx context.Context, function string, keys []string, args ...interface{}) *Cmd { cmdArgs := fcallArgs("fcall", function, keys, args...) cmd := NewCmd(ctx, cmdArgs...) if len(keys) > 0 { cmd.SetFirstKeyPos(3) } _ = c(ctx, cmd) return cmd } // FCallRo this function simply calls FCallRO, // Deprecated: to maintain convention FCallRO. func (c cmdable) FCallRo(ctx context.Context, function string, keys []string, args ...interface{}) *Cmd { return c.FCallRO(ctx, function, keys, args...) } func (c cmdable) FCallRO(ctx context.Context, function string, keys []string, args ...interface{}) *Cmd { cmdArgs := fcallArgs("fcall_ro", function, keys, args...) cmd := NewCmd(ctx, cmdArgs...) if len(keys) > 0 { cmd.SetFirstKeyPos(3) } _ = c(ctx, cmd) return cmd } func fcallArgs(command string, function string, keys []string, args ...interface{}) []interface{} { cmdArgs := make([]interface{}, 3+len(keys), 3+len(keys)+len(args)) cmdArgs[0] = command cmdArgs[1] = function cmdArgs[2] = len(keys) for i, key := range keys { cmdArgs[3+i] = key } cmdArgs = append(cmdArgs, args...) return cmdArgs }