diff --git a/go.mod b/go.mod index 6a98db1..196de7b 100644 --- a/go.mod +++ b/go.mod @@ -5,9 +5,13 @@ go 1.17 require ( github.com/eclipse/paho.mqtt.golang v1.2.0 github.com/gin-gonic/gin v1.7.4 + github.com/gofrs/uuid v3.3.0+incompatible github.com/gomodule/redigo v1.8.5 github.com/hashicorp/consul/api v1.10.1 github.com/influxdata/influxdb v1.9.5 + github.com/sirupsen/logrus v1.7.0 + github.com/stretchr/testify v1.7.0 + github.com/syndtr/goleveldb v1.0.0 go.mongodb.org/mongo-driver v1.7.4 google.golang.org/grpc v1.41.0 gorm.io/driver/mysql v1.1.2 @@ -18,6 +22,7 @@ require ( require ( github.com/armon/go-metrics v0.3.3 // indirect + github.com/davecgh/go-spew v1.1.1 // indirect github.com/fatih/color v1.9.0 // indirect github.com/gin-contrib/sse v0.1.0 // indirect github.com/go-playground/locales v0.14.0 // indirect @@ -47,6 +52,7 @@ require ( github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect github.com/modern-go/reflect2 v1.0.2 // indirect github.com/pkg/errors v0.9.1 // indirect + github.com/pmezard/go-difflib v1.0.0 // indirect github.com/ugorji/go/codec v1.2.6 // indirect github.com/xdg-go/pbkdf2 v1.0.0 // indirect github.com/xdg-go/scram v1.0.2 // indirect @@ -60,4 +66,5 @@ require ( google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83 // indirect google.golang.org/protobuf v1.27.1 // indirect gopkg.in/yaml.v2 v2.4.0 // indirect + gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b // indirect ) diff --git a/leveldb/config.go b/leveldb/config.go new file mode 100644 index 0000000..31713cf --- /dev/null +++ b/leveldb/config.go @@ -0,0 +1,5 @@ +package leveldb + +type Config struct { + Path string +} diff --git a/leveldb/leveldb.go b/leveldb/leveldb.go new file mode 100644 index 0000000..9ba9ffe --- /dev/null +++ b/leveldb/leveldb.go @@ -0,0 +1,111 @@ +package leveldb + +import ( + "errors" + + "github.com/syndtr/goleveldb/leveldb" + "github.com/syndtr/goleveldb/leveldb/opt" +) + +var _db *leveldb.DB +var config *Config + +func Init(conf *Config) { + if conf == nil { + conf = &Config{ + Path: "./", + } + } +} + +func New() (*leveldb.DB, error) { + if _db != nil { + return _db, nil + } + db, err := leveldb.OpenFile(config.Path, nil) + if err != nil { + return nil, err + } + _db = db + return _db, nil +} + +func Close() { + if _db != nil { + _db.Close() + } + _db = nil +} + +func Get(key, reqid *string) (*[]byte, error) { + db, err := New() + if err != nil { + return nil, err + } + if db == nil { + return nil, errors.New("leveldb is nil") + } + ret, err := db.Has([]byte(*key), &opt.ReadOptions{ + DontFillCache: false, + Strict: 0, + }) + if err != nil { + return nil, errors.New("key检查异常") + } + + if !ret { + return nil, errors.New("key不存在") + } + + val, err := db.Get([]byte(*key), nil) + if err != nil { + return nil, err + } + + if len(val) == 0 { + return nil, errors.New("key empty") + } + return &val, nil +} + +func Put(key *string, payload *[]byte) error { + db, err := New() + if err != nil { + return err + } + if db == nil { + return errors.New("leveldb is busy now") + } + + if err := db.Put([]byte(*key), *payload, nil); err != nil { + return err + } + return nil +} + +func Delete(key *string) error { + db, err := New() + if err != nil { + return err + } + if db == nil { + return errors.New("leveldb is busy now") + } + + ret, err := db.Has([]byte(*key), &opt.ReadOptions{ + DontFillCache: false, + Strict: 0, + }) + if err != nil { + return err + } + + if !ret { + return nil + } + + if err := db.Delete([]byte(*key), nil); err != nil { + return err + } + return nil +} diff --git a/test/sqlite_test.go b/test/sqlite_test.go index 631942b..c43b39f 100644 --- a/test/sqlite_test.go +++ b/test/sqlite_test.go @@ -5,6 +5,7 @@ import ( "math/rand" "testing" + "github.com/stretchr/testify/assert" "myschools.me/suguo/snippet/sqlite" ) @@ -22,22 +23,17 @@ type CBA struct { func TestSqlite(t *testing.T) { conf := &sqlite.Config{ - DBFile: "tmp1/abc/aaaaa/abc.db", + DBFile: "tmp/abc.db", } if err := sqlite.Init(conf); err != nil { - t.Fatal(err) + assert.Nil(t, err) } db, err := sqlite.New() - if err != nil { - t.Fatal(err) - } - - if db == nil { - t.Error("DB nil") - } + assert.Nil(t, err) + assert.NotNil(t, db) if err := sqlite.Migrate(&ABC{}, &CBA{}); err != nil { - t.Fatal(err) + assert.Nil(t, err) } }