|
@@ -3,6 +3,7 @@ package rds
|
|
|
import (
|
|
import (
|
|
|
"github.com/go-redis/redis"
|
|
"github.com/go-redis/redis"
|
|
|
"io/ioutil"
|
|
"io/ioutil"
|
|
|
|
|
+ "one.com/kettle/utl"
|
|
|
"os"
|
|
"os"
|
|
|
"path/filepath"
|
|
"path/filepath"
|
|
|
"strings"
|
|
"strings"
|
|
@@ -29,12 +30,6 @@ import (
|
|
|
名字不能重名
|
|
名字不能重名
|
|
|
*/
|
|
*/
|
|
|
|
|
|
|
|
-// LuaBlock
|
|
|
|
|
-type LuaBlock struct {
|
|
|
|
|
- *redis.Script
|
|
|
|
|
- name string
|
|
|
|
|
-}
|
|
|
|
|
-
|
|
|
|
|
type luablocker interface {
|
|
type luablocker interface {
|
|
|
Eval(script string, keys []string, args ...interface{}) *redis.Cmd
|
|
Eval(script string, keys []string, args ...interface{}) *redis.Cmd
|
|
|
EvalSha(sha1 string, keys []string, args ...interface{}) *redis.Cmd
|
|
EvalSha(sha1 string, keys []string, args ...interface{}) *redis.Cmd
|
|
@@ -46,44 +41,48 @@ var _ luablocker = (*redis.Client)(nil)
|
|
|
var _ luablocker = (*redis.Ring)(nil)
|
|
var _ luablocker = (*redis.Ring)(nil)
|
|
|
var _ luablocker = (*redis.ClusterClient)(nil)
|
|
var _ luablocker = (*redis.ClusterClient)(nil)
|
|
|
|
|
|
|
|
-func newLuaBlock(name, block string) *LuaBlock {
|
|
|
|
|
- return &LuaBlock{
|
|
|
|
|
- Script: redis.NewScript(block),
|
|
|
|
|
- name: name,
|
|
|
|
|
- }
|
|
|
|
|
|
|
+type LuaSrc struct {
|
|
|
|
|
+ code, hash string
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// LuaBlockManager
|
|
// LuaBlockManager
|
|
|
-type LuaScripts struct {
|
|
|
|
|
- m map[string]*LuaBlock
|
|
|
|
|
|
|
+type LuaScriptManager struct {
|
|
|
|
|
+ m map[string]*LuaSrc
|
|
|
h luablocker
|
|
h luablocker
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-func NewLuaScripts(handle luablocker) *LuaScripts {
|
|
|
|
|
- return &LuaScripts{
|
|
|
|
|
- m: make(map[string]*LuaBlock),
|
|
|
|
|
|
|
+func NewLuaScriptManager(handle luablocker) *LuaScriptManager {
|
|
|
|
|
+ return &LuaScriptManager{
|
|
|
|
|
+ m: make(map[string]*LuaSrc),
|
|
|
h: handle,
|
|
h: handle,
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-func (self *LuaScripts) Exec(name string, keys []string, args ...interface{}) *redis.Cmd {
|
|
|
|
|
- luablock, ok := self.m[name]
|
|
|
|
|
|
|
+func (self *LuaScriptManager) Exec(name string, keys []string, args ...interface{}) *redis.Cmd {
|
|
|
|
|
+ src, ok := self.m[name]
|
|
|
if !ok {
|
|
if !ok {
|
|
|
panic("not load lua script:" + name)
|
|
panic("not load lua script:" + name)
|
|
|
}
|
|
}
|
|
|
- return luablock.EvalSha(self.h, keys, args)
|
|
|
|
|
|
|
+ return self.h.EvalSha(src.hash, keys, args...)
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-func (self *LuaScripts) LoadString(name string, block string) error {
|
|
|
|
|
- _, err := self.h.ScriptLoad(block).Result()
|
|
|
|
|
|
|
+func (self *LuaScriptManager) LoadString(name string, src string) error {
|
|
|
|
|
+ hash, err := self.h.ScriptLoad(src).Result()
|
|
|
if err != nil {
|
|
if err != nil {
|
|
|
return err
|
|
return err
|
|
|
}
|
|
}
|
|
|
- self.m[name] = newLuaBlock(name, block)
|
|
|
|
|
|
|
+ self.m[name] = &LuaSrc{
|
|
|
|
|
+ code: src,
|
|
|
|
|
+ hash: hash,
|
|
|
|
|
+ }
|
|
|
return nil
|
|
return nil
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-func (self *LuaScripts) LoadFile(f string) error {
|
|
|
|
|
|
|
+func (self *LuaScriptManager) LoadFile(f string) error {
|
|
|
|
|
+ ext := filepath.Ext(f)
|
|
|
|
|
+ if strings.ToLower(ext) != ".lua" {
|
|
|
|
|
+ return utl.ErrParameters
|
|
|
|
|
+ }
|
|
|
data, err := ioutil.ReadFile(f)
|
|
data, err := ioutil.ReadFile(f)
|
|
|
if err != nil {
|
|
if err != nil {
|
|
|
return err
|
|
return err
|
|
@@ -94,7 +93,7 @@ func (self *LuaScripts) LoadFile(f string) error {
|
|
|
return self.LoadString(name, string(data))
|
|
return self.LoadString(name, string(data))
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-func (self *LuaScripts) LoadPath(p string) error {
|
|
|
|
|
|
|
+func (self *LuaScriptManager) LoadPath(p string) error {
|
|
|
err := filepath.Walk(p, func(path string, info os.FileInfo, err error) error {
|
|
err := filepath.Walk(p, func(path string, info os.FileInfo, err error) error {
|
|
|
if err != nil {
|
|
if err != nil {
|
|
|
return err
|
|
return err
|
|
@@ -106,6 +105,7 @@ func (self *LuaScripts) LoadPath(p string) error {
|
|
|
if fi.IsDir() {
|
|
if fi.IsDir() {
|
|
|
return nil
|
|
return nil
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
return self.LoadFile(path)
|
|
return self.LoadFile(path)
|
|
|
})
|
|
})
|
|
|
return err
|
|
return err
|