2023-08-28 14:51:31 +08:00

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
}