mirror of
https://git.mills.io/kayos/bitraft.git
synced 2024-06-27 09:19:00 +00:00
parent
4eb73c203a
commit
1eb412ca8b
@ -45,7 +45,7 @@ Commands:
|
|||||||
SET key value
|
SET key value
|
||||||
GET key
|
GET key
|
||||||
DEL key [key ...]
|
DEL key [key ...]
|
||||||
KEYS [WITHVALUES]
|
KEYS pattern
|
||||||
FLUSHDB
|
FLUSHDB
|
||||||
SHUTDOWN
|
SHUTDOWN
|
||||||
```
|
```
|
||||||
|
1
go.sum
1
go.sum
@ -186,6 +186,7 @@ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZN
|
|||||||
github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=
|
github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI=
|
||||||
github.com/prologic/bitcask v0.3.9 h1:GuSlzUUiIwyCOV4za7LipfjJC9FV0BgHIGbwOEcssL0=
|
github.com/prologic/bitcask v0.3.9 h1:GuSlzUUiIwyCOV4za7LipfjJC9FV0BgHIGbwOEcssL0=
|
||||||
github.com/prologic/bitcask v0.3.9/go.mod h1:WQuqL23CGZcC83DhKuXH6KMHe1m25+Eb43s8yM3MnF0=
|
github.com/prologic/bitcask v0.3.9/go.mod h1:WQuqL23CGZcC83DhKuXH6KMHe1m25+Eb43s8yM3MnF0=
|
||||||
|
github.com/prologic/bitcask v0.3.10 h1:HXygU8zCvW5gLpZ8aQECPk5iV/YQ3hcqdg/zVeES6s0=
|
||||||
github.com/prologic/bitcask v0.3.10/go.mod h1:8RKJdbHLE7HFGLYSGu9slnYXSV7DMIucwVkaIYOk9GY=
|
github.com/prologic/bitcask v0.3.10/go.mod h1:8RKJdbHLE7HFGLYSGu9slnYXSV7DMIucwVkaIYOk9GY=
|
||||||
github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
|
github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
|
||||||
github.com/prometheus/client_golang v0.9.2/go.mod h1:OsXs2jCmiKlQ1lTBmv21f2mNfw4xf/QclQDMrYNZzcM=
|
github.com/prometheus/client_golang v0.9.2/go.mod h1:OsXs2jCmiKlQ1lTBmv21f2mNfw4xf/QclQDMrYNZzcM=
|
||||||
|
78
server.go
78
server.go
@ -5,6 +5,10 @@ import (
|
|||||||
"compress/gzip"
|
"compress/gzip"
|
||||||
"encoding/binary"
|
"encoding/binary"
|
||||||
"errors"
|
"errors"
|
||||||
|
"github.com/prologic/bitcask"
|
||||||
|
log "github.com/sirupsen/logrus"
|
||||||
|
"github.com/tidwall/finn"
|
||||||
|
"github.com/tidwall/redcon"
|
||||||
"io"
|
"io"
|
||||||
"net"
|
"net"
|
||||||
"os"
|
"os"
|
||||||
@ -13,19 +17,47 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/prologic/bitcask"
|
|
||||||
log "github.com/sirupsen/logrus"
|
|
||||||
"github.com/tidwall/finn"
|
|
||||||
"github.com/tidwall/redcon"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
const defaultTCPKeepAlive = time.Minute * 5
|
const defaultTCPKeepAlive = time.Minute * 5
|
||||||
|
|
||||||
var (
|
var (
|
||||||
errSyntaxError = errors.New("syntax error")
|
errWrongNumberOfArguments = errors.New("wrong number of arguments")
|
||||||
)
|
)
|
||||||
|
|
||||||
|
func trimPattern(glob string) string {
|
||||||
|
escaped := false
|
||||||
|
pattern := ""
|
||||||
|
for _, char := range glob {
|
||||||
|
switch char {
|
||||||
|
case '\\':
|
||||||
|
escaped = !escaped
|
||||||
|
if !escaped {
|
||||||
|
pattern = pattern + string(char)
|
||||||
|
}
|
||||||
|
case '*':
|
||||||
|
if !escaped {
|
||||||
|
goto out
|
||||||
|
}
|
||||||
|
pattern = pattern + string(char)
|
||||||
|
case '?':
|
||||||
|
if !escaped {
|
||||||
|
goto out
|
||||||
|
}
|
||||||
|
pattern = pattern + string(char)
|
||||||
|
case '[':
|
||||||
|
if !escaped {
|
||||||
|
goto out
|
||||||
|
}
|
||||||
|
pattern = pattern + string(char)
|
||||||
|
default:
|
||||||
|
pattern = pattern + string(char)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
out:
|
||||||
|
return pattern
|
||||||
|
}
|
||||||
|
|
||||||
func ListenAndServe(addr, join, dir, logdir string, consistency, durability finn.Level) error {
|
func ListenAndServe(addr, join, dir, logdir string, consistency, durability finn.Level) error {
|
||||||
opts := finn.Options{
|
opts := finn.Options{
|
||||||
Backend: finn.FastLog,
|
Backend: finn.FastLog,
|
||||||
@ -339,46 +371,28 @@ func (kvm *Machine) cmdDel(m finn.Applier, conn redcon.Conn, cmd redcon.Command)
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (kvm *Machine) cmdKeys(m finn.Applier, conn redcon.Conn, cmd redcon.Command) (interface{}, error) {
|
func (kvm *Machine) cmdKeys(m finn.Applier, conn redcon.Conn, cmd redcon.Command) (interface{}, error) {
|
||||||
var withvalues bool
|
if len(cmd.Args) != 2 {
|
||||||
for i := 1; i < len(cmd.Args); i++ {
|
return nil, errWrongNumberOfArguments
|
||||||
switch strings.ToLower(string(cmd.Args[i])) {
|
|
||||||
default:
|
|
||||||
return nil, errSyntaxError
|
|
||||||
case "withvalues":
|
|
||||||
withvalues = true
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
pattern := string(cmd.Args[1])
|
||||||
|
scanPattern := trimPattern(pattern)
|
||||||
return m.Apply(conn, cmd, nil,
|
return m.Apply(conn, cmd, nil,
|
||||||
func(interface{}) (interface{}, error) {
|
func(interface{}) (interface{}, error) {
|
||||||
kvm.mu.RLock()
|
kvm.mu.RLock()
|
||||||
defer kvm.mu.RUnlock()
|
defer kvm.mu.RUnlock()
|
||||||
var keys [][]byte
|
var keys [][]byte
|
||||||
var values [][]byte
|
err := kvm.db.Scan([]byte(scanPattern), func(key []byte) error {
|
||||||
|
if ok, _ := filepath.Match(pattern, string(key)); ok {
|
||||||
err := kvm.db.Fold(func(key []byte) error {
|
keys = append(keys, []byte(key))
|
||||||
keys = append(keys, []byte(key))
|
|
||||||
if withvalues {
|
|
||||||
value, err := kvm.db.Get(key)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
values = append(values, value)
|
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
if withvalues {
|
conn.WriteArray(len(keys))
|
||||||
conn.WriteArray(len(keys) * 2)
|
|
||||||
} else {
|
|
||||||
conn.WriteArray(len(keys))
|
|
||||||
}
|
|
||||||
for i := 0; i < len(keys); i++ {
|
for i := 0; i < len(keys); i++ {
|
||||||
conn.WriteBulk(keys[i])
|
conn.WriteBulk(keys[i])
|
||||||
if withvalues {
|
|
||||||
conn.WriteBulk(values[i])
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return nil, nil
|
return nil, nil
|
||||||
},
|
},
|
||||||
|
Loading…
Reference in New Issue
Block a user