1
0
forked from x/icebergs

add cache.limit

This commit is contained in:
shaoying 2020-09-13 00:10:56 +08:00
parent 27938bc30d
commit 1b8a538c7c
8 changed files with 64 additions and 63 deletions

View File

@ -120,6 +120,9 @@ func _hash_inputs(m *ice.Message, prefix, key string, field, value string) {
} }
func _hash_prunes(m *ice.Message, prefix, chain string, arg ...string) { func _hash_prunes(m *ice.Message, prefix, chain string, arg ...string) {
m.Richs(prefix, chain, kit.MDB_FOREACH, func(key string, val map[string]interface{}) { m.Richs(prefix, chain, kit.MDB_FOREACH, func(key string, val map[string]interface{}) {
if val[kit.MDB_META] != nil {
val = val[kit.MDB_META].(map[string]interface{})
}
for i := 0; i < len(arg)-1; i += 2 { for i := 0; i < len(arg)-1; i += 2 {
if val[arg[i]] != arg[i+1] { if val[arg[i]] != arg[i+1] {
return return
@ -347,6 +350,10 @@ var Index = &ice.Context{Name: "mdb", Help: "数据模块",
} }
}}, }},
SELECT: {Name: "select conf key type field value", Help: "数据查询", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { SELECT: {Name: "select conf key type field value", Help: "数据查询", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
m.Conf(arg[0], arg[1])
m.Option("cache.begin")
m.Option("cache.begin")
switch arg[2] { switch arg[2] {
case HASH: case HASH:
_hash_select(m, arg[0], arg[1], kit.Select("", arg, 3), kit.Select(kit.MDB_FOREACH, arg, 4)) _hash_select(m, arg[0], arg[1], kit.Select("", arg, 3), kit.Select(kit.MDB_FOREACH, arg, 4))

View File

@ -37,7 +37,6 @@ func _dream_show(m *ice.Message, name string) {
p := path.Join(m.Conf(DREAM, "meta.path"), name) p := path.Join(m.Conf(DREAM, "meta.path"), name)
os.MkdirAll(p, ice.MOD_DIR) os.MkdirAll(p, ice.MOD_DIR)
m.Debug("what %v", m.Option("repos"))
if m.Option("repos") != "" { if m.Option("repos") != "" {
m.Cmd("web.code.git.repos", "create", "remote", m.Option("repos"), "path", p) m.Cmd("web.code.git.repos", "create", "remote", m.Option("repos"), "path", p)
} }

View File

@ -83,6 +83,7 @@ func _serve_handle(key string, cmd *ice.Command, msg *ice.Message, w http.Respon
} }
// 用户请求 // 用户请求
msg.Option("cache.limit", "10")
msg.Option(ice.MSG_METHOD, r.Method) msg.Option(ice.MSG_METHOD, r.Method)
msg.Option(ice.MSG_USERWEB, kit.Select(msg.Conf(SHARE, "meta.domain"), r.Header.Get("Referer"))) msg.Option(ice.MSG_USERWEB, kit.Select(msg.Conf(SHARE, "meta.domain"), r.Header.Get("Referer")))
msg.Option(ice.MSG_USERIP, r.Header.Get(ice.MSG_USERIP)) msg.Option(ice.MSG_USERIP, r.Header.Get(ice.MSG_USERIP))
@ -135,6 +136,9 @@ func _serve_handle(key string, cmd *ice.Command, msg *ice.Message, w http.Respon
} }
} }
if msg.Option("cache.begin") == "" {
msg.Option("cache.begin", -kit.Int(msg.Option("cache.limit")))
}
// 执行命令 // 执行命令
if cmds, ok := _serve_login(msg, kit.Simple(msg.Optionv(ice.MSG_CMDS)), w, r); ok { if cmds, ok := _serve_login(msg, kit.Simple(msg.Optionv(ice.MSG_CMDS)), w, r); ok {
msg.Option("_option", msg.Optionv(ice.MSG_OPTION)) msg.Option("_option", msg.Optionv(ice.MSG_OPTION))

12
data.go
View File

@ -33,6 +33,18 @@ func (m *Message) Grows(key string, chain interface{}, match string, value strin
if cache == nil { if cache == nil {
return nil return nil
} }
begin := kit.Int(m.Option("cache.begin"))
limit := kit.Int(m.Option("cache.limit"))
count := kit.Int(m.Option("cache.count", kit.Int(kit.Value(cache, "meta.count"))))
if begin >= 0 || m.Option("cache.limit") == "" {
if begin > 0 {
begin -= 1
}
m.Option("cache.offend", count-begin-limit)
} else {
m.Option("cache.offend", -begin-limit)
}
return miss.Grows(kit.Keys(key, chain), cache, return miss.Grows(kit.Keys(key, chain), cache,
kit.Int(kit.Select("0", m.Option("cache.offend"))), kit.Int(kit.Select("0", m.Option("cache.offend"))),
kit.Int(kit.Select("10", m.Option("cache.limit"))), kit.Int(kit.Select("10", m.Option("cache.limit"))),

View File

@ -26,7 +26,8 @@ cd ./_install
chapter "应用" chapter "应用"
web.code.zsh.sess contexts web.code.zsh.sess contexts
field "会话" web.code.zsh.sess
field "命令行" web.code.zsh.sess
field "收藏夹" web.code.zsh.favor field "收藏夹" web.code.zsh.favor
field "同步流" web.code.zsh.sync field "同步流" web.code.zsh.sync

View File

@ -2,6 +2,7 @@ package zsh
import ( import (
ice "github.com/shylinux/icebergs" ice "github.com/shylinux/icebergs"
"github.com/shylinux/icebergs/base/aaa"
"github.com/shylinux/icebergs/base/mdb" "github.com/shylinux/icebergs/base/mdb"
"github.com/shylinux/icebergs/base/web" "github.com/shylinux/icebergs/base/web"
kit "github.com/shylinux/toolkits" kit "github.com/shylinux/toolkits"
@ -11,6 +12,13 @@ import (
"strings" "strings"
) )
const (
SID = "sid"
ARG = "arg"
SUB = "sub"
PWD = "pwd"
PID = "pid"
)
const SESS = "sess" const SESS = "sess"
func init() { func init() {
@ -22,7 +30,7 @@ func init() {
)}, )},
}, },
Commands: map[string]*ice.Command{ Commands: map[string]*ice.Command{
SESS: {Name: "sess hash auto 导出 导入", Help: "会话流", Action: map[string]*ice.Action{ SESS: {Name: "sess hash auto 清理", Help: "会话流", Action: map[string]*ice.Action{
"contexts": {Name: "contexts", Help: "环境", Hand: func(m *ice.Message, arg ...string) { "contexts": {Name: "contexts", Help: "环境", Hand: func(m *ice.Message, arg ...string) {
u := kit.ParseURL(m.Option(ice.MSG_USERWEB)) u := kit.ParseURL(m.Option(ice.MSG_USERWEB))
m.Option("httphost", fmt.Sprintf("%s://%s:%s", u.Scheme, strings.Split(u.Host, ":")[0], kit.Select(kit.Select("80", "443", u.Scheme == "https"), strings.Split(u.Host, ":"), 1))) m.Option("httphost", fmt.Sprintf("%s://%s:%s", u.Scheme, strings.Split(u.Host, ":")[0], kit.Select(kit.Select("80", "443", u.Scheme == "https"), strings.Split(u.Host, ":"), 1)))
@ -31,11 +39,8 @@ func init() {
m.Cmdy("web.wiki.spark", "shell", string(buf)) m.Cmdy("web.wiki.spark", "shell", string(buf))
} }
}}, }},
mdb.EXPORT: {Name: "export", Help: "导出", Hand: func(m *ice.Message, arg ...string) { mdb.PRUNES: {Name: "prunes", Help: "清理", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(mdb.EXPORT, m.Prefix(SESS), "", mdb.HASH) m.Cmdy(mdb.PRUNES, m.Prefix(SESS), "", mdb.HASH, kit.MDB_STATUS, "logout")
}},
mdb.IMPORT: {Name: "import", Help: "导入", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(mdb.IMPORT, m.Prefix(SESS), "", mdb.HASH)
}}, }},
}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
m.Option(mdb.FIELDS, kit.Select(m.Conf(m.Prefix(SESS), kit.META_FIELD), mdb.DETAIL, len(arg) > 0)) m.Option(mdb.FIELDS, kit.Select(m.Conf(m.Prefix(SESS), kit.META_FIELD), mdb.DETAIL, len(arg) > 0))
@ -43,17 +48,17 @@ func init() {
}}, }},
"/sess": {Name: "/sess", Help: "会话", Action: map[string]*ice.Action{ "/sess": {Name: "/sess", Help: "会话", Action: map[string]*ice.Action{
"logout": {Name: "logout", Help: "退出", Hand: func(m *ice.Message, arg ...string) { "logout": {Name: "logout", Help: "退出", Hand: func(m *ice.Message, arg ...string) {
m.Cmdy(mdb.MODIFY, m.Prefix(SESS), "", mdb.HASH, kit.MDB_HASH, m.Option("sid"), kit.MDB_STATUS, "logout") m.Cmdy(mdb.MODIFY, m.Prefix(SESS), "", mdb.HASH, kit.MDB_HASH, m.Option(SID), kit.MDB_STATUS, "logout")
}}, }},
}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
m.Option(mdb.FIELDS, m.Conf(m.Prefix(SESS), kit.META_FIELD)) m.Option(mdb.FIELDS, m.Conf(m.Prefix(SESS), kit.META_FIELD))
if strings.TrimSpace(m.Option("sid")) == "" { if strings.TrimSpace(m.Option(SID)) == "" {
m.Option("sid", m.Cmdx(mdb.INSERT, m.Prefix(SESS), "", mdb.HASH, m.Option(SID, m.Cmdx(mdb.INSERT, m.Prefix(SESS), "", mdb.HASH, kit.MDB_STATUS, "login",
"status", "login", "username", m.Option("username"), "hostname", m.Option("hostname"), "pid", m.Option("pid"), "pwd", m.Option("pwd"))) aaa.USERNAME, m.Option(aaa.USERNAME), aaa.HOSTNAME, m.Option(aaa.HOSTNAME), PID, m.Option(PID), PWD, m.Option(PWD)))
} else { } else {
m.Cmdy(mdb.MODIFY, m.Prefix(SESS), "", mdb.HASH, kit.MDB_HASH, m.Option("sid"), kit.MDB_STATUS, "login") m.Cmdy(mdb.MODIFY, m.Prefix(SESS), "", mdb.HASH, kit.MDB_HASH, m.Option(SID), kit.MDB_STATUS, "login")
} }
m.Echo(m.Option("sid")) m.Echo(m.Option(SID))
}}, }},
web.LOGIN: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { web.LOGIN: {Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
if f, _, e := m.R.FormFile(SUB); e == nil { if f, _, e := m.R.FormFile(SUB); e == nil {
@ -65,11 +70,11 @@ func init() {
} }
m.Option(mdb.FIELDS, m.Conf(m.Prefix(SESS), kit.META_FIELD)) m.Option(mdb.FIELDS, m.Conf(m.Prefix(SESS), kit.META_FIELD))
if strings.TrimSpace(m.Option("sid")) != "" { if strings.TrimSpace(m.Option(SID)) != "" {
msg := m.Cmd(mdb.SELECT, m.Prefix(SESS), "", mdb.HASH, kit.MDB_HASH, strings.TrimSpace(m.Option("sid"))) msg := m.Cmd(mdb.SELECT, m.Prefix(SESS), "", mdb.HASH, kit.MDB_HASH, strings.TrimSpace(m.Option(SID)))
if m.Option("sid", msg.Append("hash")) != "" { if m.Option(SID, msg.Append(kit.MDB_HASH)) != "" {
m.Option("username", msg.Append("username")) m.Option(aaa.USERNAME, msg.Append(aaa.USERNAME))
m.Option("hostname", msg.Append("hostname")) m.Option(aaa.HOSTNAME, msg.Append(aaa.HOSTNAME))
} }
} }
m.Render(ice.RENDER_RESULT) m.Render(ice.RENDER_RESULT)

View File

@ -9,11 +9,6 @@ import (
"strings" "strings"
) )
const (
ARG = "arg"
SUB = "sub"
PWD = "pwd"
)
const SYNC = "sync" const SYNC = "sync"
const SHELL = "shell" const SHELL = "shell"
@ -44,17 +39,28 @@ func init() {
}}, }},
}, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { }, Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
m.Option(mdb.FIELDS, kit.Select(m.Conf(SYNC, kit.META_FIELD), mdb.DETAIL, len(arg) > 0)) m.Option(mdb.FIELDS, kit.Select(m.Conf(SYNC, kit.META_FIELD), mdb.DETAIL, len(arg) > 0))
m.Cmdy(mdb.SELECT, m.Prefix(SYNC), "", mdb.LIST, kit.MDB_ID, arg) if m.Option("_control", "page"); m.Option("cache.limit") == "" {
m.PushAction("收藏") m.Option("cache.limit", "10")
}
if m.Option("cache.value") == "" {
m.Cmdy(mdb.SELECT, m.Prefix(SYNC), "", mdb.LIST, kit.MDB_ID, arg)
} else {
m.Cmdy(mdb.SELECT, m.Prefix(SYNC), "", mdb.LIST, m.Option("cache.field"), m.Option("cache.value"))
}
if len(arg) == 0 {
m.PushAction("收藏")
}
}}, }},
"/sync": {Name: "/sync", Help: "同步", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) { "/sync": {Name: "/sync", Help: "同步", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
switch arg[0] { switch arg[0] {
case "history": case "history":
vs := strings.SplitN(strings.TrimSpace(m.Option(ARG)), " ", 4) ls := strings.SplitN(strings.TrimSpace(m.Option(ARG)), " ", 4)
m.Cmd(mdb.INSERT, m.Prefix(SYNC), "", mdb.LIST, kit.MDB_TYPE, SHELL, kit.MDB_NAME, vs[0], if text := strings.TrimSpace(strings.Join(ls[3:], " ")); text != "" {
aaa.HOSTNAME, m.Option(aaa.HOSTNAME), aaa.USERNAME, m.Option(aaa.USERNAME), m.Cmd(mdb.INSERT, m.Prefix(SYNC), "", mdb.LIST, kit.MDB_TYPE, SHELL, kit.MDB_NAME, ls[0],
kit.MDB_TEXT, strings.Join(vs[3:], " "), PWD, m.Option(PWD), kit.MDB_TIME, vs[1]+" "+vs[2]) aaa.HOSTNAME, m.Option(aaa.HOSTNAME), aaa.USERNAME, m.Option(aaa.USERNAME),
kit.MDB_TEXT, text, PWD, m.Option(PWD), kit.MDB_TIME, ls[1]+" "+ls[2])
}
default: default:
m.Cmd(mdb.INSERT, m.Prefix(SYNC), "", mdb.HASH, kit.MDB_TYPE, SHELL, kit.MDB_NAME, arg[0], m.Cmd(mdb.INSERT, m.Prefix(SYNC), "", mdb.HASH, kit.MDB_TYPE, SHELL, kit.MDB_NAME, arg[0],
kit.MDB_TEXT, m.Option(SUB), PWD, m.Option(PWD)) kit.MDB_TEXT, m.Option(SUB), PWD, m.Option(PWD))

View File

@ -1,33 +0,0 @@
package zsh
import (
ice "github.com/shylinux/icebergs"
kit "github.com/shylinux/toolkits"
"net/url"
)
func init() {
Index.Merge(&ice.Context{
Commands: map[string]*ice.Command{
"/help": {Name: "/help", Help: "帮助", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
m.Cmdy("help")
}},
"/login": {Name: "/login", Help: "登录", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
m.Cmdy("login", "init", c.Name)
}},
"/logout": {Name: "/logout", Help: "登出", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
m.Cmdy("login", "exit")
}},
"/ish": {Name: "/ish", Help: "命令", Hand: func(m *ice.Message, c *ice.Context, cmd string, arg ...string) {
if sub, e := url.QueryUnescape(m.Option("sub")); m.Assert(e) {
m.Cmdy(kit.Split(sub))
if len(m.Resultv()) == 0 {
m.Table()
}
}
}},
},
}, nil)
}