You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
160 lines
3.1 KiB
160 lines
3.1 KiB
package leveldb
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"github.com/syndtr/goleveldb/leveldb"
|
|
"github.com/syndtr/goleveldb/leveldb/filter"
|
|
"github.com/syndtr/goleveldb/leveldb/opt"
|
|
"wallet-system/internal/pkg/logging/applogger"
|
|
)
|
|
|
|
type LevelDB struct {
|
|
DB *leveldb.DB
|
|
}
|
|
|
|
// NewLevelDB
|
|
//
|
|
// @Description:
|
|
// @param name
|
|
// @return *LevelDB
|
|
// @return error
|
|
func NewLevelDB(name string) (*LevelDB, error) {
|
|
ldb := new(LevelDB)
|
|
o := &opt.Options{
|
|
Filter: filter.NewBloomFilter(10),
|
|
}
|
|
|
|
db, err := leveldb.OpenFile(fmt.Sprintf("../wallet/%v", name), o)
|
|
if err != nil {
|
|
applogger.Error("openFile err:", err)
|
|
return nil, err
|
|
}
|
|
|
|
ldb.DB = db
|
|
|
|
return ldb, nil
|
|
}
|
|
|
|
// WriteDB
|
|
//
|
|
// @Description:
|
|
// @receiver d
|
|
// @param ctx
|
|
// @param key
|
|
// @param value
|
|
// @return error
|
|
func (d *LevelDB) WriteDB(ctx context.Context, key string, value []byte) error {
|
|
batch := new(leveldb.Batch)
|
|
batch.Put([]byte(key), value)
|
|
if err := d.DB.Write(batch, nil); err != nil {
|
|
applogger.Error("write err:", err)
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// ReadWalletAddrList
|
|
//
|
|
// @Description:
|
|
// @receiver d
|
|
// @param ctx
|
|
// @return []string
|
|
// @return error
|
|
func (d *LevelDB) ReadWalletAddrList(ctx context.Context) ([]string, error) {
|
|
var addressList []string
|
|
iter := d.DB.NewIterator(nil, nil)
|
|
for iter.Next() {
|
|
key := iter.Key()
|
|
addressList = append(addressList, string(key))
|
|
}
|
|
iter.Release()
|
|
if err := iter.Error(); err != nil {
|
|
applogger.Error("iter.Error:", err)
|
|
return addressList, err
|
|
}
|
|
|
|
return addressList, nil
|
|
}
|
|
|
|
// ReadWalletAddressPrivateKeyList
|
|
//
|
|
// @Description:
|
|
// @receiver d
|
|
// @param ctx
|
|
// @return map[string][]byte
|
|
// @return error
|
|
func (d *LevelDB) ReadWalletAddressPrivateKeyList(ctx context.Context) (map[string][]byte, error) {
|
|
addrMap := make(map[string][]byte)
|
|
iter := d.DB.NewIterator(nil, nil)
|
|
for iter.Next() {
|
|
key := iter.Key()
|
|
value := iter.Value()
|
|
addrMap[string(key)] = value
|
|
}
|
|
iter.Release()
|
|
if err := iter.Error(); err != nil {
|
|
applogger.Error("iter.Error:%v", err)
|
|
return addrMap, err
|
|
}
|
|
|
|
return addrMap, nil
|
|
}
|
|
|
|
// ReadPrivateKeyByAddress
|
|
//
|
|
// @Description:
|
|
// @receiver d
|
|
// @param ctx
|
|
// @param address
|
|
// @return []byte
|
|
// @return error
|
|
func (d *LevelDB) ReadPrivateKeyByAddress(ctx context.Context, address string) ([]byte, error) {
|
|
data, err := d.DB.Get([]byte(address), nil)
|
|
if err != nil {
|
|
applogger.Error("ReadPrivateKeyByAddress.Get:%v", err)
|
|
return []byte{}, err
|
|
}
|
|
|
|
return data, nil
|
|
}
|
|
|
|
// DeleteByKey
|
|
//
|
|
// @Description:
|
|
// @receiver d
|
|
// @param ctx
|
|
// @param key
|
|
// @return error
|
|
func (d *LevelDB) DeleteByKey(ctx context.Context, key string) error {
|
|
if err := d.DB.Delete([]byte(key), nil); err != nil {
|
|
applogger.Error("delete deleteByKey err:%v", err)
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// DeleteAllByKey
|
|
//
|
|
// @Description:
|
|
// @receiver d
|
|
// @param ctx
|
|
// @return error
|
|
func (d *LevelDB) DeleteAllByKey(ctx context.Context) error {
|
|
iter := d.DB.NewIterator(nil, nil)
|
|
for iter.Next() {
|
|
key := iter.Key()
|
|
if err := d.DB.Delete(key, nil); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
iter.Release()
|
|
if err := iter.Error(); err != nil {
|
|
applogger.Error("iter.Error:%v", err)
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|