Skip to content

Commit 4db0dda

Browse files
committed
init commit
0 parents  commit 4db0dda

11 files changed

+318
-0
lines changed

.gitignore

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
/.idea
2+
3+
/buntdb-cli
4+
/vendor
5+
/.coverage
6+
/coverage.html

Makefile

+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
flags = "-X main.COMMIT=`git rev-parse --short HEAD` -X 'main.GOVERSION=`go version`'"
2+
package = buntdb-cli
3+
cov = .coverage
4+
SRC = $(wildcard db/*.go ./*.go)
5+
6+
build : $(package)
7+
test : $(cov)
8+
cov: $(cov)
9+
go tool cover -html=$(cov)
10+
11+
$(package): $(SRC)
12+
go build -ldflags $(flags)
13+
14+
.DELETE_ON_ERROR:
15+
$(cov): $(SRC)
16+
go test -cover -coverprofile=$(cov) ./...
17+
18+
19+
.PHONY : clean
20+
clean :
21+
-rm -f $(package) $(cov)

README.md

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
# Buntdb-cli
2+
3+
### WIP

completer.go

+54
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package main
2+
3+
import (
4+
"github.com/c-bata/go-prompt"
5+
"strings"
6+
)
7+
8+
func buntdbCompleter(d prompt.Document) []prompt.Suggest {
9+
if d.TextBeforeCursor() == "" {
10+
return []prompt.Suggest{}
11+
}
12+
args := strings.Split(d.TextBeforeCursor(), " ")
13+
if len(args) == 1 {
14+
// input command
15+
return cmdCompleter(args[0], true)
16+
} else {
17+
return optionCompleter(args[0], args[1:])
18+
}
19+
}
20+
21+
func cmdCompleter(cmd string, help bool) []prompt.Suggest {
22+
cmds := []prompt.Suggest{
23+
{Text: "get", Description: "get command"},
24+
{Text: "set", Description: "set command"},
25+
{Text: "del", Description: "del command"},
26+
{Text: "show", Description: "show info"},
27+
{Text: "scan", Description: "iterate keys"},
28+
{Text: "use", Description: "change db"},
29+
}
30+
if help {
31+
cmds = append(cmds, prompt.Suggest{Text: "help", Description: "show help for command"})
32+
}
33+
return prompt.FilterHasPrefix(cmds, cmd, true)
34+
}
35+
36+
func optionCompleter(cmd string, args []string) []prompt.Suggest {
37+
last := args[len(args)-1]
38+
switch cmd {
39+
case "get":
40+
case "set":
41+
case "del":
42+
case "show":
43+
return []prompt.Suggest{
44+
{Text: "index"},
45+
{Text: "db"},
46+
}
47+
case "scan":
48+
case "help":
49+
return cmdCompleter(last, false)
50+
default:
51+
return []prompt.Suggest{}
52+
}
53+
return []prompt.Suggest{}
54+
}

db/buntdb.go

+44
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package db
2+
3+
import (
4+
"errors"
5+
"github.com/tidwall/buntdb"
6+
)
7+
8+
var db *buntdb.DB
9+
10+
var dbpath string
11+
12+
func InitBuntDB(filename string) error {
13+
buntDB, err := buntdb.Open(filename)
14+
if err != nil {
15+
return err
16+
}
17+
db = buntDB
18+
db.SetConfig(buntdb.Config{
19+
SyncPolicy: buntdb.Always,
20+
})
21+
dbpath = filename
22+
return nil
23+
}
24+
25+
func GetClient() (*buntdb.DB, error) {
26+
if db == nil {
27+
return nil, errors.New("not initialized")
28+
}
29+
return db, nil
30+
}
31+
32+
func GetDbPath() string {
33+
return dbpath
34+
}
35+
36+
func Close() error {
37+
if db != nil {
38+
if err := db.Close(); err != nil {
39+
return err
40+
}
41+
db = nil
42+
}
43+
return nil
44+
}

db/buntdb_test.go

+37
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package db
2+
3+
import (
4+
"github.com/stretchr/testify/assert"
5+
"os"
6+
"testing"
7+
)
8+
9+
var testDb = ".test"
10+
11+
func TestInitBuntDB(t *testing.T) {
12+
assert.Nil(t, InitBuntDB(testDb))
13+
assert.Nil(t, Close())
14+
os.Remove(testDb)
15+
}
16+
17+
func TestGetClient(t *testing.T) {
18+
db, err := GetClient()
19+
assert.NotNil(t, err)
20+
assert.Nil(t, db)
21+
22+
InitBuntDB(testDb)
23+
defer os.Remove(testDb)
24+
defer Close()
25+
26+
db, err = GetClient()
27+
assert.Nil(t, err)
28+
assert.NotNil(t, db)
29+
30+
assert.Equal(t, GetDbPath(), testDb)
31+
}
32+
33+
func TestGetDbPath(t *testing.T) {
34+
InitBuntDB(testDb)
35+
defer os.Remove(testDb)
36+
defer Close()
37+
}

executor.go

+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package main
2+
3+
import (
4+
"fmt"
5+
"runtime"
6+
"strings"
7+
)
8+
9+
func buntdbExecutor(s string) {
10+
s = strings.TrimSpace(s)
11+
if s == "" {
12+
return
13+
} else if s == "quit" || s == "exit" {
14+
fmt.Println("bye")
15+
runtime.Goexit()
16+
}
17+
fmt.Println("got", s)
18+
}

go.mod

+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
module github.com/Sora233/buntdb-cli
2+
3+
go 1.15
4+
5+
require (
6+
github.com/alecthomas/kong v0.2.12
7+
github.com/c-bata/go-prompt v0.2.5
8+
github.com/mattn/go-colorable v0.1.8 // indirect
9+
github.com/pkg/errors v0.9.1 // indirect
10+
github.com/stretchr/testify v1.2.2
11+
github.com/tidwall/buntdb v1.1.6
12+
golang.org/x/sys v0.0.0-20210108172913-0df2131ae363 // indirect
13+
)

go.sum

+57
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
github.com/alecthomas/kong v0.2.12 h1:X3kkCOXGUNzLmiu+nQtoxWqj4U2a39MpSJR3QdQXOwI=
2+
github.com/alecthomas/kong v0.2.12/go.mod h1:kQOmtJgV+Lb4aj+I2LEn40cbtawdWJ9Y8QLq+lElKxE=
3+
github.com/c-bata/go-prompt v0.2.5 h1:3zg6PecEywxNn0xiqcXHD96fkbxghD+gdB2tbsYfl+Y=
4+
github.com/c-bata/go-prompt v0.2.5/go.mod h1:vFnjEGDIIA/Lib7giyE4E9c50Lvl8j0S+7FVlAwDAVw=
5+
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
6+
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
7+
github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
8+
github.com/mattn/go-colorable v0.1.7 h1:bQGKb3vps/j0E9GfJQ03JyhRuxsvdAanXlT9BTw3mdw=
9+
github.com/mattn/go-colorable v0.1.7/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
10+
github.com/mattn/go-colorable v0.1.8 h1:c1ghPdyEDarC70ftn0y+A/Ee++9zz8ljHG1b13eJ0s8=
11+
github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
12+
github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
13+
github.com/mattn/go-isatty v0.0.10/go.mod h1:qgIWMr58cqv1PHHyhnkY9lrL7etaEgOFcMEpPG5Rm84=
14+
github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY=
15+
github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
16+
github.com/mattn/go-runewidth v0.0.6/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
17+
github.com/mattn/go-runewidth v0.0.9 h1:Lm995f3rfxdpd6TSmuVCHVb/QhupuXlYr8sCI/QdE+0=
18+
github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI=
19+
github.com/mattn/go-tty v0.0.3 h1:5OfyWorkyO7xP52Mq7tB36ajHDG5OHrmBGIS/DtakQI=
20+
github.com/mattn/go-tty v0.0.3/go.mod h1:ihxohKRERHTVzN+aSVRwACLCeqIoZAWpoICkkvrWyR0=
21+
github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=
22+
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
23+
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
24+
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
25+
github.com/pkg/term v1.1.0 h1:xIAAdCMh3QIAy+5FrE8Ad8XoDhEU4ufwbaSozViP9kk=
26+
github.com/pkg/term v1.1.0/go.mod h1:E25nymQcrSllhX42Ok8MRm1+hyBdHY0dCeiKZ9jpNGw=
27+
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
28+
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
29+
github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w=
30+
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
31+
github.com/tidwall/btree v0.3.0 h1:LcwmLI5kv+AaH/xnBgOuKfbu5eLBWVdWTpD2o+qSRdU=
32+
github.com/tidwall/btree v0.3.0/go.mod h1:huei1BkDWJ3/sLXmO+bsCNELL+Bp2Kks9OLyQFkzvA8=
33+
github.com/tidwall/buntdb v1.1.6 h1:GMBmFMOjk4F32KzQ8hA6HKxYpVzMxW1Tc74G7Pgt+U8=
34+
github.com/tidwall/buntdb v1.1.6/go.mod h1:DqVwIsd7QCInPKRxgr03w165FBuvjLClDy8DrJ+sXJE=
35+
github.com/tidwall/gjson v1.6.7 h1:Mb1M9HZCRWEcXQ8ieJo7auYyyiSux6w9XN3AdTpxJrE=
36+
github.com/tidwall/gjson v1.6.7/go.mod h1:zeFuBCIqD4sN/gmqBzZ4j7Jd6UcA2Fc56x7QFsv+8fI=
37+
github.com/tidwall/grect v0.0.0-20161006141115-ba9a043346eb h1:5NSYaAdrnblKByzd7XByQEJVT8+9v0W/tIY0Oo4OwrE=
38+
github.com/tidwall/grect v0.0.0-20161006141115-ba9a043346eb/go.mod h1:lKYYLFIr9OIgdgrtgkZ9zgRxRdvPYsExnYBsEAd8W5M=
39+
github.com/tidwall/match v1.0.3 h1:FQUVvBImDutD8wJLN6c5eMzWtjgONK9MwIBCOrUJKeE=
40+
github.com/tidwall/match v1.0.3/go.mod h1:eRSPERbgtNPcGhD8UCthc6PmLEQXEWd3PRB5JTxsfmM=
41+
github.com/tidwall/pretty v1.0.2 h1:Z7S3cePv9Jwm1KwS0513MRaoUe3S01WPbLNV40pwWZU=
42+
github.com/tidwall/pretty v1.0.2/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk=
43+
github.com/tidwall/rtree v0.0.0-20201103190202-0d877048965d h1:RfyBHwIzDt48a28uBzW+W+6rvTJzuYH9OpXBru+CDeo=
44+
github.com/tidwall/rtree v0.0.0-20201103190202-0d877048965d/go.mod h1:/h+UnNGt0IhNNJLkGikcdcJqm66zGD/uJGMRxK/9+Ao=
45+
github.com/tidwall/tinyqueue v0.0.0-20180302190814-1e39f5511563 h1:Otn9S136ELckZ3KKDyCkxapfufrqDqwmGjcHfAyXRrE=
46+
github.com/tidwall/tinyqueue v0.0.0-20180302190814-1e39f5511563/go.mod h1:mLqSmt7Dv/CNneF2wfcChfN1rvapyQr01LGKnKex0DQ=
47+
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
48+
golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
49+
golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
50+
golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
51+
golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
52+
golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
53+
golang.org/x/sys v0.0.0-20200909081042-eff7692f9009/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
54+
golang.org/x/sys v0.0.0-20200918174421-af09f7315aff h1:1CPUrky56AcgSpxz/KfgzQWzfG09u5YOL8MvPYBlrL8=
55+
golang.org/x/sys v0.0.0-20200918174421-af09f7315aff/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
56+
golang.org/x/sys v0.0.0-20210108172913-0df2131ae363 h1:wHn06sgWHMO1VsQ8F+KzDJx/JzqfsNLnc+oEi07qD7s=
57+
golang.org/x/sys v0.0.0-20210108172913-0df2131ae363/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=

main.go

+39
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package main
2+
3+
import (
4+
"github.com/Sora233/buntdb-cli/db"
5+
"github.com/alecthomas/kong"
6+
"github.com/c-bata/go-prompt"
7+
"io/ioutil"
8+
"os"
9+
"path"
10+
)
11+
12+
var CLI struct {
13+
Path string `arg:"" optional:"" help:"buntudb file path, default a tempfile"`
14+
Version version `optional:"" short:"v" help:"print version"`
15+
}
16+
17+
func main() {
18+
kong.Parse(&CLI, kong.UsageOnError(), kong.Name("buntdb-cli"))
19+
defer os.Exit(0)
20+
21+
if CLI.Path == "" {
22+
f, err := ioutil.TempFile("", "buntdb-cli")
23+
if err != nil {
24+
}
25+
f.Close()
26+
CLI.Path = f.Name()
27+
defer os.Remove(f.Name())
28+
}
29+
db.InitBuntDB(CLI.Path)
30+
defer db.Close()
31+
32+
p := prompt.New(
33+
buntdbExecutor,
34+
buntdbCompleter,
35+
prompt.OptionTitle("buntdb-cli: an interactive buntdb shell client"),
36+
prompt.OptionPrefix(path.Base(CLI.Path)+">"),
37+
)
38+
p.Run()
39+
}

version.go

+26
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package main
2+
3+
import (
4+
"fmt"
5+
"github.com/alecthomas/kong"
6+
"io"
7+
)
8+
9+
// COMMIT is set when build
10+
var COMMIT = ""
11+
var GOVERSION = ""
12+
13+
type version bool
14+
15+
// BeforeApply impl a kong hook
16+
func (v version) BeforeApply(ctx *kong.Context) error {
17+
if GOVERSION == "" {
18+
GOVERSION = "Unknown"
19+
}
20+
if COMMIT == "" {
21+
COMMIT = "Unknown"
22+
}
23+
io.WriteString(ctx.Stdout, fmt.Sprintf("COMMIT: %v\nGO VERSION: %v\n", COMMIT, GOVERSION))
24+
ctx.Exit(0)
25+
return nil
26+
}

0 commit comments

Comments
 (0)