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 }