123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137 |
- package bitcoin
- import (
- "encoding/json"
- "fmt"
- "github.com/syndtr/goleveldb/leveldb"
- "github.com/syndtr/goleveldb/leveldb/errors"
- "github.com/syndtr/goleveldb/leveldb/opt"
- "github.com/syndtr/goleveldb/leveldb/util"
- )
- type goleveldb struct {
- mdb *leveldb.DB
- }
- type goLevelDBBatch struct {
- db *goleveldb
- batch *leveldb.Batch
- }
- type Batch interface {
- Set(key, value []byte)
- Delete(key []byte)
- Write() error
- }
- var bitcoindb goleveldb
- func (m *goleveldb) InitGoleveldb() bool {
- var err error
- var dbpath string
- dbPathLen := len(Config.Db.DbPath)
- if Config.Db.DbPath[dbPathLen-1] == '/' {
- dbpath = fmt.Sprintf("%sbitcoindb", Config.Db.DbPath)
- } else {
- dbpath = fmt.Sprintf("%s/bitcoindb", Config.Db.DbPath)
- }
- fmt.Println("bitcoin goleveldb :", dbpath)
- m.mdb, err = leveldb.OpenFile(dbpath, nil)
- if err != nil {
- fmt.Println(err)
- return false
- }
- return true
- }
- func (m *goleveldb) Put(key, value []byte) error {
- err := m.mdb.Put(key, value, nil)
- if err != nil {
- return err
- }
- return nil
- }
- func (m *goleveldb) Get(key []byte) ([]byte, error) {
- res, err := m.mdb.Get(key, nil)
- if err != nil {
- if err == errors.ErrNotFound {
- return nil, nil
- } else {
- return nil, err
- }
- }
- return res, nil
- }
- func (m *goleveldb) Delete(key []byte) error {
- err := m.mdb.Delete(key, nil)
- if err != nil {
- return err
- }
- return nil
- }
- func (m *goleveldb) DeleteSync(key []byte) error {
- err := m.mdb.Delete(key, &opt.WriteOptions{Sync: true})
- if err != nil {
- return err
- }
- return nil
- }
- func (m *goleveldb) Close() {
- m.mdb.Close()
- }
- func (m *goleveldb) NewBatch() Batch {
- batch := new(leveldb.Batch)
- return &goLevelDBBatch{m, batch}
- }
- func (mBatch *goLevelDBBatch) Set(key, value []byte) {
- mBatch.batch.Put(key, value)
- }
- func (mBatch *goLevelDBBatch) Delete(key []byte) {
- mBatch.batch.Delete(key)
- }
- func (mBatch *goLevelDBBatch) Write() error {
- err := mBatch.db.mdb.Write(mBatch.batch, nil)
- if err != nil {
- return err
- }
- return nil
- }
- func (m *goleveldb) PrefixScan(key []byte) ([]byte, error) {
- var txid string
- var jbuf []byte
- var err error
- outputsArr := make([]string, 0)
- iter := m.mdb.NewIterator(util.BytesPrefix(key), nil)
- for iter.Next() {
- value := iter.Value()
- if err = json.Unmarshal([]byte(value), &txid); err != nil {
- fmt.Println("Unmarshal err :", err.Error())
- return nil, err
- }
- outputsArr = append(outputsArr, txid)
- }
- iter.Release()
- err = iter.Error()
- if err != nil {
- return nil, err
- }
- if jbuf, err = json.Marshal(outputsArr); err != nil {
- fmt.Println("Marshal err :", err.Error())
- return nil, err
- }
- return jbuf, nil
- }
|