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

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
}