forked from x/ContextOS
tce add Message.confx
This commit is contained in:
parent
a599d1f39b
commit
f2294a5b67
@ -210,7 +210,7 @@ var Index = &ctx.Context{Name: "aaa", Help: "认证中心",
|
|||||||
// }}}
|
// }}}
|
||||||
}},
|
}},
|
||||||
"md5": &ctx.Command{Name: "md5 [file filename][content]", Help: "散列",
|
"md5": &ctx.Command{Name: "md5 [file filename][content]", Help: "散列",
|
||||||
Formats: map[string]int{"file": 1},
|
Form: map[string]int{"file": 1},
|
||||||
Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) {
|
Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) {
|
||||||
if m.Options("file") { // {{{
|
if m.Options("file") { // {{{
|
||||||
f, e := os.Open(m.Option("file"))
|
f, e := os.Open(m.Option("file"))
|
||||||
@ -235,7 +235,7 @@ var Index = &ctx.Context{Name: "aaa", Help: "认证中心",
|
|||||||
解密: rsa decrypt keyfile key.pem mmfile mm.txt
|
解密: rsa decrypt keyfile key.pem mmfile mm.txt
|
||||||
签名: rsa sign keyfile key.pem signfile sign.txt hello
|
签名: rsa sign keyfile key.pem signfile sign.txt hello
|
||||||
验签: rsa verify keyfile pubkey.pem signfile sign.txt hello`,
|
验签: rsa verify keyfile pubkey.pem signfile sign.txt hello`,
|
||||||
Formats: map[string]int{"keyfile": 1, "key": 1, "mmfile": 1, "mm": 1, "signfile": 1, "signs": 1, "file": 1},
|
Form: map[string]int{"keyfile": 1, "key": 1, "mmfile": 1, "mm": 1, "signfile": 1, "signs": 1, "file": 1},
|
||||||
Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) {
|
Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) {
|
||||||
if arg[0] == "gen" { // {{{
|
if arg[0] == "gen" { // {{{
|
||||||
keys, e := rsa.GenerateKey(crand.Reader, 1024)
|
keys, e := rsa.GenerateKey(crand.Reader, 1024)
|
||||||
@ -355,7 +355,7 @@ var Index = &ctx.Context{Name: "aaa", Help: "认证中心",
|
|||||||
// }}}
|
// }}}
|
||||||
}},
|
}},
|
||||||
"deal": &ctx.Command{Name: "deal init|sell|buy|done [keyfile name][key str]", Help: "散列",
|
"deal": &ctx.Command{Name: "deal init|sell|buy|done [keyfile name][key str]", Help: "散列",
|
||||||
Formats: map[string]int{"file": 1},
|
Form: map[string]int{"file": 1},
|
||||||
Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) {
|
Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) {
|
||||||
if m.Options("file") { // {{{
|
if m.Options("file") { // {{{
|
||||||
f, e := os.Open(m.Option("file"))
|
f, e := os.Open(m.Option("file"))
|
||||||
|
@ -322,7 +322,7 @@ var Index = &ctx.Context{Name: "cli", Help: "管理中心",
|
|||||||
} // }}}
|
} // }}}
|
||||||
}},
|
}},
|
||||||
"time": &ctx.Command{Name: "time [parse when] format when",
|
"time": &ctx.Command{Name: "time [parse when] format when",
|
||||||
Formats: map[string]int{"parse": 1},
|
Form: map[string]int{"parse": 1},
|
||||||
Help: "睡眠, time(ns/us/ms/s/m/h): 时间值(纳秒/微秒/毫秒/秒/分钟/小时)", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) {
|
Help: "睡眠, time(ns/us/ms/s/m/h): 时间值(纳秒/微秒/毫秒/秒/分钟/小时)", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) {
|
||||||
t := time.Now() // {{{
|
t := time.Now() // {{{
|
||||||
if m.Options("parse") {
|
if m.Options("parse") {
|
||||||
|
@ -3,6 +3,7 @@ package ctx // {{{
|
|||||||
import ( // {{{
|
import ( // {{{
|
||||||
"crypto/md5"
|
"crypto/md5"
|
||||||
"encoding/hex"
|
"encoding/hex"
|
||||||
|
"encoding/json"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"html/template"
|
"html/template"
|
||||||
@ -45,10 +46,11 @@ type Command struct {
|
|||||||
Name string
|
Name string
|
||||||
Help string
|
Help string
|
||||||
|
|
||||||
Formats map[string]int
|
|
||||||
Options map[string]string
|
|
||||||
Shares map[string][]string
|
Shares map[string][]string
|
||||||
|
Options map[string]string
|
||||||
Appends map[string]string
|
Appends map[string]string
|
||||||
|
|
||||||
|
Form map[string]int
|
||||||
Hand func(m *Message, c *Context, key string, arg ...string)
|
Hand func(m *Message, c *Context, key string, arg ...string)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -87,6 +89,144 @@ type Context struct {
|
|||||||
Server
|
Server
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *Context) Spawn(m *Message, name string, help string) *Context { // {{{
|
||||||
|
s := &Context{Name: name, Help: help, root: c.root, context: c}
|
||||||
|
|
||||||
|
if m.target = s; c.Server != nil {
|
||||||
|
c.Register(s, c.Server.Spawn(m, s, m.Meta["detail"]...))
|
||||||
|
} else {
|
||||||
|
c.Register(s, nil)
|
||||||
|
}
|
||||||
|
|
||||||
|
if m.Template != nil {
|
||||||
|
m.Template.source = s
|
||||||
|
}
|
||||||
|
|
||||||
|
return s
|
||||||
|
}
|
||||||
|
|
||||||
|
// }}}
|
||||||
|
func (c *Context) Begin(m *Message) *Context { // {{{
|
||||||
|
c.Caches["status"] = &Cache{Name: "服务状态(begin/start/close)", Value: "begin", Help: "服务状态,begin:初始完成,start:正在运行,close:未在运行"}
|
||||||
|
c.Caches["stream"] = &Cache{Name: "服务数据", Value: "", Help: "服务数据"}
|
||||||
|
|
||||||
|
item := []string{}
|
||||||
|
m.BackTrace(func(m *Message) bool {
|
||||||
|
item = append(item, m.target.Name)
|
||||||
|
return true
|
||||||
|
})
|
||||||
|
for i := 0; i < len(item)/2; i++ {
|
||||||
|
item[i], item[len(item)-i-1] = item[len(item)-i-1], item[i]
|
||||||
|
}
|
||||||
|
c.Caches["module"] = &Cache{Name: "服务数据", Value: strings.Join(item, "."), Help: "服务数据"}
|
||||||
|
|
||||||
|
m.Index = 1
|
||||||
|
c.Pulse = m
|
||||||
|
c.Requests = []*Message{m}
|
||||||
|
c.Historys = []*Message{m}
|
||||||
|
c.Sessions = map[string]*Message{}
|
||||||
|
|
||||||
|
c.master = m.master.master
|
||||||
|
c.Owner = m.master.Owner
|
||||||
|
|
||||||
|
m.Log("begin", nil, "%d context %v %v", m.root.Capi("ncontext", 1), m.Meta["detail"], m.Meta["option"])
|
||||||
|
for k, x := range c.Configs {
|
||||||
|
if x.Hand != nil {
|
||||||
|
m.Conf(k, x.Value)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if c.Server != nil {
|
||||||
|
c.Server.Begin(m, m.Meta["detail"]...)
|
||||||
|
}
|
||||||
|
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
|
||||||
|
// }}}
|
||||||
|
func (c *Context) Start(m *Message) bool { // {{{
|
||||||
|
m.Hand = true
|
||||||
|
|
||||||
|
if m != c.Requests[0] {
|
||||||
|
c.Requests, m.Index = append(c.Requests, m), len(c.Requests)+1
|
||||||
|
}
|
||||||
|
|
||||||
|
if m.Cap("status") != "start" {
|
||||||
|
running := make(chan bool)
|
||||||
|
go m.TryCatch(m, true, func(m *Message) {
|
||||||
|
m.Log(m.Cap("status", "start"), nil, "%d server %v %v", m.root.Capi("nserver", 1), m.Meta["detail"], m.Meta["option"])
|
||||||
|
|
||||||
|
if running <- true; c.Server != nil && c.Server.Start(m, m.Meta["detail"]...) {
|
||||||
|
c.Close(m, m.Meta["detail"]...)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
<-running
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
// }}}
|
||||||
|
func (c *Context) Close(m *Message, arg ...string) bool { // {{{
|
||||||
|
m.Log("close", c, "%d:%d %v", len(m.source.Sessions), len(m.target.Historys), arg)
|
||||||
|
|
||||||
|
if m.target == c {
|
||||||
|
if m.Index == 0 {
|
||||||
|
for i := len(c.Requests) - 1; i >= 0; i-- {
|
||||||
|
v := c.Requests[i]
|
||||||
|
if v.Index = -1; v.source != c && !v.source.Close(v, arg...) {
|
||||||
|
v.Index = i
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
c.Requests = c.Requests[:i]
|
||||||
|
}
|
||||||
|
} else if m.Index > 0 {
|
||||||
|
for i := m.Index - 1; i < len(c.Requests)-1; i++ {
|
||||||
|
c.Requests[i] = c.Requests[i+1]
|
||||||
|
}
|
||||||
|
c.Requests = c.Requests[:len(c.Requests)-1]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if c.Server != nil && !c.Server.Close(m, arg...) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
if m.source == c && m.target != c {
|
||||||
|
if _, ok := c.Sessions[m.Name]; ok {
|
||||||
|
delete(c.Sessions, m.Name)
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(c.Requests) > 1 {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
if m.Cap("status") == "start" {
|
||||||
|
m.Log(m.Cap("status", "close"), nil, "%d server %v", m.root.Capi("nserver", -1)+1, arg)
|
||||||
|
for _, v := range c.Sessions {
|
||||||
|
if v.target != c {
|
||||||
|
v.target.Close(v, arg...)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// if m.Index == 0 && c.context != nil && len(c.contexts) == 0 {
|
||||||
|
if c.context != nil {
|
||||||
|
m.Log("close", nil, "%d context %v", m.root.Capi("ncontext", -1)+1, arg)
|
||||||
|
delete(c.context.contexts, c.Name)
|
||||||
|
c.context = nil
|
||||||
|
if c.Exit != nil {
|
||||||
|
m.Log("info", nil, "before exit<-")
|
||||||
|
c.Exit <- true
|
||||||
|
m.Log("info", nil, "after exit<-")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
// }}}
|
||||||
|
|
||||||
func (c *Context) Password(meta string) string { // {{{
|
func (c *Context) Password(meta string) string { // {{{
|
||||||
bs := md5.Sum([]byte(fmt.Sprintln("%d%d%s", time.Now().Unix(), rand.Int(), meta)))
|
bs := md5.Sum([]byte(fmt.Sprintln("%d%d%s", time.Now().Unix(), rand.Int(), meta)))
|
||||||
sessid := hex.EncodeToString(bs[:])
|
sessid := hex.EncodeToString(bs[:])
|
||||||
@ -179,143 +319,6 @@ func (c *Context) Check(m *Message, arg ...string) bool { // {{{
|
|||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
// }}}
|
|
||||||
func (c *Context) Spawn(m *Message, name string, help string) *Context { // {{{
|
|
||||||
s := &Context{Name: name, Help: help, root: c.root, context: c}
|
|
||||||
|
|
||||||
if m.target = s; c.Server != nil {
|
|
||||||
c.Register(s, c.Server.Spawn(m, s, m.Meta["detail"]...))
|
|
||||||
} else {
|
|
||||||
c.Register(s, nil)
|
|
||||||
}
|
|
||||||
|
|
||||||
if m.Template != nil {
|
|
||||||
m.Template.source = s
|
|
||||||
}
|
|
||||||
|
|
||||||
return s
|
|
||||||
}
|
|
||||||
|
|
||||||
// }}}
|
|
||||||
func (c *Context) Begin(m *Message) *Context { // {{{
|
|
||||||
c.Caches["status"] = &Cache{Name: "服务状态(begin/start/close)", Value: "begin", Help: "服务状态,begin:初始完成,start:正在运行,close:未在运行"}
|
|
||||||
c.Caches["stream"] = &Cache{Name: "服务数据", Value: "", Help: "服务数据"}
|
|
||||||
|
|
||||||
item := []string{}
|
|
||||||
m.BackTrace(func(m *Message) bool {
|
|
||||||
item = append(item, m.target.Name)
|
|
||||||
return true
|
|
||||||
})
|
|
||||||
for i := 0; i < len(item)/2; i++ {
|
|
||||||
item[i], item[len(item)-i-1] = item[len(item)-i-1], item[i]
|
|
||||||
}
|
|
||||||
c.Caches["module"] = &Cache{Name: "服务数据", Value: strings.Join(item, "."), Help: "服务数据"}
|
|
||||||
|
|
||||||
m.Index = 1
|
|
||||||
c.Pulse = m
|
|
||||||
c.Requests = []*Message{m}
|
|
||||||
c.Historys = []*Message{m}
|
|
||||||
c.Sessions = map[string]*Message{}
|
|
||||||
|
|
||||||
c.master = m.master.master
|
|
||||||
c.Owner = m.master.Owner
|
|
||||||
|
|
||||||
m.Log("begin", nil, "%d context %v %v", m.root.Capi("ncontext", 1), m.Meta["detail"], m.Meta["option"])
|
|
||||||
for k, x := range c.Configs {
|
|
||||||
if x.Hand != nil {
|
|
||||||
m.Conf(k, x.Value)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if c.Server != nil {
|
|
||||||
c.Server.Begin(m, m.Meta["detail"]...)
|
|
||||||
}
|
|
||||||
|
|
||||||
return c
|
|
||||||
}
|
|
||||||
|
|
||||||
// }}}
|
|
||||||
func (c *Context) Start(m *Message) bool { // {{{
|
|
||||||
m.Hand = true
|
|
||||||
|
|
||||||
if m != c.Requests[0] {
|
|
||||||
c.Requests, m.Index = append(c.Requests, m), len(c.Requests)+1
|
|
||||||
}
|
|
||||||
|
|
||||||
if m.Cap("status") != "start" {
|
|
||||||
running := make(chan bool)
|
|
||||||
go m.AssertOne(m, true, func(m *Message) {
|
|
||||||
m.Log(m.Cap("status", "start"), nil, "%d server %v %v", m.root.Capi("nserver", 1), m.Meta["detail"], m.Meta["option"])
|
|
||||||
|
|
||||||
if running <- true; c.Server != nil && c.Server.Start(m, m.Meta["detail"]...) {
|
|
||||||
c.Close(m, m.Meta["detail"]...)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
<-running
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
// }}}
|
|
||||||
func (c *Context) Close(m *Message, arg ...string) bool { // {{{
|
|
||||||
m.Log("close", c, "%d:%d %v", len(m.source.Sessions), len(m.target.Historys), arg)
|
|
||||||
|
|
||||||
if m.target == c {
|
|
||||||
if m.Index == 0 {
|
|
||||||
for i := len(c.Requests) - 1; i >= 0; i-- {
|
|
||||||
v := c.Requests[i]
|
|
||||||
if v.Index = -1; v.source != c && !v.source.Close(v, arg...) {
|
|
||||||
v.Index = i
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
c.Requests = c.Requests[:i]
|
|
||||||
}
|
|
||||||
} else if m.Index > 0 {
|
|
||||||
for i := m.Index - 1; i < len(c.Requests)-1; i++ {
|
|
||||||
c.Requests[i] = c.Requests[i+1]
|
|
||||||
}
|
|
||||||
c.Requests = c.Requests[:len(c.Requests)-1]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if c.Server != nil && !c.Server.Close(m, arg...) {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
if m.source == c && m.target != c {
|
|
||||||
if _, ok := c.Sessions[m.Name]; ok {
|
|
||||||
delete(c.Sessions, m.Name)
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(c.Requests) > 1 {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
if m.Cap("status") == "start" {
|
|
||||||
m.Log(m.Cap("status", "close"), nil, "%d server %v", m.root.Capi("nserver", -1)+1, arg)
|
|
||||||
for _, v := range c.Sessions {
|
|
||||||
if v.target != c {
|
|
||||||
v.target.Close(v, arg...)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// if m.Index == 0 && c.context != nil && len(c.contexts) == 0 {
|
|
||||||
if c.context != nil {
|
|
||||||
m.Log("close", nil, "%d context %v", m.root.Capi("ncontext", -1)+1, arg)
|
|
||||||
delete(c.context.contexts, c.Name)
|
|
||||||
c.context = nil
|
|
||||||
if c.Exit != nil {
|
|
||||||
m.Log("info", nil, "before exit<-")
|
|
||||||
c.Exit <- true
|
|
||||||
m.Log("info", nil, "after exit<-")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
// }}}
|
// }}}
|
||||||
|
|
||||||
func (c *Context) Context() *Context { // {{{
|
func (c *Context) Context() *Context { // {{{
|
||||||
@ -674,7 +677,7 @@ func (m *Message) Assert(e interface{}, msg ...string) bool { // {{{
|
|||||||
}
|
}
|
||||||
|
|
||||||
// }}}
|
// }}}
|
||||||
func (m *Message) AssertOne(msg *Message, safe bool, hand ...func(msg *Message)) *Message { // {{{
|
func (m *Message) TryCatch(msg *Message, safe bool, hand ...func(msg *Message)) *Message { // {{{
|
||||||
defer func() {
|
defer func() {
|
||||||
if e := recover(); e != nil {
|
if e := recover(); e != nil {
|
||||||
|
|
||||||
@ -691,7 +694,7 @@ func (m *Message) AssertOne(msg *Message, safe bool, hand ...func(msg *Message))
|
|||||||
}
|
}
|
||||||
|
|
||||||
if len(hand) > 1 {
|
if len(hand) > 1 {
|
||||||
m.AssertOne(msg, safe, hand[1:]...)
|
m.TryCatch(msg, safe, hand[1:]...)
|
||||||
} else if !safe {
|
} else if !safe {
|
||||||
msg.Assert(e)
|
msg.Assert(e)
|
||||||
}
|
}
|
||||||
@ -1138,28 +1141,75 @@ func (m *Message) Copy(msg *Message, meta string, arg ...string) *Message { // {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// }}}
|
// }}}
|
||||||
func (m *Message) Table(cb func(map[string]string) bool) *Message { // {{{
|
func (m *Message) Table(cb func(map[string]string, []string, int) bool) *Message { // {{{
|
||||||
if len(m.Meta["append"]) > 0 {
|
if len(m.Meta["append"]) == 0 {
|
||||||
|
return m
|
||||||
|
}
|
||||||
|
|
||||||
|
width := make(map[string]int, len(m.Meta[m.Meta["append"][0]]))
|
||||||
|
for _, k := range m.Meta["append"] {
|
||||||
|
title := k
|
||||||
|
if m.Options("extras") && k == "extra" {
|
||||||
|
title = "extra." + m.Option("extras")
|
||||||
|
}
|
||||||
|
width[k] = len(title)
|
||||||
|
}
|
||||||
|
for i := 0; i < len(m.Meta[m.Meta["append"][0]]); i++ {
|
||||||
|
for _, k := range m.Meta["append"] {
|
||||||
|
data := m.Meta[k][i]
|
||||||
|
if len(data) > width[k] {
|
||||||
|
width[k] = len(data)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
row := map[string]string{}
|
||||||
|
wor := []string{}
|
||||||
|
for _, k := range m.Meta["append"] {
|
||||||
|
title := k
|
||||||
|
if m.Options("extras") && k == "extra" {
|
||||||
|
title = "extra." + m.Option("extras")
|
||||||
|
}
|
||||||
|
row[k] = title
|
||||||
|
title += strings.Repeat(" ", width[k]-len(title))
|
||||||
|
wor = append(wor, title)
|
||||||
|
}
|
||||||
|
if !cb(row, wor, -1) {
|
||||||
|
return m
|
||||||
|
}
|
||||||
|
|
||||||
for i := 0; i < len(m.Meta[m.Meta["append"][0]]); i++ {
|
for i := 0; i < len(m.Meta[m.Meta["append"][0]]); i++ {
|
||||||
row := map[string]string{}
|
row := map[string]string{}
|
||||||
|
wor := []string{}
|
||||||
for _, k := range m.Meta["append"] {
|
for _, k := range m.Meta["append"] {
|
||||||
|
data := m.Meta[k][i]
|
||||||
|
if m.Options("extras") && k == "extra" {
|
||||||
|
extra := map[string]interface{}{}
|
||||||
|
json.Unmarshal([]byte(data), &extra)
|
||||||
|
data = fmt.Sprintf("%v", extra[m.Option("extras")])
|
||||||
|
}
|
||||||
|
|
||||||
if i < len(m.Meta[k]) {
|
if i < len(m.Meta[k]) {
|
||||||
row[k] = m.Meta[k][i]
|
row[k] = data
|
||||||
|
data += strings.Repeat(" ", width[k]-len(data))
|
||||||
|
wor = append(wor, data)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if !cb(row) {
|
if !cb(row, wor, i) {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
return m
|
return m
|
||||||
}
|
}
|
||||||
|
|
||||||
// }}}
|
// }}}
|
||||||
func (m *Message) Sort(key string, arg ...string) {
|
func (m *Message) Sort(key string, arg ...string) { // {{{
|
||||||
table := []map[string]string{}
|
table := []map[string]string{}
|
||||||
m.Table(func(line map[string]string) bool {
|
m.Table(func(line map[string]string, lists []string, index int) bool {
|
||||||
|
if index != -1 {
|
||||||
table = append(table, line)
|
table = append(table, line)
|
||||||
|
}
|
||||||
return true
|
return true
|
||||||
})
|
})
|
||||||
|
|
||||||
@ -1215,6 +1265,8 @@ func (m *Message) Sort(key string, arg ...string) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// }}}
|
||||||
|
|
||||||
func (m *Message) Insert(meta string, index int, arg ...interface{}) string { // {{{
|
func (m *Message) Insert(meta string, index int, arg ...interface{}) string { // {{{
|
||||||
if m.Meta == nil {
|
if m.Meta == nil {
|
||||||
m.Meta = make(map[string][]string)
|
m.Meta = make(map[string][]string)
|
||||||
@ -1351,6 +1403,15 @@ func (m *Message) Optionv(key string, arg ...interface{}) interface{} { // {{{
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// }}}
|
||||||
|
func (m *Message) Optionx(key string, format string) interface{} { // {{{
|
||||||
|
value := m.Option(key)
|
||||||
|
if value != "" {
|
||||||
|
return fmt.Sprintf(format, value)
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
// }}}
|
// }}}
|
||||||
func (m *Message) Append(key string, arg ...interface{}) string { // {{{
|
func (m *Message) Append(key string, arg ...interface{}) string { // {{{
|
||||||
m.Insert(key, 0, arg...)
|
m.Insert(key, 0, arg...)
|
||||||
@ -1427,7 +1488,7 @@ func (m *Message) Exec(key string, arg ...string) string { // {{{
|
|||||||
for s := c; s != nil; s = s.context {
|
for s := c; s != nil; s = s.context {
|
||||||
|
|
||||||
if x, ok := s.Commands[key]; ok && x.Hand != nil && c.Check(m, "commands", key) {
|
if x, ok := s.Commands[key]; ok && x.Hand != nil && c.Check(m, "commands", key) {
|
||||||
m.AssertOne(m, true, func(m *Message) {
|
m.TryCatch(m, true, func(m *Message) {
|
||||||
m.Log("cmd", s, "%d %s %v %v", len(m.target.Historys), key, arg, m.Meta["option"])
|
m.Log("cmd", s, "%d %s %v %v", len(m.target.Historys), key, arg, m.Meta["option"])
|
||||||
|
|
||||||
if x.Options != nil {
|
if x.Options != nil {
|
||||||
@ -1441,9 +1502,9 @@ func (m *Message) Exec(key string, arg ...string) string { // {{{
|
|||||||
if m.Has("args") {
|
if m.Has("args") {
|
||||||
m.Meta["args"] = nil
|
m.Meta["args"] = nil
|
||||||
}
|
}
|
||||||
if x.Formats != nil {
|
if x.Form != nil {
|
||||||
for i := 0; i < len(arg); i++ {
|
for i := 0; i < len(arg); i++ {
|
||||||
n, ok := x.Formats[arg[i]]
|
n, ok := x.Form[arg[i]]
|
||||||
if !ok {
|
if !ok {
|
||||||
m.Add("option", "args", arg[i])
|
m.Add("option", "args", arg[i])
|
||||||
continue
|
continue
|
||||||
@ -1496,7 +1557,7 @@ func (m *Message) Deal(pre func(msg *Message, arg ...string) bool, post func(msg
|
|||||||
}
|
}
|
||||||
|
|
||||||
for run := true; run; {
|
for run := true; run; {
|
||||||
m.AssertOne(<-m.target.messages, true, func(msg *Message) {
|
m.TryCatch(<-m.target.messages, true, func(msg *Message) {
|
||||||
defer func() {
|
defer func() {
|
||||||
if msg.Wait != nil {
|
if msg.Wait != nil {
|
||||||
msg.Wait <- true
|
msg.Wait <- true
|
||||||
@ -1563,6 +1624,49 @@ func (m *Message) Cmd(arg ...interface{}) *Message { // {{{
|
|||||||
|
|
||||||
// }}}
|
// }}}
|
||||||
|
|
||||||
|
func (m *Message) Confx(key string, arg ...interface{}) string { // {{{
|
||||||
|
if len(arg) == 0 {
|
||||||
|
return m.Conf(key)
|
||||||
|
}
|
||||||
|
|
||||||
|
skip := false
|
||||||
|
if len(arg) > 1 {
|
||||||
|
if v, ok := arg[1].(bool); ok && !v {
|
||||||
|
skip = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(arg) > 0 {
|
||||||
|
switch v := arg[0].(type) {
|
||||||
|
case string:
|
||||||
|
if skip || v == "" {
|
||||||
|
return m.Conf(key)
|
||||||
|
}
|
||||||
|
return v
|
||||||
|
case []string:
|
||||||
|
which := 0
|
||||||
|
if len(arg) > 1 {
|
||||||
|
if x, ok := arg[1].(int); ok {
|
||||||
|
which = x
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if which < len(v) {
|
||||||
|
return v[which]
|
||||||
|
}
|
||||||
|
return m.Conf(key)
|
||||||
|
default:
|
||||||
|
x := fmt.Sprintf("%v", v)
|
||||||
|
if skip || v == nil || x == "" {
|
||||||
|
return m.Conf(key)
|
||||||
|
}
|
||||||
|
return x
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
// }}}
|
||||||
func (m *Message) Confs(key string, arg ...bool) bool { // {{{
|
func (m *Message) Confs(key string, arg ...bool) bool { // {{{
|
||||||
if len(arg) > 0 {
|
if len(arg) > 0 {
|
||||||
if arg[0] {
|
if arg[0] {
|
||||||
@ -1637,6 +1741,49 @@ func (m *Message) Conf(key string, arg ...string) string { // {{{
|
|||||||
return ""
|
return ""
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// }}}
|
||||||
|
func (m *Message) Capx(key string, arg ...interface{}) string { // {{{
|
||||||
|
if len(arg) == 0 {
|
||||||
|
return m.Cap(key)
|
||||||
|
}
|
||||||
|
|
||||||
|
skip := false
|
||||||
|
if len(arg) > 1 {
|
||||||
|
if v, ok := arg[1].(bool); ok && !v {
|
||||||
|
skip = true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(arg) > 0 {
|
||||||
|
switch v := arg[0].(type) {
|
||||||
|
case string:
|
||||||
|
if skip || v == "" {
|
||||||
|
return m.Cap(key)
|
||||||
|
}
|
||||||
|
return v
|
||||||
|
case []string:
|
||||||
|
which := 0
|
||||||
|
if len(arg) > 1 {
|
||||||
|
if x, ok := arg[1].(int); ok {
|
||||||
|
which = x
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if which < len(v) {
|
||||||
|
return v[which]
|
||||||
|
}
|
||||||
|
return m.Cap(key)
|
||||||
|
default:
|
||||||
|
x := fmt.Sprintf("%v", v)
|
||||||
|
if skip || v == nil || x == "" {
|
||||||
|
return m.Cap(key)
|
||||||
|
}
|
||||||
|
return x
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
// }}}
|
// }}}
|
||||||
func (m *Message) Caps(key string, arg ...bool) bool { // {{{
|
func (m *Message) Caps(key string, arg ...bool) bool { // {{{
|
||||||
if len(arg) > 0 {
|
if len(arg) > 0 {
|
||||||
@ -2282,8 +2429,10 @@ var Index = &Context{Name: "ctx", Help: "模块中心",
|
|||||||
}
|
}
|
||||||
// }}}
|
// }}}
|
||||||
}},
|
}},
|
||||||
"context": &Command{Name: "context back|[[home] [find|search] name] [info|lists|show|switch|[args]", Help: "查找并操作模块,\n查找起点root:根模块、back:父模块、home:本模块,\n查找方法find:路径匹配、search:模糊匹配,\n查找对象name:支持点分和正则,\n操作类型show:显示信息、switch:切换为当前、start:启动模块、spawn:分裂子模块,args:启动参数",
|
"context": &Command{
|
||||||
Formats: map[string]int{
|
Name: "context back|[[home] [find|search] name] [info|lists|show|switch|[args]",
|
||||||
|
Help: "查找并操作模块,\n查找起点root:根模块、back:父模块、home:本模块,\n查找方法find:路径匹配、search:模糊匹配,\n查找对象name:支持点分和正则,\n操作类型show:显示信息、switch:切换为当前、start:启动模块、spawn:分裂子模块,args:启动参数",
|
||||||
|
Form: map[string]int{
|
||||||
"back": 0, "home": 0,
|
"back": 0, "home": 0,
|
||||||
"find": 1, "search": 1,
|
"find": 1, "search": 1,
|
||||||
"info": 1, "lists": 0, "show": 0, "switch": 0,
|
"info": 1, "lists": 0, "show": 0, "switch": 0,
|
||||||
@ -2456,7 +2605,10 @@ var Index = &Context{Name: "ctx", Help: "模块中心",
|
|||||||
}
|
}
|
||||||
// }}}
|
// }}}
|
||||||
}},
|
}},
|
||||||
"server": &Command{Name: "server [spawn|begin|start|close|][args]", Help: "服务启动停止切换", Hand: func(m *Message, c *Context, key string, arg ...string) {
|
"server": &Command{
|
||||||
|
Name: "server [spawn|begin|start|close|][args]",
|
||||||
|
Help: "服务启动停止切换",
|
||||||
|
Hand: func(m *Message, c *Context, key string, arg ...string) {
|
||||||
switch len(arg) { // {{{
|
switch len(arg) { // {{{
|
||||||
case 0:
|
case 0:
|
||||||
m.Travel(m.target.root, func(msg *Message) bool {
|
m.Travel(m.target.root, func(msg *Message) bool {
|
||||||
@ -2491,8 +2643,9 @@ var Index = &Context{Name: "ctx", Help: "模块中心",
|
|||||||
}
|
}
|
||||||
// }}}
|
// }}}
|
||||||
}},
|
}},
|
||||||
"command": &Command{Name: "command [all] add [key [name help]]", Help: "查看或修改命令",
|
"command": &Command{
|
||||||
Formats: map[string]int{"all": 0, "delete": 0, "void": 0, "condition": -1},
|
Name: "command [all] add [key [name help]]", Help: "查看或修改命令",
|
||||||
|
Form: map[string]int{"all": 0, "delete": 0, "void": 0, "condition": -1},
|
||||||
Hand: func(m *Message, c *Context, key string, arg ...string) {
|
Hand: func(m *Message, c *Context, key string, arg ...string) {
|
||||||
all := m.Has("all") // {{{
|
all := m.Has("all") // {{{
|
||||||
if len(arg) == 0 {
|
if len(arg) == 0 {
|
||||||
@ -2681,8 +2834,10 @@ var Index = &Context{Name: "ctx", Help: "模块中心",
|
|||||||
}
|
}
|
||||||
// }}}
|
// }}}
|
||||||
}},
|
}},
|
||||||
"config": &Command{Name: "config [all] [[delete|void] key [value]|[name value help]]", Help: "删除、置空、查看、修改或添加配置",
|
"config": &Command{
|
||||||
Formats: map[string]int{"all": 0, "delete": 0, "void": 0},
|
Name: "config [all] [[delete|void] key [value]|[name value help]]",
|
||||||
|
Help: "删除、置空、查看、修改或添加配置",
|
||||||
|
Form: map[string]int{"all": 0, "delete": 0, "void": 0},
|
||||||
Hand: func(m *Message, c *Context, key string, arg ...string) {
|
Hand: func(m *Message, c *Context, key string, arg ...string) {
|
||||||
all := m.Has("all") // {{{
|
all := m.Has("all") // {{{
|
||||||
|
|
||||||
@ -2741,8 +2896,10 @@ var Index = &Context{Name: "ctx", Help: "模块中心",
|
|||||||
}
|
}
|
||||||
// }}}
|
// }}}
|
||||||
}},
|
}},
|
||||||
"cache": &Command{Name: "cache [all] [[delete|void] key [value]|[name value help]]", Help: "删除、置空、查看、修改或添加缓存",
|
"cache": &Command{
|
||||||
Formats: map[string]int{"all": 0, "delete": 0, "void": 0},
|
Name: "cache [all] [[delete|void] key [value]|[name value help]]",
|
||||||
|
Help: "删除、置空、查看、修改或添加缓存",
|
||||||
|
Form: map[string]int{"all": 0, "delete": 0, "void": 0},
|
||||||
Hand: func(m *Message, c *Context, key string, arg ...string) {
|
Hand: func(m *Message, c *Context, key string, arg ...string) {
|
||||||
all := m.Has("all") // {{{
|
all := m.Has("all") // {{{
|
||||||
|
|
||||||
@ -2797,7 +2954,7 @@ var Index = &Context{Name: "ctx", Help: "模块中心",
|
|||||||
"right": &Command{
|
"right": &Command{
|
||||||
Name: "right [share|add|del group [cache|config|command item]]",
|
Name: "right [share|add|del group [cache|config|command item]]",
|
||||||
Help: "用户组管理,查看、添加、删除用户组或是接口",
|
Help: "用户组管理,查看、添加、删除用户组或是接口",
|
||||||
Formats: map[string]int{"check": 0, "add": 0, "del": 0, "brow": 0, "cache": 0, "config": 0, "command": 0},
|
Form: map[string]int{"check": 0, "add": 0, "del": 0, "brow": 0, "cache": 0, "config": 0, "command": 0},
|
||||||
Hand: func(m *Message, c *Context, key string, arg ...string) {
|
Hand: func(m *Message, c *Context, key string, arg ...string) {
|
||||||
index := m.Target().Index // {{{
|
index := m.Target().Index // {{{
|
||||||
if index == nil {
|
if index == nil {
|
||||||
@ -3031,13 +3188,6 @@ var Index = &Context{Name: "ctx", Help: "模块中心",
|
|||||||
}
|
}
|
||||||
} // }}}
|
} // }}}
|
||||||
}},
|
}},
|
||||||
"sort": &Command{Name: "sort", Help: "服务启动停止切换", Hand: func(m *Message, c *Context, key string, arg ...string) {
|
|
||||||
m.Append("name", "shy", "yun")
|
|
||||||
m.Append("page", "10", "20")
|
|
||||||
m.Log("fuck", nil, "before %v", m.Meta)
|
|
||||||
m.Sort(arg[0], arg[1:]...)
|
|
||||||
m.Log("fuck", nil, "after %v", m.Meta)
|
|
||||||
}},
|
|
||||||
},
|
},
|
||||||
Index: map[string]*Context{
|
Index: map[string]*Context{
|
||||||
"void": &Context{Name: "void",
|
"void": &Context{Name: "void",
|
||||||
|
@ -2,14 +2,14 @@ package mdb // {{{
|
|||||||
// }}}
|
// }}}
|
||||||
import ( // {{{
|
import ( // {{{
|
||||||
"contexts"
|
"contexts"
|
||||||
"encoding/json"
|
|
||||||
"strconv"
|
|
||||||
"strings"
|
|
||||||
|
|
||||||
"database/sql"
|
"database/sql"
|
||||||
|
"encoding/json"
|
||||||
_ "github.com/go-sql-driver/mysql"
|
_ "github.com/go-sql-driver/mysql"
|
||||||
|
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"os"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
// }}}
|
// }}}
|
||||||
@ -17,9 +17,6 @@ import ( // {{{
|
|||||||
type MDB struct {
|
type MDB struct {
|
||||||
*sql.DB
|
*sql.DB
|
||||||
|
|
||||||
list map[string][]string
|
|
||||||
list_key []string
|
|
||||||
|
|
||||||
table []string
|
table []string
|
||||||
*ctx.Context
|
*ctx.Context
|
||||||
}
|
}
|
||||||
@ -73,7 +70,7 @@ func (mdb *MDB) Close(m *ctx.Message, arg ...string) bool { // {{{
|
|||||||
switch mdb.Context {
|
switch mdb.Context {
|
||||||
case m.Target():
|
case m.Target():
|
||||||
if mdb.DB != nil {
|
if mdb.DB != nil {
|
||||||
m.Log("info", nil, "%d close %s %s", Pulse.Capi("nsource", -1)+1, m.Cap("driver"), m.Cap("source"))
|
m.Log("info", nil, "close")
|
||||||
mdb.DB.Close()
|
mdb.DB.Close()
|
||||||
mdb.DB = nil
|
mdb.DB = nil
|
||||||
}
|
}
|
||||||
@ -87,32 +84,26 @@ func (mdb *MDB) Close(m *ctx.Message, arg ...string) bool { // {{{
|
|||||||
var Pulse *ctx.Message
|
var Pulse *ctx.Message
|
||||||
var Index = &ctx.Context{Name: "mdb", Help: "数据中心",
|
var Index = &ctx.Context{Name: "mdb", Help: "数据中心",
|
||||||
Caches: map[string]*ctx.Cache{
|
Caches: map[string]*ctx.Cache{
|
||||||
"count": &ctx.Cache{Name: "count", Value: "0", Help: "主机协议"},
|
|
||||||
"nsource": &ctx.Cache{Name: "数据源数量", Value: "0", Help: "已打开数据库的数量"},
|
"nsource": &ctx.Cache{Name: "数据源数量", Value: "0", Help: "已打开数据库的数量"},
|
||||||
|
"dbname": &ctx.Cache{Name: "生成模块名", Value: "", Help: "生成模块名", Hand: func(m *ctx.Message, x *ctx.Cache, arg ...string) string {
|
||||||
|
return fmt.Sprintf("db%d", Pulse.Capi("nsource", 1))
|
||||||
|
}},
|
||||||
},
|
},
|
||||||
Configs: map[string]*ctx.Config{
|
Configs: map[string]*ctx.Config{
|
||||||
"driver": &ctx.Config{Name: "数据库驱动(mysql)", Value: "mysql", Help: "数据库驱动"},
|
"driver": &ctx.Config{Name: "数据库驱动(mysql)", Value: "mysql", Help: "数据库驱动"},
|
||||||
|
"csv_sep": &ctx.Config{Name: "字段分隔符", Value: "\t", Help: "字段分隔符"},
|
||||||
},
|
},
|
||||||
Commands: map[string]*ctx.Command{
|
Commands: map[string]*ctx.Command{
|
||||||
"open": &ctx.Command{Name: "open source [name]", Help: "打开数据库", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) {
|
"open": &ctx.Command{Name: "open source [name]", Help: "打开数据库, source: 数据源, name: 模块名", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) {
|
||||||
m.Assert(len(arg) > 0, "缺少参数") // {{{
|
m.Assert(len(arg) > 0, "缺少参数") // {{{
|
||||||
name := fmt.Sprintf("db%d", Pulse.Capi("nsource", 1))
|
m.Start(m.Capx("dbname", arg, 1), "数据存储", arg...)
|
||||||
if len(arg) > 1 {
|
|
||||||
name = arg[1]
|
|
||||||
}
|
|
||||||
m.Start(name, "数据存储", arg...)
|
|
||||||
Pulse.Cap("stream", Pulse.Cap("nsource"))
|
|
||||||
m.Echo(m.Target().Name)
|
m.Echo(m.Target().Name)
|
||||||
// }}}
|
// }}}
|
||||||
}},
|
}},
|
||||||
"exec": &ctx.Command{Name: "exec sql [arg]", Help: "操作数据库",
|
"exec": &ctx.Command{Name: "exec sql [arg]", Help: "操作数据库, sql: SQL语句, arg: 查询参数",
|
||||||
Appends: map[string]string{"last": "最后插入元组的标识", "nrow": "修改元组的数量"},
|
Appends: map[string]string{"last": "最后插入元组的标识", "nrow": "修改元组的数量"},
|
||||||
Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) {
|
Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) {
|
||||||
mdb, ok := m.Target().Server.(*MDB) // {{{
|
if mdb, ok := m.Target().Server.(*MDB); m.Assert(ok) { // {{{
|
||||||
m.Assert(ok, "目标模块类型错误")
|
|
||||||
m.Assert(len(arg) > 0, "缺少参数")
|
|
||||||
m.Assert(mdb.DB != nil, "数据库未打开")
|
|
||||||
|
|
||||||
which := make([]interface{}, 0, len(arg))
|
which := make([]interface{}, 0, len(arg))
|
||||||
for _, v := range arg[1:] {
|
for _, v := range arg[1:] {
|
||||||
which = append(which, v)
|
which = append(which, v)
|
||||||
@ -125,18 +116,13 @@ var Index = &ctx.Context{Name: "mdb", Help: "数据中心",
|
|||||||
n, e := ret.RowsAffected()
|
n, e := ret.RowsAffected()
|
||||||
m.Assert(e)
|
m.Assert(e)
|
||||||
|
|
||||||
|
m.Log("info", nil, "last(%s) nrow(%s)", m.Append("last", id), m.Append("nrow", n))
|
||||||
m.Echo("%d", id).Echo("%d", n)
|
m.Echo("%d", id).Echo("%d", n)
|
||||||
m.Add("append", "last", fmt.Sprintf("%d", id))
|
}
|
||||||
m.Add("append", "nrow", fmt.Sprintf("%d", n))
|
|
||||||
m.Log("info", nil, "last(%d) nrow(%d)", id, n)
|
|
||||||
// }}}
|
// }}}
|
||||||
}},
|
}},
|
||||||
"query": &ctx.Command{Name: "query sql [arg]", Help: "执行查询语句", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) {
|
"query": &ctx.Command{Name: "query sql [arg]", Help: "查询数据库, sql: SQL语句, arg: 查询参数", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) {
|
||||||
mdb, ok := m.Target().Server.(*MDB) // {{{
|
if mdb, ok := m.Target().Server.(*MDB); m.Assert(ok) { // {{{
|
||||||
m.Assert(ok, "目标模块类型错误")
|
|
||||||
m.Assert(len(arg) > 0, "缺少参数")
|
|
||||||
m.Assert(mdb.DB != nil, "数据库未打开")
|
|
||||||
|
|
||||||
which := make([]interface{}, 0, len(arg))
|
which := make([]interface{}, 0, len(arg))
|
||||||
for _, v := range arg[1:] {
|
for _, v := range arg[1:] {
|
||||||
which = append(which, v)
|
which = append(which, v)
|
||||||
@ -165,7 +151,7 @@ var Index = &ctx.Context{Name: "mdb", Help: "数据中心",
|
|||||||
case int64:
|
case int64:
|
||||||
m.Add("append", k, fmt.Sprintf("%d", b))
|
m.Add("append", k, fmt.Sprintf("%d", b))
|
||||||
default:
|
default:
|
||||||
m.Add("append", k, "")
|
m.Add("append", k, fmt.Sprintf("%v", b))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -175,21 +161,36 @@ var Index = &ctx.Context{Name: "mdb", Help: "数据中心",
|
|||||||
} else {
|
} else {
|
||||||
m.Log("info", nil, "rows(0) cols(0)")
|
m.Log("info", nil, "rows(0) cols(0)")
|
||||||
}
|
}
|
||||||
|
}
|
||||||
// }}}
|
// }}}
|
||||||
}},
|
}},
|
||||||
"table": &ctx.Command{Name: "table", Help: "执行查询语句", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) {
|
"table": &ctx.Command{Name: "table [which [field]]", Help: "查看关系表信息,which: 表名, field: 字段名", Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) {
|
||||||
mdb, ok := m.Target().Server.(*MDB) // {{{
|
if mdb, ok := m.Target().Server.(*MDB); m.Assert(ok) { // {{{
|
||||||
m.Assert(ok)
|
msg := m.Spawn()
|
||||||
msg := m.Spawn(m.Target())
|
if len(arg) == 0 {
|
||||||
if len(arg) > 0 {
|
msg.Cmd("query", "show tables")
|
||||||
|
mdb.table = []string{}
|
||||||
|
for i, v := range msg.Meta[msg.Meta["append"][0]] {
|
||||||
|
mdb.table = append(mdb.table, v)
|
||||||
|
m.Echo("%d: %s\n", i, v)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
table := arg[0]
|
table := arg[0]
|
||||||
index, e := strconv.Atoi(arg[0])
|
index, e := strconv.Atoi(arg[0])
|
||||||
if e == nil && index < len(mdb.table) {
|
if e == nil && index < len(mdb.table) {
|
||||||
table = mdb.table[index]
|
table = mdb.table[index]
|
||||||
}
|
}
|
||||||
msg.Cmd("query", fmt.Sprintf("desc %s", table))
|
|
||||||
|
|
||||||
if len(arg) > 1 {
|
msg.Cmd("query", fmt.Sprintf("desc %s", table))
|
||||||
|
if len(arg) == 1 {
|
||||||
|
for _, v := range msg.Meta[msg.Meta["append"][0]] {
|
||||||
|
m.Echo("%s\n", v)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
for i, v := range msg.Meta[msg.Meta["append"][0]] {
|
for i, v := range msg.Meta[msg.Meta["append"][0]] {
|
||||||
if v == arg[1] {
|
if v == arg[1] {
|
||||||
for _, k := range msg.Meta["append"] {
|
for _, k := range msg.Meta["append"] {
|
||||||
@ -197,154 +198,86 @@ var Index = &ctx.Context{Name: "mdb", Help: "数据中心",
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
// }}}
|
||||||
|
}},
|
||||||
|
"show": &ctx.Command{
|
||||||
|
Name: "show table fields... [where conditions]|[group fields]|[order fields]|[save filename]",
|
||||||
|
Help: "查询数据库, table: 表名, fields: 字段, where: 查询条件, group: 聚合字段, order: 排序字段",
|
||||||
|
Form: map[string]int{"where": 1, "group": 1, "order": 1, "extras": 1, "save": 1},
|
||||||
|
Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) {
|
||||||
|
if m.Options("extras") { // {{{
|
||||||
|
arg = append(arg, "extra")
|
||||||
|
}
|
||||||
|
fields := strings.Join(arg[1:], ",")
|
||||||
|
|
||||||
|
where := m.Optionx("where", "where %s")
|
||||||
|
group := m.Optionx("group", "group by %s")
|
||||||
|
order := m.Optionx("order", "order by %s")
|
||||||
|
|
||||||
|
msg := m.Spawn().Cmd("query", fmt.Sprintf("select %s from %s %s %s %s", fields, arg[0], where, group, order))
|
||||||
|
if !m.Options("save") {
|
||||||
|
m.Echo("\033[31m%s\033[0m %s %s %s\n", arg[0], where, group, order)
|
||||||
|
}
|
||||||
|
msg.Table(func(maps map[string]string, lists []string, index int) bool {
|
||||||
|
for i, v := range lists {
|
||||||
|
if m.Options("save") {
|
||||||
|
m.Echo(maps[msg.Meta["append"][i]]).Echo(m.Conf("csv_sep"))
|
||||||
|
} else if index == -1 {
|
||||||
|
m.Echo("\033[32m%s\033[0m", v).Echo(m.Conf("csv_sep"))
|
||||||
} else {
|
} else {
|
||||||
for _, v := range msg.Meta[msg.Meta["append"][0]] {
|
m.Echo(v).Echo(m.Conf("csv_sep"))
|
||||||
m.Echo("%s\n", v)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
m.Echo("\n")
|
||||||
msg.Cmd("query", "show tables")
|
return true
|
||||||
mdb.table = []string{}
|
})
|
||||||
for i, v := range msg.Meta[msg.Meta["append"][0]] {
|
|
||||||
mdb.table = append(mdb.table, v)
|
if m.Options("save") {
|
||||||
m.Echo("%d: %s\n", i, v)
|
f, e := os.Create(m.Option("save"))
|
||||||
|
m.Assert(e)
|
||||||
|
defer f.Close()
|
||||||
|
|
||||||
|
for _, v := range m.Meta["result"] {
|
||||||
|
f.WriteString(v)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// }}}
|
// }}}
|
||||||
}},
|
}},
|
||||||
"get": &ctx.Command{Name: "get [where str] [parse str] [table [field]]", Help: "执行查询语句",
|
"get": &ctx.Command{Name: "get [where str] [parse str] [table [field]]", Help: "执行查询语句",
|
||||||
Formats: map[string]int{"where": 1, "parse": 1},
|
Form: map[string]int{"where": 1, "parse": 2},
|
||||||
Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) {
|
Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) {
|
||||||
where := m.Conf("where") // {{{
|
where := m.Confx("where", m.Option("where")) // {{{
|
||||||
if m.Options("where") {
|
if where != "" {
|
||||||
where = m.Option("where")
|
where = "where " + where
|
||||||
}
|
}
|
||||||
|
|
||||||
parse := m.Conf("parse")
|
parse := m.Confx("parse", m.Option("parse"))
|
||||||
if m.Options("parse") {
|
extra := m.Confx("extra", m.Meta["parse"], 1)
|
||||||
parse = m.Option("parse")
|
table := m.Confx("table", arg, 0)
|
||||||
}
|
field := m.Confx("field", arg, 1)
|
||||||
|
|
||||||
table := m.Conf("table")
|
msg := m.Spawn().Cmd("query", fmt.Sprintf("select %s from %s %s", field, table, where))
|
||||||
if len(arg) > 0 {
|
msg.Table(func(row map[string]string, lists []string, index int) bool {
|
||||||
table = arg[0]
|
if index == -1 {
|
||||||
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
field := m.Conf("field")
|
|
||||||
if len(arg) > 1 {
|
|
||||||
field = arg[1]
|
|
||||||
}
|
|
||||||
|
|
||||||
rest := []string{}
|
|
||||||
if len(arg) > 2 {
|
|
||||||
rest = arg[2:]
|
|
||||||
}
|
|
||||||
|
|
||||||
msg := m.Spawn(m.Target())
|
|
||||||
msg.Cmd("query", fmt.Sprintf("select %s from %s where %s", field, table, where), rest)
|
|
||||||
m.Copy(msg, "result").Copy(msg, "append")
|
|
||||||
m.Table(func(row map[string]string) bool {
|
|
||||||
data := map[string]interface{}{}
|
data := map[string]interface{}{}
|
||||||
switch parse {
|
switch parse {
|
||||||
case "json":
|
case "json":
|
||||||
json.Unmarshal([]byte(row[field]), data)
|
if json.Unmarshal([]byte(row[field]), &data); extra == "" {
|
||||||
m.Echo("%v", data)
|
for k, v := range data {
|
||||||
|
m.Echo("%s: %v\n", k, v)
|
||||||
|
}
|
||||||
|
} else if v, ok := data[extra]; ok {
|
||||||
|
m.Echo("%v", v)
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
m.Echo("%v", row[field])
|
m.Echo("%v", row[field])
|
||||||
}
|
}
|
||||||
return false
|
return false
|
||||||
}) // }}}
|
}) // }}}
|
||||||
}},
|
}},
|
||||||
"show": &ctx.Command{Name: "show table field [where conditions]|[group fields]|[order fields]", Help: "执行查询语句",
|
|
||||||
Formats: map[string]int{"where": 1, "group": 1, "order": 1},
|
|
||||||
Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) {
|
|
||||||
msg := m.Spawn(m.Target()) // {{{
|
|
||||||
|
|
||||||
fields := strings.Join(arg[1:], ",")
|
|
||||||
condition := ""
|
|
||||||
if m.Options("where") {
|
|
||||||
condition = fmt.Sprintf("where %s", m.Option("where"))
|
|
||||||
}
|
|
||||||
group := ""
|
|
||||||
if m.Options("group") {
|
|
||||||
group = fmt.Sprintf("group by %s", m.Option("group"))
|
|
||||||
}
|
|
||||||
order := ""
|
|
||||||
if m.Options("order") {
|
|
||||||
order = fmt.Sprintf("order by %s", m.Option("order"))
|
|
||||||
}
|
|
||||||
|
|
||||||
msg.Cmd("query", fmt.Sprintf("select %s from %s %s %s %s", fields, arg[0], condition, group, order))
|
|
||||||
m.Echo("\033[31m%s\033[0m %s %s %s\n", arg[0], condition, group, order)
|
|
||||||
for _, k := range msg.Meta["append"] {
|
|
||||||
m.Echo("\033[32m%s\033[0m\t", k)
|
|
||||||
}
|
|
||||||
m.Echo("\n")
|
|
||||||
for i := 0; i < len(msg.Meta[msg.Meta["append"][0]]); i++ {
|
|
||||||
for _, k := range msg.Meta["append"] {
|
|
||||||
m.Echo("%s\t", msg.Meta[k][i])
|
|
||||||
}
|
|
||||||
m.Echo("\n")
|
|
||||||
}
|
|
||||||
// }}}
|
|
||||||
}},
|
|
||||||
"list": &ctx.Command{Name: "list add table field [where condition]", Help: "执行查询语句",
|
|
||||||
Formats: map[string]int{"where": 1},
|
|
||||||
Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) {
|
|
||||||
mdb, ok := m.Target().Server.(*MDB) // {{{
|
|
||||||
m.Assert(ok)
|
|
||||||
if len(arg) == 0 {
|
|
||||||
for _, k := range mdb.list_key {
|
|
||||||
m.Echo("%s: %v\n", k, mdb.list[k])
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
switch arg[0] {
|
|
||||||
case "add":
|
|
||||||
if mdb.list == nil {
|
|
||||||
mdb.list = make(map[string][]string)
|
|
||||||
}
|
|
||||||
mdb.list[m.Cap("count")] = append(mdb.list[m.Cap("count")], m.Option("where"))
|
|
||||||
mdb.list[m.Cap("count")] = append(mdb.list[m.Cap("count")], arg[1:]...)
|
|
||||||
mdb.list_key = append(mdb.list_key, m.Cap("count"))
|
|
||||||
m.Capi("count", 1)
|
|
||||||
case "set":
|
|
||||||
mdb.list[arg[1]] = []string{m.Option("where")}
|
|
||||||
mdb.list[arg[1]] = append(mdb.list[arg[1]], arg[2:]...)
|
|
||||||
default:
|
|
||||||
if table, ok := mdb.list[arg[0]]; ok {
|
|
||||||
msg := m.Spawn(m.Target())
|
|
||||||
|
|
||||||
fields := strings.Join(table[2:], ",")
|
|
||||||
condition := ""
|
|
||||||
if len(arg) > 1 && len(arg[1]) > 0 {
|
|
||||||
condition = fmt.Sprintf("where %s", arg[1])
|
|
||||||
} else if len(table[0]) > 0 {
|
|
||||||
condition = fmt.Sprintf("where %s", table[0])
|
|
||||||
}
|
|
||||||
|
|
||||||
other := ""
|
|
||||||
if len(arg) > 2 {
|
|
||||||
other = strings.Join(arg[2:], " ")
|
|
||||||
}
|
|
||||||
|
|
||||||
msg.Cmd("query", fmt.Sprintf("select %s from %s %s %s", fields, table[1], condition, other))
|
|
||||||
m.Echo("%s %s\n", table[1], condition)
|
|
||||||
for _, k := range msg.Meta["append"] {
|
|
||||||
m.Echo("%s\t", k)
|
|
||||||
}
|
|
||||||
m.Echo("\n")
|
|
||||||
for i := 0; i < len(msg.Meta[msg.Meta["append"][0]]); i++ {
|
|
||||||
for _, k := range msg.Meta["append"] {
|
|
||||||
m.Echo("%s\t", msg.Meta[k][i])
|
|
||||||
}
|
|
||||||
m.Echo("\n")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// }}}
|
|
||||||
}},
|
|
||||||
},
|
},
|
||||||
Index: map[string]*ctx.Context{
|
Index: map[string]*ctx.Context{
|
||||||
"void": &ctx.Context{Name: "void",
|
"void": &ctx.Context{Name: "void",
|
||||||
|
@ -140,7 +140,7 @@ var Index = &ctx.Context{Name: "ssh", Help: "集群中心",
|
|||||||
// }}}
|
// }}}
|
||||||
}},
|
}},
|
||||||
"send": &ctx.Command{Name: "send [domain str] cmd arg...", Help: "远程执行",
|
"send": &ctx.Command{Name: "send [domain str] cmd arg...", Help: "远程执行",
|
||||||
Formats: map[string]int{"domain": 1},
|
Form: map[string]int{"domain": 1},
|
||||||
Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) {
|
Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) {
|
||||||
if ssh, ok := m.Target().Server.(*SSH); m.Assert(ok) { // {{{
|
if ssh, ok := m.Target().Server.(*SSH); m.Assert(ok) { // {{{
|
||||||
|
|
||||||
|
@ -396,7 +396,7 @@ var Index = &ctx.Context{Name: "web", Help: "应用中心",
|
|||||||
// }}}
|
// }}}
|
||||||
}},
|
}},
|
||||||
"get": &ctx.Command{Name: "get [method GET|POST] [file filename] url arg...", Help: "访问URL",
|
"get": &ctx.Command{Name: "get [method GET|POST] [file filename] url arg...", Help: "访问URL",
|
||||||
Formats: map[string]int{"method": 1, "file": 2},
|
Form: map[string]int{"method": 1, "file": 2},
|
||||||
Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) {
|
Hand: func(m *ctx.Message, c *ctx.Context, key string, arg ...string) {
|
||||||
web, ok := m.Target().Server.(*WEB) // {{{
|
web, ok := m.Target().Server.(*WEB) // {{{
|
||||||
m.Assert(ok)
|
m.Assert(ok)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user