mirror of
https://gitee.com/winc-link/hummingbird.git
synced 2025-04-21 08:52:42 +00:00
101 lines
2.5 KiB
Go
101 lines
2.5 KiB
Go
package leveldb
|
|
|
|
import (
|
|
"github.com/winc-link/hummingbird/internal/pkg/errort"
|
|
"github.com/winc-link/hummingbird/internal/pkg/logger"
|
|
"os"
|
|
|
|
"github.com/syndtr/goleveldb/leveldb"
|
|
"github.com/syndtr/goleveldb/leveldb/opt"
|
|
//"gitlab.com/tedge/edgex/internal/pkg/errort"
|
|
//"gitlab.com/tedge/edgex/internal/pkg/logger"
|
|
)
|
|
|
|
type DriverStorageClient struct {
|
|
client *leveldb.DB
|
|
loggingClient logger.LoggingClient
|
|
}
|
|
|
|
func NewDriverStorageClient(filePath, subPath string, lc logger.LoggingClient) (*DriverStorageClient, error) {
|
|
_, fileErr := os.Stat(filePath)
|
|
if fileErr != nil || !os.IsExist(fileErr) {
|
|
err := os.MkdirAll(filePath, os.ModePerm)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
}
|
|
var (
|
|
err error
|
|
client *leveldb.DB
|
|
)
|
|
|
|
if client, err = leveldb.OpenFile(filePath+subPath, nil); err != nil {
|
|
lc.Errorf("leveldb openFile error: %s", err)
|
|
return nil, err
|
|
}
|
|
lc.Infof("driver storage create path: %s, driver service id: %s", filePath+subPath, subPath)
|
|
return &DriverStorageClient{
|
|
client: client,
|
|
loggingClient: lc,
|
|
}, nil
|
|
}
|
|
|
|
func (dsc *DriverStorageClient) CloseSession() {
|
|
dsc.client.Close()
|
|
}
|
|
|
|
func (dsc *DriverStorageClient) All() (map[string][]byte, error) {
|
|
kvs := make(map[string][]byte)
|
|
iter := dsc.client.NewIterator(nil, &opt.ReadOptions{
|
|
DontFillCache: true,
|
|
})
|
|
for iter.Next() {
|
|
value, _ := dsc.client.Get(iter.Key(), nil)
|
|
kvs[string(iter.Key())] = value
|
|
}
|
|
iter.Release()
|
|
return kvs, iter.Error()
|
|
}
|
|
|
|
func (dsc *DriverStorageClient) Get(keys []string) (map[string][]byte, error) {
|
|
kvs := make(map[string][]byte, len(keys))
|
|
for _, key := range keys {
|
|
value, err := dsc.client.Get([]byte(key), nil)
|
|
if err != nil {
|
|
dsc.loggingClient.Error("get value with key(%s) error: %s", keys, err)
|
|
kvs[key] = []byte("")
|
|
continue
|
|
}
|
|
kvs[key] = value
|
|
}
|
|
return kvs, nil
|
|
}
|
|
|
|
func (dsc *DriverStorageClient) Put(kvs map[string][]byte) error {
|
|
batch := new(leveldb.Batch)
|
|
defer batch.Reset()
|
|
|
|
for k, v := range kvs {
|
|
batch.Put([]byte(k), v)
|
|
}
|
|
if err := dsc.client.Write(batch, &opt.WriteOptions{
|
|
NoWriteMerge: true,
|
|
Sync: true,
|
|
}); err != nil {
|
|
return errort.NewCommonEdgeX(errort.KindDatabaseError, "batch transaction write", err)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (dsc *DriverStorageClient) Delete(keys []string) error {
|
|
batch := new(leveldb.Batch)
|
|
defer batch.Reset()
|
|
for _, key := range keys {
|
|
batch.Delete([]byte(key))
|
|
}
|
|
if err := dsc.client.Write(batch, nil); err != nil {
|
|
return errort.NewCommonEdgeX(errort.KindDatabaseError, "batch transaction delete failed", err)
|
|
}
|
|
return nil
|
|
}
|