You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
85 lines
1.7 KiB
85 lines
1.7 KiB
1 year ago
|
package function
|
||
|
|
||
|
import (
|
||
|
"RedisShake/internal/config"
|
||
|
"RedisShake/internal/entry"
|
||
|
"RedisShake/internal/log"
|
||
|
lua "github.com/yuin/gopher-lua"
|
||
|
"strings"
|
||
|
)
|
||
|
|
||
|
var luaString string
|
||
|
|
||
|
func Init() {
|
||
|
luaString = config.Opt.Function
|
||
|
luaString = strings.TrimSpace(luaString)
|
||
|
if len(luaString) == 0 {
|
||
|
log.Infof("no function script")
|
||
|
return
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// DB
|
||
|
// GROUP
|
||
|
// CMD
|
||
|
// KEYS
|
||
|
// SLOTS
|
||
|
// ARGV
|
||
|
|
||
|
// shake.call(DB, ARGV)
|
||
|
// shake.log()
|
||
|
|
||
|
func RunFunction(e *entry.Entry) []*entry.Entry {
|
||
|
entries := make([]*entry.Entry, 0)
|
||
|
if len(luaString) == 0 {
|
||
|
entries = append(entries, e)
|
||
|
return entries
|
||
|
}
|
||
|
|
||
|
L := lua.NewState()
|
||
|
L.SetGlobal("DB", lua.LNumber(e.DbId))
|
||
|
L.SetGlobal("GROUP", lua.LString(e.Group))
|
||
|
L.SetGlobal("CMD", lua.LString(e.CmdName))
|
||
|
keys := L.NewTable()
|
||
|
for _, key := range e.Keys {
|
||
|
keys.Append(lua.LString(key))
|
||
|
}
|
||
|
L.SetGlobal("KEYS", keys)
|
||
|
slots := L.NewTable()
|
||
|
for _, slot := range e.Slots {
|
||
|
slots.Append(lua.LNumber(slot))
|
||
|
}
|
||
|
L.SetGlobal("SLOTS", slots)
|
||
|
argv := L.NewTable()
|
||
|
for _, arg := range e.Argv {
|
||
|
argv.Append(lua.LString(arg))
|
||
|
}
|
||
|
L.SetGlobal("ARGV", argv)
|
||
|
shake := L.NewTypeMetatable("shake")
|
||
|
L.SetGlobal("shake", shake)
|
||
|
|
||
|
L.SetField(shake, "call", L.NewFunction(func(ls *lua.LState) int {
|
||
|
db := ls.ToInt(1)
|
||
|
argv := ls.ToTable(2)
|
||
|
var argvStrings []string
|
||
|
for i := 1; i <= argv.Len(); i++ {
|
||
|
argvStrings = append(argvStrings, argv.RawGetInt(i).String())
|
||
|
}
|
||
|
entries = append(entries, &entry.Entry{
|
||
|
DbId: db,
|
||
|
Argv: argvStrings,
|
||
|
})
|
||
|
return 0
|
||
|
}))
|
||
|
L.SetField(shake, "log", L.NewFunction(func(ls *lua.LState) int {
|
||
|
log.Infof("lua log: %v", ls.ToString(1))
|
||
|
return 0
|
||
|
}))
|
||
|
err := L.DoString(luaString)
|
||
|
if err != nil {
|
||
|
log.Panicf("load function script failed: %v", err)
|
||
|
}
|
||
|
|
||
|
return entries
|
||
|
}
|