mirror of https://github.com/tidwall/tile38.git
Code cleanup
- Removed unused functions and variables - Wrapped client formatted errors - Updated deprecated packages - Changed suggested code patterns
This commit is contained in:
parent
e1d9756c6d
commit
6b08f7fa9e
2
go.mod
2
go.mod
|
@ -27,8 +27,8 @@ require (
|
|||
github.com/tidwall/rtree v1.2.7
|
||||
github.com/tidwall/sjson v1.1.6
|
||||
github.com/yuin/gopher-lua v0.0.0-20200816102855-ee81675732da
|
||||
golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad
|
||||
golang.org/x/net v0.0.0-20210119194325-5f4716e94777
|
||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1
|
||||
google.golang.org/grpc v1.35.0
|
||||
layeh.com/gopher-json v0.0.0-20201124131017-552bb3c4c3bf
|
||||
)
|
||||
|
|
8
go.sum
8
go.sum
|
@ -116,8 +116,6 @@ github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd
|
|||
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||
github.com/tidwall/btree v0.4.2 h1:aLwwJlG+InuFzdAPuBf9YCAR1LvSQ9zhC5aorFPlIPs=
|
||||
github.com/tidwall/btree v0.4.2/go.mod h1:huei1BkDWJ3/sLXmO+bsCNELL+Bp2Kks9OLyQFkzvA8=
|
||||
github.com/tidwall/buntdb v1.2.1 h1:+s5TqjuAfo6IdMa8boDkCx5PzT2mlP5AwgNN4yxJba8=
|
||||
github.com/tidwall/buntdb v1.2.1/go.mod h1:4FUodsOaaFBuhPvQyTafaxVM5GFdQZnz98W3BaNmve4=
|
||||
github.com/tidwall/buntdb v1.2.2 h1:46G3ulKw8NYo0JAvsZkf7Xq1c8OHOPRuHQVTfL6z+lE=
|
||||
github.com/tidwall/buntdb v1.2.2/go.mod h1:+i/gBwYOHWG19wLgwMXFLkl00twh9+VWkkaOhuNQ4PA=
|
||||
github.com/tidwall/cities v0.1.0 h1:CVNkmMf7NEC9Bvokf5GoSsArHCKRMTgLuubRTHnH0mE=
|
||||
|
@ -130,7 +128,6 @@ github.com/tidwall/gjson v1.7.4 h1:19cchw8FOxkG5mdLRkGf9jqIqEyqdZhPqW60XfyFxk8=
|
|||
github.com/tidwall/gjson v1.7.4/go.mod h1:5/xDoumyyDNerp2U36lyolv46b3uF/9Bu6OfyQ9GImk=
|
||||
github.com/tidwall/grect v0.1.1 h1:+kMEkxhoqB7rniVXzMEIA66XwU07STgINqxh+qVIndY=
|
||||
github.com/tidwall/grect v0.1.1/go.mod h1:CzvbGiFbWUwiJ1JohXLb28McpyBsI00TK9Y6pDWLGRQ=
|
||||
github.com/tidwall/lotsa v1.0.1 h1:w4gpDvI7RdkgbMC0q5ndKqG2ffrwCgerUY/gM2TYkH4=
|
||||
github.com/tidwall/lotsa v1.0.1/go.mod h1:X6NiU+4yHA3fE3Puvpnn1XMDrFZrE9JO2/w+UMuqgR8=
|
||||
github.com/tidwall/lotsa v1.0.2 h1:dNVBH5MErdaQ/xd9s769R31/n2dXavsQ0Yf4TMEHHw8=
|
||||
github.com/tidwall/lotsa v1.0.2/go.mod h1:X6NiU+4yHA3fE3Puvpnn1XMDrFZrE9JO2/w+UMuqgR8=
|
||||
|
@ -162,9 +159,8 @@ golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACk
|
|||
golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||
golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||
golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a h1:vclmkQCjlDX5OydZ9wv8rBCcS0QyQY66Mpf/7BZbInM=
|
||||
golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||
golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad h1:DN0cp81fZ3njFcrLCytUHRSUkqBjfTo4Tx9RJTWs0EY=
|
||||
golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
|
||||
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
||||
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
|
||||
|
@ -188,12 +184,10 @@ golang.org/x/sys v0.0.0-20190204203706-41f3e6584952/go.mod h1:STP8DvDyc/dI5b8T5h
|
|||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68 h1:nxC68pudNYkKU6jWhgrqdreuFiOQWj1Fs7T3VrH4Pjw=
|
||||
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw=
|
||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1 h1:v+OssWQX+hTHEmOBgwxdZxK4zHq3yOs8F9J7mk0PY8E=
|
||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
|
|
|
@ -79,9 +79,9 @@ func clipRing(ring []geometry.Point, bbox geometry.Rect) (
|
|||
// Entering
|
||||
resRing = append(resRing, intersect(bbox, edge, prev, p))
|
||||
resRing = append(resRing, p)
|
||||
} else {
|
||||
// Staying outside
|
||||
}
|
||||
} /* else {
|
||||
// Stay outside
|
||||
} */
|
||||
prev, prevInside = p, inside
|
||||
}
|
||||
if len(resRing) > 0 && resRing[0] != resRing[len(resRing)-1] {
|
||||
|
@ -137,8 +137,9 @@ func intersect(bbox geometry.Rect, code uint8, start, end geometry.Point) (
|
|||
X: bbox.Min.X,
|
||||
Y: start.Y + (end.Y-start.Y)*(bbox.Min.X-start.X)/(end.X-start.X),
|
||||
}
|
||||
} else { // should not call intersect with the zero code
|
||||
}
|
||||
} /* else {
|
||||
// should not call intersect with the zero code
|
||||
} */
|
||||
|
||||
return
|
||||
}
|
||||
|
|
|
@ -47,7 +47,7 @@ func TestClipPolygonSimple(t *testing.T) {
|
|||
{X: 2, Y: 2},
|
||||
}
|
||||
holes := [][]geometry.Point{
|
||||
[]geometry.Point{
|
||||
{
|
||||
{X: 1.9, Y: 1.9},
|
||||
{X: 1.2, Y: 1.9},
|
||||
{X: 1.45, Y: 1.65},
|
||||
|
@ -79,7 +79,7 @@ func TestClipPolygon2(t *testing.T) {
|
|||
{X: 2, Y: 2},
|
||||
}
|
||||
holes := [][]geometry.Point{
|
||||
[]geometry.Point{
|
||||
{
|
||||
{X: 1.9, Y: 1.9},
|
||||
{X: 1.2, Y: 1.9},
|
||||
{X: 1.45, Y: 1.65},
|
||||
|
|
|
@ -58,8 +58,6 @@ type Collection struct {
|
|||
nobjects int // non-geometry count
|
||||
}
|
||||
|
||||
var counter uint64
|
||||
|
||||
// New creates an empty collection
|
||||
func New() *Collection {
|
||||
col := &Collection{
|
||||
|
|
|
@ -44,8 +44,7 @@ func TestCollectionNewCollection(t *testing.T) {
|
|||
c := New()
|
||||
for i := 0; i < numItems; i++ {
|
||||
id := strconv.FormatInt(int64(i), 10)
|
||||
var obj geojson.Object
|
||||
obj = PO(rand.Float64()*360-180, rand.Float64()*180-90)
|
||||
obj := PO(rand.Float64()*360-180, rand.Float64()*180-90)
|
||||
objs[id] = obj
|
||||
c.Set(id, obj, nil, nil)
|
||||
}
|
||||
|
@ -168,23 +167,23 @@ func TestCollectionSet(t *testing.T) {
|
|||
|
||||
expect(t, len(c.FieldMap()) == 0)
|
||||
|
||||
v, flds, updated, ok = c.SetField("3", "hello", 123)
|
||||
_, flds, updated, ok = c.SetField("3", "hello", 123)
|
||||
expect(t, ok)
|
||||
expect(t, reflect.DeepEqual(flds, []float64{123}))
|
||||
expect(t, updated)
|
||||
expect(t, c.FieldMap()["hello"] == 0)
|
||||
|
||||
v, flds, updated, ok = c.SetField("3", "hello", 1234)
|
||||
_, flds, updated, ok = c.SetField("3", "hello", 1234)
|
||||
expect(t, ok)
|
||||
expect(t, reflect.DeepEqual(flds, []float64{1234}))
|
||||
expect(t, updated)
|
||||
|
||||
v, flds, updated, ok = c.SetField("3", "hello", 1234)
|
||||
_, flds, updated, ok = c.SetField("3", "hello", 1234)
|
||||
expect(t, ok)
|
||||
expect(t, reflect.DeepEqual(flds, []float64{1234}))
|
||||
expect(t, !updated)
|
||||
|
||||
v, flds, updateCount, ok = c.SetFields("3",
|
||||
_, flds, updateCount, ok = c.SetFields("3",
|
||||
[]string{"planet", "world"}, []float64{55, 66})
|
||||
expect(t, ok)
|
||||
expect(t, reflect.DeepEqual(flds, []float64{1234, 55, 66}))
|
||||
|
|
|
@ -26,7 +26,7 @@ func (conn *AMQPConn) Expired() bool {
|
|||
conn.mu.Lock()
|
||||
defer conn.mu.Unlock()
|
||||
if !conn.ex {
|
||||
if time.Now().Sub(conn.t) > amqpExpiresAfter {
|
||||
if time.Since(conn.t) > amqpExpiresAfter {
|
||||
conn.ex = true
|
||||
conn.close()
|
||||
}
|
||||
|
|
|
@ -32,7 +32,7 @@ func (conn *DisqueConn) Expired() bool {
|
|||
conn.mu.Lock()
|
||||
defer conn.mu.Unlock()
|
||||
if !conn.ex {
|
||||
if time.Now().Sub(conn.t) > disqueExpiresAfter {
|
||||
if time.Since(conn.t) > disqueExpiresAfter {
|
||||
if conn.conn != nil {
|
||||
conn.close()
|
||||
}
|
||||
|
|
|
@ -35,7 +35,7 @@ func (conn *GRPCConn) Expired() bool {
|
|||
conn.mu.Lock()
|
||||
defer conn.mu.Unlock()
|
||||
if !conn.ex {
|
||||
if time.Now().Sub(conn.t) > grpcExpiresAfter {
|
||||
if time.Since(conn.t) > grpcExpiresAfter {
|
||||
if conn.conn != nil {
|
||||
conn.close()
|
||||
}
|
||||
|
|
|
@ -32,7 +32,7 @@ func (conn *KafkaConn) Expired() bool {
|
|||
conn.mu.Lock()
|
||||
defer conn.mu.Unlock()
|
||||
if !conn.ex {
|
||||
if time.Now().Sub(conn.t) > kafkaExpiresAfter {
|
||||
if time.Since(conn.t) > kafkaExpiresAfter {
|
||||
if conn.conn != nil {
|
||||
conn.close()
|
||||
}
|
||||
|
|
|
@ -1,11 +1,5 @@
|
|||
package endpoint
|
||||
|
||||
import (
|
||||
"time"
|
||||
)
|
||||
|
||||
const localExpiresAfter = time.Second * 30
|
||||
|
||||
// LocalPublisher is used to publish local notifcations
|
||||
type LocalPublisher interface {
|
||||
Publish(channel string, message ...string) int
|
||||
|
|
|
@ -32,7 +32,7 @@ func (conn *MQTTConn) Expired() bool {
|
|||
conn.mu.Lock()
|
||||
defer conn.mu.Unlock()
|
||||
if !conn.ex {
|
||||
if time.Now().Sub(conn.t) > mqttExpiresAfter {
|
||||
if time.Since(conn.t) > mqttExpiresAfter {
|
||||
conn.close()
|
||||
conn.ex = true
|
||||
}
|
||||
|
|
|
@ -31,7 +31,7 @@ func (conn *NATSConn) Expired() bool {
|
|||
conn.mu.Lock()
|
||||
defer conn.mu.Unlock()
|
||||
if !conn.ex {
|
||||
if time.Now().Sub(conn.t) > natsExpiresAfter {
|
||||
if time.Since(conn.t) > natsExpiresAfter {
|
||||
if conn.conn != nil {
|
||||
conn.close()
|
||||
}
|
||||
|
|
|
@ -31,7 +31,7 @@ func (conn *RedisConn) Expired() bool {
|
|||
conn.mu.Lock()
|
||||
defer conn.mu.Unlock()
|
||||
if !conn.ex {
|
||||
if time.Now().Sub(conn.t) > redisExpiresAfter {
|
||||
if time.Since(conn.t) > redisExpiresAfter {
|
||||
if conn.conn != nil {
|
||||
conn.close()
|
||||
}
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
package endpoint
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"strings"
|
||||
"sync"
|
||||
|
@ -11,12 +10,9 @@ import (
|
|||
"github.com/aws/aws-sdk-go/aws/credentials"
|
||||
"github.com/aws/aws-sdk-go/aws/session"
|
||||
"github.com/aws/aws-sdk-go/service/sqs"
|
||||
"github.com/streadway/amqp"
|
||||
"github.com/tidwall/tile38/internal/log"
|
||||
)
|
||||
|
||||
var errCreateQueue = errors.New("Error while creating queue")
|
||||
|
||||
const sqsExpiresAfter = time.Second * 30
|
||||
|
||||
// SQSConn is an endpoint connection
|
||||
|
@ -25,7 +21,6 @@ type SQSConn struct {
|
|||
ep Endpoint
|
||||
session *session.Session
|
||||
svc *sqs.SQS
|
||||
channel *amqp.Channel
|
||||
ex bool
|
||||
t time.Time
|
||||
}
|
||||
|
@ -43,7 +38,7 @@ func (conn *SQSConn) Expired() bool {
|
|||
conn.mu.Lock()
|
||||
defer conn.mu.Unlock()
|
||||
if !conn.ex {
|
||||
if time.Now().Sub(conn.t) > sqsExpiresAfter {
|
||||
if time.Since(conn.t) > sqsExpiresAfter {
|
||||
conn.ex = true
|
||||
conn.close()
|
||||
}
|
||||
|
|
|
@ -62,7 +62,6 @@ type qnode struct {
|
|||
type queue struct {
|
||||
nodes []qnode
|
||||
len int
|
||||
size int
|
||||
}
|
||||
|
||||
func (q *queue) push(unix int64, item Item) {
|
||||
|
|
|
@ -7,7 +7,7 @@ import (
|
|||
"sync"
|
||||
"time"
|
||||
|
||||
"golang.org/x/crypto/ssh/terminal"
|
||||
"golang.org/x/term"
|
||||
)
|
||||
|
||||
var mu sync.Mutex
|
||||
|
@ -24,7 +24,7 @@ var Level = 1
|
|||
// SetOutput sets the output of the logger
|
||||
func SetOutput(w io.Writer) {
|
||||
f, ok := w.(*os.File)
|
||||
tty = ok && terminal.IsTerminal(int(f.Fd()))
|
||||
tty = ok && term.IsTerminal(int(f.Fd()))
|
||||
wr = w
|
||||
}
|
||||
|
||||
|
|
|
@ -29,8 +29,6 @@ func (err errAOFHook) Error() string {
|
|||
return fmt.Sprintf("hook: %v", err.err)
|
||||
}
|
||||
|
||||
var errInvalidAOF = errors.New("invalid aof file")
|
||||
|
||||
func (s *Server) loadAOF() (err error) {
|
||||
fi, err := s.aof.Stat()
|
||||
if err != nil {
|
||||
|
@ -39,7 +37,7 @@ func (s *Server) loadAOF() (err error) {
|
|||
start := time.Now()
|
||||
var count int
|
||||
defer func() {
|
||||
d := time.Now().Sub(start)
|
||||
d := time.Since(start)
|
||||
ps := float64(count) / (float64(d) / float64(time.Second))
|
||||
suf := []string{"bytes/s", "KB/s", "MB/s", "GB/s", "TB/s"}
|
||||
bps := float64(fi.Size()) / (float64(d) / float64(time.Second))
|
||||
|
@ -95,7 +93,7 @@ func (s *Server) loadAOF() (err error) {
|
|||
continue
|
||||
}
|
||||
if zeros > 0 {
|
||||
return errors.New("Zeros found in AOF file (issue #230)")
|
||||
return clientErrorf("Zeros found in AOF file (issue #230)")
|
||||
}
|
||||
}
|
||||
complete, args, _, data, err = redcon.ReadNextCommand(data, args[:0])
|
||||
|
@ -211,9 +209,7 @@ func (s *Server) writeAOF(args []string, d *commandDetails) error {
|
|||
if len(s.lives) > 0 {
|
||||
if d.parent {
|
||||
// queue children
|
||||
for _, d := range d.children {
|
||||
s.lstack = append(s.lstack, d)
|
||||
}
|
||||
s.lstack = append(s.lstack, d.children...)
|
||||
} else {
|
||||
// queue parent
|
||||
s.lstack = append(s.lstack, d)
|
||||
|
@ -444,7 +440,7 @@ func (s *Server) cmdAOFMD5(msg *Message) (res resp.Value, err error) {
|
|||
switch msg.OutputType {
|
||||
case JSON:
|
||||
res = resp.StringValue(
|
||||
fmt.Sprintf(`{"ok":true,"md5":"%s","elapsed":"%s"}`, sum, time.Now().Sub(start)))
|
||||
fmt.Sprintf(`{"ok":true,"md5":"%s","elapsed":"%s"}`, sum, time.Since(start)))
|
||||
case RESP:
|
||||
res = resp.SimpleStringValue(sum)
|
||||
}
|
||||
|
|
|
@ -154,6 +154,6 @@ func (s *Server) migrateAOF() error {
|
|||
}
|
||||
oldf.Close()
|
||||
newf.Close()
|
||||
log.Debugf("%d items: %.0f/sec", count, float64(count)/(float64(time.Now().Sub(start))/float64(time.Second)))
|
||||
log.Debugf("%d items: %.0f/sec", count, float64(count)/(float64(time.Since(start))/float64(time.Second)))
|
||||
return os.Rename(path.Join(s.dir, "migrate.aof"), path.Join(s.dir, "appendonly.aof"))
|
||||
}
|
||||
|
|
|
@ -38,8 +38,7 @@ func (server *Server) aofshrink() {
|
|||
server.shrinking = false
|
||||
server.shrinklog = nil
|
||||
server.mu.Unlock()
|
||||
log.Infof("aof shrink ended %v", time.Now().Sub(start))
|
||||
return
|
||||
log.Infof("aof shrink ended %v", time.Since(start))
|
||||
}()
|
||||
|
||||
err := func() error {
|
||||
|
@ -199,20 +198,16 @@ func (server *Server) aofshrink() {
|
|||
} else {
|
||||
values = append(values, "sethook", name,
|
||||
strings.Join(hook.Endpoints, ","))
|
||||
values = append(values)
|
||||
}
|
||||
for _, meta := range hook.Metas {
|
||||
values = append(values, "meta", meta.Name, meta.Value)
|
||||
}
|
||||
if !hook.expires.IsZero() {
|
||||
ex := float64(hook.expires.Sub(time.Now())) /
|
||||
float64(time.Second)
|
||||
ex := float64(time.Until(hook.expires)) / float64(time.Second)
|
||||
values = append(values, "ex",
|
||||
strconv.FormatFloat(ex, 'f', 1, 64))
|
||||
}
|
||||
for _, value := range hook.Message.Args {
|
||||
values = append(values, value)
|
||||
}
|
||||
values = append(values, hook.Message.Args...)
|
||||
// append the values to the aof buffer
|
||||
aofbuf = append(aofbuf, '*')
|
||||
aofbuf = append(aofbuf, strconv.FormatInt(int64(len(values)), 10)...)
|
||||
|
|
|
@ -60,8 +60,9 @@ func (s *Server) cmdClient(msg *Message, client *Client) (resp.Value, error) {
|
|||
}
|
||||
switch strings.ToLower(msg.Args[1]) {
|
||||
default:
|
||||
return NOMessage, errors.New("Syntax error, try CLIENT " +
|
||||
"(LIST | KILL | GETNAME | SETNAME)")
|
||||
return NOMessage, clientErrorf(
|
||||
"Syntax error, try CLIENT (LIST | KILL | GETNAME | SETNAME)",
|
||||
)
|
||||
case "list":
|
||||
if len(msg.Args) != 2 {
|
||||
return NOMessage, errInvalidNumberOfArguments
|
||||
|
@ -114,7 +115,7 @@ func (s *Server) cmdClient(msg *Message, client *Client) (resp.Value, error) {
|
|||
if err != nil {
|
||||
return NOMessage, err
|
||||
}
|
||||
return resp.StringValue(`{"ok":true,"list":` + string(data) + `,"elapsed":"` + time.Now().Sub(start).String() + "\"}"), nil
|
||||
return resp.StringValue(`{"ok":true,"list":` + string(data) + `,"elapsed":"` + time.Since(start).String() + "\"}"), nil
|
||||
case RESP:
|
||||
return resp.BytesValue(buf), nil
|
||||
}
|
||||
|
@ -131,7 +132,7 @@ func (s *Server) cmdClient(msg *Message, client *Client) (resp.Value, error) {
|
|||
client.mu.Unlock()
|
||||
return resp.StringValue(`{"ok":true,"name":` +
|
||||
jsonString(name) +
|
||||
`,"elapsed":"` + time.Now().Sub(start).String() + "\"}"), nil
|
||||
`,"elapsed":"` + time.Since(start).String() + "\"}"), nil
|
||||
case RESP:
|
||||
return resp.StringValue(name), nil
|
||||
}
|
||||
|
@ -142,8 +143,9 @@ func (s *Server) cmdClient(msg *Message, client *Client) (resp.Value, error) {
|
|||
name := msg.Args[2]
|
||||
for i := 0; i < len(name); i++ {
|
||||
if name[i] < '!' || name[i] > '~' {
|
||||
errstr := "Client names cannot contain spaces, newlines or special characters."
|
||||
return NOMessage, errors.New(errstr)
|
||||
return NOMessage, clientErrorf(
|
||||
"Client names cannot contain spaces, newlines or special characters.",
|
||||
)
|
||||
}
|
||||
}
|
||||
client.mu.Lock()
|
||||
|
@ -151,7 +153,7 @@ func (s *Server) cmdClient(msg *Message, client *Client) (resp.Value, error) {
|
|||
client.mu.Unlock()
|
||||
switch msg.OutputType {
|
||||
case JSON:
|
||||
return resp.StringValue(`{"ok":true,"elapsed":"` + time.Now().Sub(start).String() + "\"}"), nil
|
||||
return resp.StringValue(`{"ok":true,"elapsed":"` + time.Since(start).String() + "\"}"), nil
|
||||
case RESP:
|
||||
return resp.SimpleStringValue("OK"), nil
|
||||
}
|
||||
|
@ -172,7 +174,7 @@ func (s *Server) cmdClient(msg *Message, client *Client) (resp.Value, error) {
|
|||
}
|
||||
switch strings.ToLower(arg) {
|
||||
default:
|
||||
return NOMessage, errors.New("No such client")
|
||||
return NOMessage, clientErrorf("No such client")
|
||||
case "addr":
|
||||
i++
|
||||
if i == len(msg.Args) {
|
||||
|
@ -202,13 +204,13 @@ func (s *Server) cmdClient(msg *Message, client *Client) (resp.Value, error) {
|
|||
}
|
||||
s.connsmu.RUnlock()
|
||||
if cclose == nil {
|
||||
return NOMessage, errors.New("No such client")
|
||||
return NOMessage, clientErrorf("No such client")
|
||||
}
|
||||
|
||||
var res resp.Value
|
||||
switch msg.OutputType {
|
||||
case JSON:
|
||||
res = resp.StringValue(`{"ok":true,"elapsed":"` + time.Now().Sub(start).String() + "\"}")
|
||||
res = resp.StringValue(`{"ok":true,"elapsed":"` + time.Since(start).String() + "\"}")
|
||||
case RESP:
|
||||
res = resp.SimpleStringValue("OK")
|
||||
}
|
||||
|
@ -229,32 +231,3 @@ func (s *Server) cmdClient(msg *Message, client *Client) (resp.Value, error) {
|
|||
}
|
||||
return NOMessage, errors.New("invalid output type")
|
||||
}
|
||||
|
||||
/*
|
||||
func (c *Controller) cmdClientList(msg *Message) (string, error) {
|
||||
|
||||
var ok bool
|
||||
var key string
|
||||
if vs, key, ok = tokenval(vs); !ok || key == "" {
|
||||
return "", errInvalidNumberOfArguments
|
||||
}
|
||||
|
||||
col := c.getCol(key)
|
||||
if col == nil {
|
||||
if msg.OutputType == RESP {
|
||||
return "+none\r\n", nil
|
||||
}
|
||||
return "", errKeyNotFound
|
||||
}
|
||||
|
||||
typ := "hash"
|
||||
|
||||
switch msg.OutputType {
|
||||
case JSON:
|
||||
return `{"ok":true,"type":` + string(typ) + `,"elapsed":"` + time.Now().Sub(start).String() + "\"}", nil
|
||||
case RESP:
|
||||
return "+" + typ + "\r\n", nil
|
||||
}
|
||||
return "", nil
|
||||
}
|
||||
*/
|
||||
|
|
|
@ -2,7 +2,6 @@ package server
|
|||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
"os"
|
||||
"strconv"
|
||||
|
@ -241,7 +240,7 @@ func (config *Config) setProperty(name, value string, fromLoad bool) error {
|
|||
var invalid bool
|
||||
switch name {
|
||||
default:
|
||||
return fmt.Errorf("Unsupported CONFIG parameter: %s", name)
|
||||
return clientErrorf("Unsupported CONFIG parameter: %s", name)
|
||||
case RequirePass:
|
||||
config._requirePass = value
|
||||
case LeaderAuth:
|
||||
|
@ -259,7 +258,7 @@ func (config *Config) setProperty(name, value string, fromLoad bool) error {
|
|||
case MaxMemory:
|
||||
sz, ok := parseMemSize(value)
|
||||
if !ok {
|
||||
return fmt.Errorf("Invalid argument '%s' for CONFIG SET '%s'", value, name)
|
||||
return clientErrorf("Invalid argument '%s' for CONFIG SET '%s'", value, name)
|
||||
}
|
||||
config._maxMemory = sz
|
||||
case ProtectedMode:
|
||||
|
@ -289,7 +288,7 @@ func (config *Config) setProperty(name, value string, fromLoad bool) error {
|
|||
}
|
||||
|
||||
if invalid {
|
||||
return fmt.Errorf("Invalid argument '%s' for CONFIG SET '%s'", value, name)
|
||||
return clientErrorf("Invalid argument '%s' for CONFIG SET '%s'", value, name)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
@ -345,7 +344,7 @@ func (s *Server) cmdConfigGet(msg *Message) (res resp.Value, err error) {
|
|||
if err != nil {
|
||||
return NOMessage, err
|
||||
}
|
||||
res = resp.StringValue(`{"ok":true,"properties":` + string(data) + `,"elapsed":"` + time.Now().Sub(start).String() + "\"}")
|
||||
res = resp.StringValue(`{"ok":true,"properties":` + string(data) + `,"elapsed":"` + time.Since(start).String() + "\"}")
|
||||
case RESP:
|
||||
vals := respValuesSimpleMap(m)
|
||||
res = resp.ArrayValue(vals)
|
||||
|
@ -398,18 +397,6 @@ func (config *Config) followPort() int {
|
|||
config.mu.RUnlock()
|
||||
return int(v)
|
||||
}
|
||||
func (config *Config) followID() string {
|
||||
config.mu.RLock()
|
||||
v := config._followID
|
||||
config.mu.RUnlock()
|
||||
return v
|
||||
}
|
||||
func (config *Config) followPos() int64 {
|
||||
config.mu.RLock()
|
||||
v := config._followPos
|
||||
config.mu.RUnlock()
|
||||
return v
|
||||
}
|
||||
func (config *Config) serverID() string {
|
||||
config.mu.RLock()
|
||||
v := config._serverID
|
||||
|
@ -468,53 +455,8 @@ func (config *Config) setFollowPort(v int) {
|
|||
config._followPort = int64(v)
|
||||
config.mu.Unlock()
|
||||
}
|
||||
func (config *Config) setFollowID(v string) {
|
||||
config.mu.Lock()
|
||||
config._followID = v
|
||||
config.mu.Unlock()
|
||||
}
|
||||
func (config *Config) setFollowPos(v int64) {
|
||||
config.mu.Lock()
|
||||
config._followPos = v
|
||||
config.mu.Unlock()
|
||||
}
|
||||
func (config *Config) setServerID(v string) {
|
||||
config.mu.Lock()
|
||||
config._serverID = v
|
||||
config.mu.Unlock()
|
||||
}
|
||||
func (config *Config) setReadOnly(v bool) {
|
||||
config.mu.Lock()
|
||||
config._readOnly = v
|
||||
config.mu.Unlock()
|
||||
}
|
||||
func (config *Config) setRequirePass(v string) {
|
||||
config.mu.Lock()
|
||||
config._requirePass = v
|
||||
config.mu.Unlock()
|
||||
}
|
||||
func (config *Config) setLeaderAuth(v string) {
|
||||
config.mu.Lock()
|
||||
config._leaderAuth = v
|
||||
config.mu.Unlock()
|
||||
}
|
||||
func (config *Config) setProtectedMode(v string) {
|
||||
config.mu.Lock()
|
||||
config._protectedMode = v
|
||||
config.mu.Unlock()
|
||||
}
|
||||
func (config *Config) setMaxMemory(v int) {
|
||||
config.mu.Lock()
|
||||
config._maxMemory = int64(v)
|
||||
config.mu.Unlock()
|
||||
}
|
||||
func (config *Config) setAutoGC(v uint64) {
|
||||
config.mu.Lock()
|
||||
config._autoGC = v
|
||||
config.mu.Unlock()
|
||||
}
|
||||
func (config *Config) setKeepAlive(v int64) {
|
||||
config.mu.Lock()
|
||||
config._keepAlive = v
|
||||
config.mu.Unlock()
|
||||
}
|
||||
|
|
|
@ -87,7 +87,7 @@ func (server *Server) cmdBounds(msg *Message) (resp.Value, error) {
|
|||
}
|
||||
switch msg.OutputType {
|
||||
case JSON:
|
||||
buf.WriteString(`,"elapsed":"` + time.Now().Sub(start).String() + "\"}")
|
||||
buf.WriteString(`,"elapsed":"` + time.Since(start).String() + "\"}")
|
||||
return resp.StringValue(buf.String()), nil
|
||||
case RESP:
|
||||
return vals[0], nil
|
||||
|
@ -101,7 +101,7 @@ func (server *Server) cmdType(msg *Message) (resp.Value, error) {
|
|||
|
||||
var ok bool
|
||||
var key string
|
||||
if vs, key, ok = tokenval(vs); !ok || key == "" {
|
||||
if _, key, ok = tokenval(vs); !ok || key == "" {
|
||||
return NOMessage, errInvalidNumberOfArguments
|
||||
}
|
||||
|
||||
|
@ -117,7 +117,7 @@ func (server *Server) cmdType(msg *Message) (resp.Value, error) {
|
|||
|
||||
switch msg.OutputType {
|
||||
case JSON:
|
||||
return resp.StringValue(`{"ok":true,"type":` + string(typ) + `,"elapsed":"` + time.Now().Sub(start).String() + "\"}"), nil
|
||||
return resp.StringValue(`{"ok":true,"type":` + string(typ) + `,"elapsed":"` + time.Since(start).String() + "\"}"), nil
|
||||
case RESP:
|
||||
return resp.SimpleStringValue(typ), nil
|
||||
}
|
||||
|
@ -269,7 +269,7 @@ func (server *Server) cmdGet(msg *Message) (resp.Value, error) {
|
|||
}
|
||||
switch msg.OutputType {
|
||||
case JSON:
|
||||
buf.WriteString(`,"elapsed":"` + time.Now().Sub(start).String() + "\"}")
|
||||
buf.WriteString(`,"elapsed":"` + time.Since(start).String() + "\"}")
|
||||
return resp.StringValue(buf.String()), nil
|
||||
case RESP:
|
||||
var oval resp.Value
|
||||
|
@ -316,7 +316,7 @@ func (server *Server) cmdDel(msg *Message) (res resp.Value, d commandDetails, er
|
|||
d.timestamp = time.Now()
|
||||
switch msg.OutputType {
|
||||
case JSON:
|
||||
res = resp.StringValue(`{"ok":true,"elapsed":"` + time.Now().Sub(start).String() + "\"}")
|
||||
res = resp.StringValue(`{"ok":true,"elapsed":"` + time.Since(start).String() + "\"}")
|
||||
case RESP:
|
||||
if d.updated {
|
||||
res = resp.IntegerValue(1)
|
||||
|
@ -396,7 +396,7 @@ func (server *Server) cmdPdel(msg *Message) (res resp.Value, d commandDetails, e
|
|||
d.parent = true
|
||||
switch msg.OutputType {
|
||||
case JSON:
|
||||
res = resp.StringValue(`{"ok":true,"elapsed":"` + time.Now().Sub(start).String() + "\"}")
|
||||
res = resp.StringValue(`{"ok":true,"elapsed":"` + time.Since(start).String() + "\"}")
|
||||
case RESP:
|
||||
total := len(d.children) - expired
|
||||
if total < 0 {
|
||||
|
@ -432,7 +432,7 @@ func (server *Server) cmdDrop(msg *Message) (res resp.Value, d commandDetails, e
|
|||
server.clearKeyExpires(d.key)
|
||||
switch msg.OutputType {
|
||||
case JSON:
|
||||
res = resp.StringValue(`{"ok":true,"elapsed":"` + time.Now().Sub(start).String() + "\"}")
|
||||
res = resp.StringValue(`{"ok":true,"elapsed":"` + time.Since(start).String() + "\"}")
|
||||
case RESP:
|
||||
if d.updated {
|
||||
res = resp.IntegerValue(1)
|
||||
|
@ -489,7 +489,7 @@ func (server *Server) cmdRename(msg *Message, nx bool) (res resp.Value, d comman
|
|||
d.timestamp = time.Now()
|
||||
switch msg.OutputType {
|
||||
case JSON:
|
||||
res = resp.StringValue(`{"ok":true,"elapsed":"` + time.Now().Sub(start).String() + "\"}")
|
||||
res = resp.StringValue(`{"ok":true,"elapsed":"` + time.Since(start).String() + "\"}")
|
||||
case RESP:
|
||||
if !nx {
|
||||
res = resp.SimpleStringValue("OK")
|
||||
|
@ -520,7 +520,7 @@ func (server *Server) cmdFlushDB(msg *Message) (res resp.Value, d commandDetails
|
|||
d.timestamp = time.Now()
|
||||
switch msg.OutputType {
|
||||
case JSON:
|
||||
res = resp.StringValue(`{"ok":true,"elapsed":"` + time.Now().Sub(start).String() + "\"}")
|
||||
res = resp.StringValue(`{"ok":true,"elapsed":"` + time.Since(start).String() + "\"}")
|
||||
case RESP:
|
||||
res = resp.SimpleStringValue("OK")
|
||||
}
|
||||
|
@ -798,7 +798,7 @@ func (server *Server) cmdSet(msg *Message, resetExpires bool) (res resp.Value, d
|
|||
switch msg.OutputType {
|
||||
default:
|
||||
case JSON:
|
||||
res = resp.StringValue(`{"ok":true,"elapsed":"` + time.Now().Sub(start).String() + "\"}")
|
||||
res = resp.StringValue(`{"ok":true,"elapsed":"` + time.Since(start).String() + "\"}")
|
||||
case RESP:
|
||||
res = resp.SimpleStringValue("OK")
|
||||
}
|
||||
|
@ -899,7 +899,7 @@ func (server *Server) cmdFset(msg *Message) (res resp.Value, d commandDetails, e
|
|||
|
||||
switch msg.OutputType {
|
||||
case JSON:
|
||||
res = resp.StringValue(`{"ok":true,"elapsed":"` + time.Now().Sub(start).String() + "\"}")
|
||||
res = resp.StringValue(`{"ok":true,"elapsed":"` + time.Since(start).String() + "\"}")
|
||||
case RESP:
|
||||
res = resp.IntegerValue(updateCount)
|
||||
}
|
||||
|
@ -946,7 +946,7 @@ func (server *Server) cmdExpire(msg *Message) (res resp.Value, d commandDetails,
|
|||
switch msg.OutputType {
|
||||
case JSON:
|
||||
if ok {
|
||||
res = resp.StringValue(`{"ok":true,"elapsed":"` + time.Now().Sub(start).String() + "\"}")
|
||||
res = resp.StringValue(`{"ok":true,"elapsed":"` + time.Since(start).String() + "\"}")
|
||||
} else {
|
||||
return resp.SimpleStringValue(""), d, errIDNotFound
|
||||
}
|
||||
|
@ -998,7 +998,7 @@ func (server *Server) cmdPersist(msg *Message) (res resp.Value, d commandDetails
|
|||
d.timestamp = time.Now()
|
||||
switch msg.OutputType {
|
||||
case JSON:
|
||||
res = resp.SimpleStringValue(`{"ok":true,"elapsed":"` + time.Now().Sub(start).String() + "\"}")
|
||||
res = resp.SimpleStringValue(`{"ok":true,"elapsed":"` + time.Since(start).String() + "\"}")
|
||||
case RESP:
|
||||
if cleared {
|
||||
res = resp.IntegerValue(1)
|
||||
|
@ -1040,7 +1040,7 @@ func (server *Server) cmdTTL(msg *Message) (res resp.Value, err error) {
|
|||
if time.Now().After(at) {
|
||||
ok2 = false
|
||||
} else {
|
||||
v = float64(at.Sub(time.Now())) / float64(time.Second)
|
||||
v = float64(time.Until(at)) / float64(time.Second)
|
||||
if v < 0 {
|
||||
v = 0
|
||||
}
|
||||
|
@ -1058,7 +1058,7 @@ func (server *Server) cmdTTL(msg *Message) (res resp.Value, err error) {
|
|||
ttl = "-1"
|
||||
}
|
||||
res = resp.SimpleStringValue(
|
||||
`{"ok":true,"ttl":` + ttl + `,"elapsed":"` + time.Now().Sub(start).String() + "\"}")
|
||||
`{"ok":true,"ttl":` + ttl + `,"elapsed":"` + time.Since(start).String() + "\"}")
|
||||
} else {
|
||||
return resp.SimpleStringValue(""), errIDNotFound
|
||||
}
|
||||
|
|
|
@ -78,8 +78,7 @@ func (s *Server) cmdMassInsert(msg *Message) (res resp.Value, err error) {
|
|||
docmd := func(args []string) error {
|
||||
s.mu.Lock()
|
||||
defer s.mu.Unlock()
|
||||
var nmsg Message
|
||||
nmsg = *msg
|
||||
nmsg := *msg
|
||||
nmsg._command = ""
|
||||
nmsg.Args = args
|
||||
_, d, err := s.command(&nmsg, nil)
|
||||
|
|
|
@ -107,7 +107,7 @@ func (s *Server) cmdReplConf(msg *Message, client *Client) (res resp.Value, err
|
|||
if vs, cmd, ok = tokenval(vs); !ok || cmd == "" {
|
||||
return NOMessage, errInvalidNumberOfArguments
|
||||
}
|
||||
if vs, val, ok = tokenval(vs); !ok || val == "" {
|
||||
if _, val, ok = tokenval(vs); !ok || val == "" {
|
||||
return NOMessage, errInvalidNumberOfArguments
|
||||
}
|
||||
|
||||
|
|
|
@ -109,7 +109,9 @@ func (s *Server) cmdSetHook(msg *Message, chanCmd bool) (
|
|||
break
|
||||
}
|
||||
args, err := s.cmdSearchArgs(true, cmdlc, vs, types)
|
||||
defer args.Close()
|
||||
if args.usingLua() {
|
||||
defer args.Close()
|
||||
}
|
||||
if err != nil {
|
||||
return NOMessage, d, err
|
||||
}
|
||||
|
@ -252,7 +254,7 @@ func (s *Server) cmdDelHook(msg *Message, chanCmd bool) (
|
|||
delete(s.hooks, hook.Name)
|
||||
delete(s.hooksOut, hook.Name)
|
||||
// remove hook from spatial index
|
||||
if hook != nil && hook.Fence != nil && hook.Fence.obj != nil {
|
||||
if hook.Fence != nil && hook.Fence.obj != nil {
|
||||
rect := hook.Fence.obj.Rect()
|
||||
s.hookTree.Delete(
|
||||
[2]float64{rect.Min.X, rect.Min.Y},
|
||||
|
@ -310,7 +312,7 @@ func (s *Server) cmdPDelHook(msg *Message, channel bool) (
|
|||
delete(s.hooks, hook.Name)
|
||||
delete(s.hooksOut, hook.Name)
|
||||
// remove hook from spatial index
|
||||
if hook != nil && hook.Fence != nil && hook.Fence.obj != nil {
|
||||
if hook.Fence != nil && hook.Fence.obj != nil {
|
||||
rect := hook.Fence.obj.Rect()
|
||||
s.hookTree.Delete(
|
||||
[2]float64{rect.Min.X, rect.Min.Y},
|
||||
|
@ -439,7 +441,7 @@ func (s *Server) cmdHooks(msg *Message, channel bool) (
|
|||
buf.WriteString(`}}`)
|
||||
}
|
||||
buf.WriteString(`],"elapsed":"` +
|
||||
time.Now().Sub(start).String() + "\"}")
|
||||
time.Since(start).String() + "\"}")
|
||||
return resp.StringValue(buf.String()), nil
|
||||
case RESP:
|
||||
var vals []resp.Value
|
||||
|
|
|
@ -222,7 +222,7 @@ func (s *Server) cmdJget(msg *Message) (resp.Value, error) {
|
|||
if res.Exists() {
|
||||
buf.WriteString(`,"value":` + jsonString(val))
|
||||
}
|
||||
buf.WriteString(`,"elapsed":"` + time.Now().Sub(start).String() + "\"}")
|
||||
buf.WriteString(`,"elapsed":"` + time.Since(start).String() + "\"}")
|
||||
return resp.StringValue(buf.String()), nil
|
||||
case RESP:
|
||||
if !res.Exists() {
|
||||
|
@ -311,7 +311,7 @@ func (s *Server) cmdJset(msg *Message) (res resp.Value, d commandDetails, err er
|
|||
case JSON:
|
||||
var buf bytes.Buffer
|
||||
buf.WriteString(`{"ok":true`)
|
||||
buf.WriteString(`,"elapsed":"` + time.Now().Sub(start).String() + "\"}")
|
||||
buf.WriteString(`,"elapsed":"` + time.Since(start).String() + "\"}")
|
||||
return resp.StringValue(buf.String()), d, nil
|
||||
case RESP:
|
||||
return resp.SimpleStringValue("OK"), d, nil
|
||||
|
@ -377,7 +377,7 @@ func (s *Server) cmdJdel(msg *Message) (res resp.Value, d commandDetails, err er
|
|||
case JSON:
|
||||
var buf bytes.Buffer
|
||||
buf.WriteString(`{"ok":true`)
|
||||
buf.WriteString(`,"elapsed":"` + time.Now().Sub(start).String() + "\"}")
|
||||
buf.WriteString(`,"elapsed":"` + time.Since(start).String() + "\"}")
|
||||
return resp.StringValue(buf.String()), d, nil
|
||||
case RESP:
|
||||
return resp.IntegerValue(1), d, nil
|
||||
|
|
|
@ -88,7 +88,7 @@ func (s *Server) cmdKeys(msg *Message) (res resp.Value, err error) {
|
|||
s.cols.Ascend(nil, iterator)
|
||||
}
|
||||
if msg.OutputType == JSON {
|
||||
wr.WriteString(`],"elapsed":"` + time.Now().Sub(start).String() + "\"}")
|
||||
wr.WriteString(`],"elapsed":"` + time.Since(start).String() + "\"}")
|
||||
return resp.StringValue(wr.String()), nil
|
||||
}
|
||||
return resp.ArrayValue(vals), nil
|
||||
|
|
|
@ -39,24 +39,22 @@ func (s *Server) liveMonitor(conn net.Conn, rd *PipelineReader, msg *Message) er
|
|||
s.monconnsMu.Lock()
|
||||
conn.Write([]byte("+OK\r\n"))
|
||||
s.monconnsMu.Unlock()
|
||||
for {
|
||||
msgs, err := rd.ReadMessages()
|
||||
if err != nil {
|
||||
if err == io.EOF {
|
||||
return nil
|
||||
}
|
||||
return err
|
||||
msgs, err := rd.ReadMessages()
|
||||
if err != nil {
|
||||
if err == io.EOF {
|
||||
return nil
|
||||
}
|
||||
for _, msg := range msgs {
|
||||
if len(msg.Args) == 1 && strings.ToLower(msg.Args[0]) == "quit" {
|
||||
s.monconnsMu.Lock()
|
||||
conn.Write([]byte("+OK\r\n"))
|
||||
s.monconnsMu.Unlock()
|
||||
return nil
|
||||
}
|
||||
}
|
||||
return nil
|
||||
return err
|
||||
}
|
||||
for _, msg := range msgs {
|
||||
if len(msg.Args) == 1 && strings.ToLower(msg.Args[0]) == "quit" {
|
||||
s.monconnsMu.Lock()
|
||||
conn.Write([]byte("+OK\r\n"))
|
||||
s.monconnsMu.Unlock()
|
||||
return nil
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// send messages to live MONITOR clients
|
||||
|
|
|
@ -34,7 +34,7 @@ func (s *Server) cmdOutput(msg *Message) (res resp.Value, err error) {
|
|||
default:
|
||||
return NOMessage, nil
|
||||
case JSON:
|
||||
return resp.StringValue(`{"ok":true,"output":"json","elapsed":` + time.Now().Sub(start).String() + `}`), nil
|
||||
return resp.StringValue(`{"ok":true,"output":"json","elapsed":` + time.Since(start).String() + `}`), nil
|
||||
case RESP:
|
||||
return resp.StringValue("resp"), nil
|
||||
}
|
||||
|
|
|
@ -166,7 +166,7 @@ func (s *Server) cmdPublish(msg *Message) (resp.Value, error) {
|
|||
case JSON:
|
||||
res = resp.StringValue(`{"ok":true` +
|
||||
`,"published":` + strconv.FormatInt(int64(n), 10) +
|
||||
`,"elapsed":"` + time.Now().Sub(start).String() + `"}`)
|
||||
`,"elapsed":"` + time.Since(start).String() + `"}`)
|
||||
case RESP:
|
||||
res = resp.IntegerValue(n)
|
||||
}
|
||||
|
@ -200,7 +200,7 @@ func (s *Server) liveSubscription(
|
|||
switch outputType {
|
||||
case JSON:
|
||||
write([]byte(`{"ok":true` +
|
||||
`,"elapsed":"` + time.Now().Sub(start).String() + `"}`))
|
||||
`,"elapsed":"` + time.Since(start).String() + `"}`))
|
||||
case RESP:
|
||||
write([]byte("+OK\r\n"))
|
||||
}
|
||||
|
@ -209,7 +209,7 @@ func (s *Server) liveSubscription(
|
|||
switch outputType {
|
||||
case JSON:
|
||||
write([]byte(`{"ok":false,"err":"invalid number of arguments"` +
|
||||
`,"elapsed":"` + time.Now().Sub(start).String() + `"}`))
|
||||
`,"elapsed":"` + time.Since(start).String() + `"}`))
|
||||
case RESP:
|
||||
write([]byte("-ERR wrong number of arguments " +
|
||||
"for '" + command + "' command\r\n"))
|
||||
|
@ -221,7 +221,7 @@ func (s *Server) liveSubscription(
|
|||
write([]byte(`{"ok":false` +
|
||||
`,"err":"only (P)SUBSCRIBE / (P)UNSUBSCRIBE / ` +
|
||||
`PING / QUIT allowed in this context"` +
|
||||
`,"elapsed":"` + time.Now().Sub(start).String() + `"}`))
|
||||
`,"elapsed":"` + time.Since(start).String() + `"}`))
|
||||
case RESP:
|
||||
write([]byte("-ERR only (P)SUBSCRIBE / (P)UNSUBSCRIBE / " +
|
||||
"PING / QUIT allowed in this context\r\n"))
|
||||
|
@ -234,7 +234,7 @@ func (s *Server) liveSubscription(
|
|||
`,"command":` + jsonString(command) +
|
||||
`,"channel":` + jsonString(channel) +
|
||||
`,"num":` + strconv.FormatInt(int64(num), 10) +
|
||||
`,"elapsed":"` + time.Now().Sub(start).String() + `"}`))
|
||||
`,"elapsed":"` + time.Since(start).String() + `"}`))
|
||||
case RESP:
|
||||
b := redcon.AppendArray(nil, 3)
|
||||
b = redcon.AppendBulkString(b, command)
|
||||
|
|
|
@ -58,7 +58,7 @@ func (s *Server) cmdScan(msg *Message) (res resp.Value, err error) {
|
|||
sw.writeHead()
|
||||
if sw.col != nil {
|
||||
if sw.output == outputCount && len(sw.wheres) == 0 &&
|
||||
len(sw.whereins) == 0 && sw.globEverything == true {
|
||||
len(sw.whereins) == 0 && sw.globEverything {
|
||||
count := sw.col.Count() - int(args.cursor)
|
||||
if count < 0 {
|
||||
count = 0
|
||||
|
@ -93,7 +93,7 @@ func (s *Server) cmdScan(msg *Message) (res resp.Value, err error) {
|
|||
}
|
||||
sw.writeFoot()
|
||||
if msg.OutputType == JSON {
|
||||
wr.WriteString(`,"elapsed":"` + time.Now().Sub(start).String() + "\"}")
|
||||
wr.WriteString(`,"elapsed":"` + time.Since(start).String() + "\"}")
|
||||
return resp.BytesValue(wr.Bytes()), nil
|
||||
}
|
||||
return sw.respOut, nil
|
||||
|
|
|
@ -482,7 +482,7 @@ func (s *Server) cmdEvalUnified(scriptIsSha bool, msg *Message) (res resp.Value,
|
|||
var buf bytes.Buffer
|
||||
buf.WriteString(`{"ok":true`)
|
||||
buf.WriteString(`,"result":` + ConvertToJSON(ret))
|
||||
buf.WriteString(`,"elapsed":"` + time.Now().Sub(start).String() + "\"}")
|
||||
buf.WriteString(`,"elapsed":"` + time.Since(start).String() + "\"}")
|
||||
return resp.StringValue(buf.String()), nil
|
||||
case RESP:
|
||||
return ConvertToRESP(ret), nil
|
||||
|
@ -496,7 +496,7 @@ func (s *Server) cmdScriptLoad(msg *Message) (resp.Value, error) {
|
|||
|
||||
var ok bool
|
||||
var script string
|
||||
if vs, script, ok = tokenval(vs); !ok || script == "" {
|
||||
if _, script, ok = tokenval(vs); !ok || script == "" {
|
||||
return NOMessage, errInvalidNumberOfArguments
|
||||
}
|
||||
|
||||
|
@ -519,7 +519,7 @@ func (s *Server) cmdScriptLoad(msg *Message) (resp.Value, error) {
|
|||
var buf bytes.Buffer
|
||||
buf.WriteString(`{"ok":true`)
|
||||
buf.WriteString(`,"result":"` + shaSum + `"`)
|
||||
buf.WriteString(`,"elapsed":"` + time.Now().Sub(start).String() + "\"}")
|
||||
buf.WriteString(`,"elapsed":"` + time.Since(start).String() + "\"}")
|
||||
return resp.StringValue(buf.String()), nil
|
||||
case RESP:
|
||||
return resp.StringValue(shaSum), nil
|
||||
|
@ -557,7 +557,7 @@ func (s *Server) cmdScriptExists(msg *Message) (resp.Value, error) {
|
|||
resArray = append(resArray, fmt.Sprintf("%d", ires))
|
||||
}
|
||||
buf.WriteString(`,"result":[` + strings.Join(resArray, ",") + `]`)
|
||||
buf.WriteString(`,"elapsed":"` + time.Now().Sub(start).String() + "\"}")
|
||||
buf.WriteString(`,"elapsed":"` + time.Since(start).String() + "\"}")
|
||||
return resp.StringValue(buf.String()), nil
|
||||
case RESP:
|
||||
var resArray []resp.Value
|
||||
|
@ -577,7 +577,7 @@ func (s *Server) cmdScriptFlush(msg *Message) (resp.Value, error) {
|
|||
case JSON:
|
||||
var buf bytes.Buffer
|
||||
buf.WriteString(`{"ok":true`)
|
||||
buf.WriteString(`,"elapsed":"` + time.Now().Sub(start).String() + "\"}")
|
||||
buf.WriteString(`,"elapsed":"` + time.Since(start).String() + "\"}")
|
||||
return resp.StringValue(buf.String()), nil
|
||||
case RESP:
|
||||
return resp.StringValue("OK"), nil
|
||||
|
|
|
@ -390,7 +390,7 @@ func (server *Server) cmdNearby(msg *Message) (res resp.Value, err error) {
|
|||
}
|
||||
sw.writeFoot()
|
||||
if msg.OutputType == JSON {
|
||||
wr.WriteString(`,"elapsed":"` + time.Now().Sub(start).String() + "\"}")
|
||||
wr.WriteString(`,"elapsed":"` + time.Since(start).String() + "\"}")
|
||||
return resp.BytesValue(wr.Bytes()), nil
|
||||
}
|
||||
return sw.respOut, nil
|
||||
|
@ -518,7 +518,7 @@ func (server *Server) cmdWithinOrIntersects(cmd string, msg *Message) (res resp.
|
|||
}
|
||||
sw.writeFoot()
|
||||
if msg.OutputType == JSON {
|
||||
wr.WriteString(`,"elapsed":"` + time.Now().Sub(start).String() + "\"}")
|
||||
wr.WriteString(`,"elapsed":"` + time.Since(start).String() + "\"}")
|
||||
return resp.BytesValue(wr.Bytes()), nil
|
||||
}
|
||||
return sw.respOut, nil
|
||||
|
@ -570,7 +570,7 @@ func (server *Server) cmdSearch(msg *Message) (res resp.Value, err error) {
|
|||
}
|
||||
sw.writeHead()
|
||||
if sw.col != nil {
|
||||
if sw.output == outputCount && len(sw.wheres) == 0 && sw.globEverything == true {
|
||||
if sw.output == outputCount && len(sw.wheres) == 0 && sw.globEverything {
|
||||
count := sw.col.Count() - int(s.cursor)
|
||||
if count < 0 {
|
||||
count = 0
|
||||
|
@ -609,7 +609,7 @@ func (server *Server) cmdSearch(msg *Message) (res resp.Value, err error) {
|
|||
}
|
||||
sw.writeFoot()
|
||||
if msg.OutputType == JSON {
|
||||
wr.WriteString(`,"elapsed":"` + time.Now().Sub(start).String() + "\"}")
|
||||
wr.WriteString(`,"elapsed":"` + time.Since(start).String() + "\"}")
|
||||
return resp.BytesValue(wr.Bytes()), nil
|
||||
}
|
||||
return sw.respOut, nil
|
||||
|
|
|
@ -261,7 +261,7 @@ func Serve(host string, port int, dir string, http bool) error {
|
|||
if err := server.migrateAOF(); err != nil {
|
||||
return err
|
||||
}
|
||||
if core.AppendOnly == true {
|
||||
if core.AppendOnly {
|
||||
f, err := os.OpenFile(core.AppendFileName, os.O_CREATE|os.O_RDWR, 0600)
|
||||
if err != nil {
|
||||
return err
|
||||
|
@ -567,7 +567,7 @@ func (server *Server) watchAutoGC() {
|
|||
if autoGC == 0 {
|
||||
continue
|
||||
}
|
||||
if time.Now().Sub(s) < time.Second*time.Duration(autoGC) {
|
||||
if time.Since(s) < time.Second*time.Duration(autoGC) {
|
||||
continue
|
||||
}
|
||||
var mem1, mem2 runtime.MemStats
|
||||
|
@ -767,9 +767,9 @@ func (server *Server) handleInputCommand(client *Client, msg *Message) error {
|
|||
switch msg.OutputType {
|
||||
case JSON:
|
||||
if len(msg.Args) > 1 {
|
||||
return writeOutput(`{"ok":true,"` + msg.Command() + `":` + jsonString(msg.Args[1]) + `,"elapsed":"` + time.Now().Sub(start).String() + `"}`)
|
||||
return writeOutput(`{"ok":true,"` + msg.Command() + `":` + jsonString(msg.Args[1]) + `,"elapsed":"` + time.Since(start).String() + `"}`)
|
||||
}
|
||||
return writeOutput(`{"ok":true,"` + msg.Command() + `":"pong","elapsed":"` + time.Now().Sub(start).String() + `"}`)
|
||||
return writeOutput(`{"ok":true,"` + msg.Command() + `":"pong","elapsed":"` + time.Since(start).String() + `"}`)
|
||||
case RESP:
|
||||
if len(msg.Args) > 1 {
|
||||
data := redcon.AppendBulkString(nil, msg.Args[1])
|
||||
|
@ -784,7 +784,7 @@ func (server *Server) handleInputCommand(client *Client, msg *Message) error {
|
|||
writeErr := func(errMsg string) error {
|
||||
switch msg.OutputType {
|
||||
case JSON:
|
||||
return writeOutput(`{"ok":false,"err":` + jsonString(errMsg) + `,"elapsed":"` + time.Now().Sub(start).String() + "\"}")
|
||||
return writeOutput(`{"ok":false,"err":` + jsonString(errMsg) + `,"elapsed":"` + time.Since(start).String() + "\"}")
|
||||
case RESP:
|
||||
if errMsg == errInvalidNumberOfArguments.Error() {
|
||||
return writeOutput("-ERR wrong number of arguments for '" + msg.Command() + "' command\r\n")
|
||||
|
@ -1148,19 +1148,6 @@ password. NOTE: You only need to do one of the above things in order for the
|
|||
server to start accepting connections from the outside.
|
||||
`), "\n", " ", -1) + "\r\n")
|
||||
|
||||
// SetKeepAlive sets the connection keepalive
|
||||
func setKeepAlive(conn net.Conn, period time.Duration) error {
|
||||
if tcp, ok := conn.(*net.TCPConn); ok {
|
||||
if err := tcp.SetKeepAlive(true); err != nil {
|
||||
return err
|
||||
}
|
||||
return tcp.SetKeepAlivePeriod(period)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
var errCloseHTTP = errors.New("close http")
|
||||
|
||||
// WriteWebSocketMessage write a websocket message to an io.Writer.
|
||||
func WriteWebSocketMessage(w io.Writer, data []byte) error {
|
||||
var msg []byte
|
||||
|
@ -1189,7 +1176,7 @@ func WriteWebSocketMessage(w io.Writer, data []byte) error {
|
|||
func OKMessage(msg *Message, start time.Time) resp.Value {
|
||||
switch msg.OutputType {
|
||||
case JSON:
|
||||
return resp.StringValue(`{"ok":true,"elapsed":"` + time.Now().Sub(start).String() + "\"}")
|
||||
return resp.StringValue(`{"ok":true,"elapsed":"` + time.Since(start).String() + "\"}")
|
||||
case RESP:
|
||||
return resp.SimpleStringValue("OK")
|
||||
}
|
||||
|
@ -1513,3 +1500,11 @@ func (is *InputStream) End(data []byte) {
|
|||
is.b = is.b[:0]
|
||||
}
|
||||
}
|
||||
|
||||
// clientErrorf is the same as fmt.Errorf, but is intented for errors that are
|
||||
// sent back to the client. This allows for the Go static checker to ignore
|
||||
// throwing warning for certain error strings.
|
||||
// https://staticcheck.io/docs/checks#ST1005
|
||||
func clientErrorf(format string, args ...interface{}) error {
|
||||
return fmt.Errorf(format, args...)
|
||||
}
|
||||
|
|
|
@ -87,7 +87,7 @@ func (s *Server) cmdStats(msg *Message) (res resp.Value, err error) {
|
|||
if err != nil {
|
||||
return NOMessage, err
|
||||
}
|
||||
res = resp.StringValue(`{"ok":true,"stats":` + string(data) + `,"elapsed":"` + time.Now().Sub(start).String() + "\"}")
|
||||
res = resp.StringValue(`{"ok":true,"stats":` + string(data) + `,"elapsed":"` + time.Since(start).String() + "\"}")
|
||||
case RESP:
|
||||
res = resp.ArrayValue(vals)
|
||||
}
|
||||
|
@ -368,7 +368,7 @@ func (s *Server) writeInfoPersistence(w *bytes.Buffer) {
|
|||
if currentShrinkStart.IsZero() {
|
||||
fmt.Fprintf(w, "aof_current_rewrite_time_sec:0\r\n") // Duration of the on-going AOF rewrite operation if any
|
||||
} else {
|
||||
fmt.Fprintf(w, "aof_current_rewrite_time_sec:%d\r\n", time.Now().Sub(currentShrinkStart)/time.Second) // Duration of the on-going AOF rewrite operation if any
|
||||
fmt.Fprintf(w, "aof_current_rewrite_time_sec:%d\r\n", time.Since(currentShrinkStart)/time.Second) // Duration of the on-going AOF rewrite operation if any
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -477,7 +477,7 @@ func (s *Server) cmdInfo(msg *Message) (res resp.Value, err error) {
|
|||
if err != nil {
|
||||
return NOMessage, err
|
||||
}
|
||||
res = resp.StringValue(`{"ok":true,"info":` + string(data) + `,"elapsed":"` + time.Now().Sub(start).String() + "\"}")
|
||||
res = resp.StringValue(`{"ok":true,"info":` + string(data) + `,"elapsed":"` + time.Since(start).String() + "\"}")
|
||||
case RESP:
|
||||
res = resp.BytesValue(w.Bytes())
|
||||
}
|
||||
|
@ -514,28 +514,3 @@ func respValuesSimpleMap(m map[string]interface{}) []resp.Value {
|
|||
}
|
||||
return vals
|
||||
}
|
||||
|
||||
func (s *Server) statsCollections(line string) (string, error) {
|
||||
start := time.Now()
|
||||
var key string
|
||||
var ms = []map[string]interface{}{}
|
||||
for len(line) > 0 {
|
||||
line, key = token(line)
|
||||
col := s.getCol(key)
|
||||
if col != nil {
|
||||
m := make(map[string]interface{})
|
||||
points := col.PointCount()
|
||||
m["num_points"] = points
|
||||
m["in_memory_size"] = col.TotalWeight()
|
||||
m["num_objects"] = col.Count()
|
||||
ms = append(ms, m)
|
||||
} else {
|
||||
ms = append(ms, nil)
|
||||
}
|
||||
}
|
||||
data, err := json.Marshal(ms)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
return `{"ok":true,"stats":` + string(data) + `,"elapsed":"` + time.Now().Sub(start).String() + "\"}", nil
|
||||
}
|
||||
|
|
|
@ -269,6 +269,7 @@ func (s *Server) cmdTest(msg *Message) (res resp.Value, err error) {
|
|||
}
|
||||
if len(vs) != 0 {
|
||||
err = errInvalidNumberOfArguments
|
||||
return
|
||||
}
|
||||
|
||||
var result int
|
||||
|
@ -296,7 +297,7 @@ func (s *Server) cmdTest(msg *Message) (res resp.Value, err error) {
|
|||
if clipped != nil {
|
||||
buf.WriteString(`,"object":` + clipped.JSON())
|
||||
}
|
||||
buf.WriteString(`,"elapsed":"` + time.Now().Sub(start).String() + "\"}")
|
||||
buf.WriteString(`,"elapsed":"` + time.Since(start).String() + "\"}")
|
||||
return resp.StringValue(buf.String()), nil
|
||||
case RESP:
|
||||
if clipped != nil {
|
||||
|
|
|
@ -52,35 +52,6 @@ func tokenvalbytes(vs []string) (nvs []string, token []byte, ok bool) {
|
|||
return
|
||||
}
|
||||
|
||||
func tokenlc(line string) (newLine, token string) {
|
||||
for i := 0; i < len(line); i++ {
|
||||
ch := line[i]
|
||||
if ch == ' ' {
|
||||
return line[i+1:], line[:i]
|
||||
}
|
||||
if ch >= 'A' && ch <= 'Z' {
|
||||
lc := make([]byte, 0, 16)
|
||||
if i > 0 {
|
||||
lc = append(lc, []byte(line[:i])...)
|
||||
}
|
||||
lc = append(lc, ch+32)
|
||||
i++
|
||||
for ; i < len(line); i++ {
|
||||
ch = line[i]
|
||||
if ch == ' ' {
|
||||
return line[i+1:], string(lc)
|
||||
}
|
||||
if ch >= 'A' && ch <= 'Z' {
|
||||
lc = append(lc, ch+32)
|
||||
} else {
|
||||
lc = append(lc, ch)
|
||||
}
|
||||
}
|
||||
return "", string(lc)
|
||||
}
|
||||
}
|
||||
return "", line
|
||||
}
|
||||
func lcb(s1 []byte, s2 string) bool {
|
||||
if len(s1) != len(s2) {
|
||||
return false
|
||||
|
@ -144,19 +115,6 @@ func (where whereT) match(value float64) bool {
|
|||
return true
|
||||
}
|
||||
|
||||
func zMinMaxFromWheres(wheres []whereT) (minZ, maxZ float64) {
|
||||
for _, w := range wheres {
|
||||
if w.field == "z" {
|
||||
minZ = w.min
|
||||
maxZ = w.max
|
||||
return
|
||||
}
|
||||
}
|
||||
minZ = math.Inf(-1)
|
||||
maxZ = math.Inf(+1)
|
||||
return
|
||||
}
|
||||
|
||||
type whereinT struct {
|
||||
field string
|
||||
valMap map[float64]struct{}
|
||||
|
@ -230,7 +188,6 @@ type searchScanBaseTokens struct {
|
|||
cursor uint64
|
||||
output outputT
|
||||
precision uint64
|
||||
lineout string
|
||||
fence bool
|
||||
distance bool
|
||||
nodwell bool
|
||||
|
|
|
@ -1,76 +0,0 @@
|
|||
// Copyright 2011 The Go Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
// Package terminal provides support functions for dealing with terminals, as
|
||||
// commonly found on UNIX systems.
|
||||
//
|
||||
// Deprecated: this package moved to golang.org/x/term.
|
||||
package terminal
|
||||
|
||||
import (
|
||||
"io"
|
||||
|
||||
"golang.org/x/term"
|
||||
)
|
||||
|
||||
// EscapeCodes contains escape sequences that can be written to the terminal in
|
||||
// order to achieve different styles of text.
|
||||
type EscapeCodes = term.EscapeCodes
|
||||
|
||||
// Terminal contains the state for running a VT100 terminal that is capable of
|
||||
// reading lines of input.
|
||||
type Terminal = term.Terminal
|
||||
|
||||
// NewTerminal runs a VT100 terminal on the given ReadWriter. If the ReadWriter is
|
||||
// a local terminal, that terminal must first have been put into raw mode.
|
||||
// prompt is a string that is written at the start of each input line (i.e.
|
||||
// "> ").
|
||||
func NewTerminal(c io.ReadWriter, prompt string) *Terminal {
|
||||
return term.NewTerminal(c, prompt)
|
||||
}
|
||||
|
||||
// ErrPasteIndicator may be returned from ReadLine as the error, in addition
|
||||
// to valid line data. It indicates that bracketed paste mode is enabled and
|
||||
// that the returned line consists only of pasted data. Programs may wish to
|
||||
// interpret pasted data more literally than typed data.
|
||||
var ErrPasteIndicator = term.ErrPasteIndicator
|
||||
|
||||
// State contains the state of a terminal.
|
||||
type State = term.State
|
||||
|
||||
// IsTerminal returns whether the given file descriptor is a terminal.
|
||||
func IsTerminal(fd int) bool {
|
||||
return term.IsTerminal(fd)
|
||||
}
|
||||
|
||||
// ReadPassword reads a line of input from a terminal without local echo. This
|
||||
// is commonly used for inputting passwords and other sensitive data. The slice
|
||||
// returned does not include the \n.
|
||||
func ReadPassword(fd int) ([]byte, error) {
|
||||
return term.ReadPassword(fd)
|
||||
}
|
||||
|
||||
// MakeRaw puts the terminal connected to the given file descriptor into raw
|
||||
// mode and returns the previous state of the terminal so that it can be
|
||||
// restored.
|
||||
func MakeRaw(fd int) (*State, error) {
|
||||
return term.MakeRaw(fd)
|
||||
}
|
||||
|
||||
// Restore restores the terminal connected to the given file descriptor to a
|
||||
// previous state.
|
||||
func Restore(fd int, oldState *State) error {
|
||||
return term.Restore(fd, oldState)
|
||||
}
|
||||
|
||||
// GetState returns the current state of a terminal which may be useful to
|
||||
// restore the terminal after a signal.
|
||||
func GetState(fd int) (*State, error) {
|
||||
return term.GetState(fd)
|
||||
}
|
||||
|
||||
// GetSize returns the dimensions of the given terminal.
|
||||
func GetSize(fd int) (width, height int, err error) {
|
||||
return term.GetSize(fd)
|
||||
}
|
|
@ -174,13 +174,11 @@ github.com/yuin/gopher-lua
|
|||
github.com/yuin/gopher-lua/ast
|
||||
github.com/yuin/gopher-lua/parse
|
||||
github.com/yuin/gopher-lua/pm
|
||||
# golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad
|
||||
## explicit
|
||||
# golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a
|
||||
golang.org/x/crypto/ed25519
|
||||
golang.org/x/crypto/ed25519/internal/edwards25519
|
||||
golang.org/x/crypto/md4
|
||||
golang.org/x/crypto/pbkdf2
|
||||
golang.org/x/crypto/ssh/terminal
|
||||
# golang.org/x/net v0.0.0-20210119194325-5f4716e94777
|
||||
## explicit
|
||||
golang.org/x/net/context
|
||||
|
@ -198,6 +196,7 @@ golang.org/x/sys/plan9
|
|||
golang.org/x/sys/unix
|
||||
golang.org/x/sys/windows
|
||||
# golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1
|
||||
## explicit
|
||||
golang.org/x/term
|
||||
# golang.org/x/text v0.3.3
|
||||
golang.org/x/text/secure/bidirule
|
||||
|
|
Loading…
Reference in New Issue