Code cleanup

- Removed unused functions and variables
- Wrapped client formatted errors
- Updated deprecated packages
- Changed suggested code patterns
This commit is contained in:
tidwall 2021-03-31 08:13:44 -07:00
parent e1d9756c6d
commit 6b08f7fa9e
40 changed files with 128 additions and 392 deletions

2
go.mod
View File

@ -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
View File

@ -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=

View File

@ -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
}

View File

@ -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},

View File

@ -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{

View File

@ -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}))

View File

@ -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()
}

View File

@ -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()
}

View File

@ -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()
}

View File

@ -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()
}

View File

@ -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

View File

@ -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
}

View File

@ -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()
}

View File

@ -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()
}

View File

@ -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()
}

View File

@ -62,7 +62,6 @@ type qnode struct {
type queue struct {
nodes []qnode
len int
size int
}
func (q *queue) push(unix int64, item Item) {

View File

@ -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
}

View File

@ -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)
}

View File

@ -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"))
}

View File

@ -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)...)

View File

@ -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
}
*/

View File

@ -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()
}

View File

@ -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
}

View File

@ -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)

View File

@ -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
}

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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
}

View File

@ -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)

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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...)
}

View File

@ -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
}

View File

@ -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 {

View File

@ -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

View File

@ -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)
}

5
vendor/modules.txt vendored
View File

@ -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