github.com/yinchengtsinghua/golang-Eos-dpos-Ethereum@v0.0.0-20190121132951-92cc4225ed8e/swarm/state/dbstore.go (about)

     1  
     2  //此源码被清华学神尹成大魔王专业翻译分析并修改
     3  //尹成QQ77025077
     4  //尹成微信18510341407
     5  //尹成所在QQ群721929980
     6  //尹成邮箱 yinc13@mails.tsinghua.edu.cn
     7  //尹成毕业于清华大学,微软区块链领域全球最有价值专家
     8  //https://mvp.microsoft.com/zh-cn/PublicProfile/4033620
     9  //
    10  //
    11  //
    12  //
    13  //
    14  //
    15  //
    16  //
    17  //
    18  //
    19  //
    20  //
    21  //
    22  //
    23  //
    24  
    25  package state
    26  
    27  import (
    28  	"encoding"
    29  	"encoding/json"
    30  	"errors"
    31  
    32  	"github.com/syndtr/goleveldb/leveldb"
    33  )
    34  
    35  //
    36  var ErrNotFound = errors.New("ErrorNotFound")
    37  
    38  //
    39  var ErrInvalidArgument = errors.New("ErrorInvalidArgument")
    40  
    41  //
    42  type DBStore struct {
    43  	db *leveldb.DB
    44  }
    45  
    46  //
    47  func NewDBStore(path string) (s *DBStore, err error) {
    48  	db, err := leveldb.OpenFile(path, nil)
    49  	if err != nil {
    50  		return nil, err
    51  	}
    52  	return &DBStore{
    53  		db: db,
    54  	}, nil
    55  }
    56  
    57  //
    58  //
    59  //
    60  func (s *DBStore) Get(key string, i interface{}) (err error) {
    61  	has, err := s.db.Has([]byte(key), nil)
    62  	if err != nil || !has {
    63  		return ErrNotFound
    64  	}
    65  
    66  	data, err := s.db.Get([]byte(key), nil)
    67  	if err == leveldb.ErrNotFound {
    68  		return ErrNotFound
    69  	}
    70  
    71  	unmarshaler, ok := i.(encoding.BinaryUnmarshaler)
    72  	if !ok {
    73  		return json.Unmarshal(data, i)
    74  	}
    75  	return unmarshaler.UnmarshalBinary(data)
    76  }
    77  
    78  //
    79  func (s *DBStore) Put(key string, i interface{}) (err error) {
    80  	bytes := []byte{}
    81  
    82  	marshaler, ok := i.(encoding.BinaryMarshaler)
    83  	if !ok {
    84  		if bytes, err = json.Marshal(i); err != nil {
    85  			return err
    86  		}
    87  	} else {
    88  		if bytes, err = marshaler.MarshalBinary(); err != nil {
    89  			return err
    90  		}
    91  	}
    92  
    93  	return s.db.Put([]byte(key), bytes, nil)
    94  }
    95  
    96  //
    97  func (s *DBStore) Delete(key string) (err error) {
    98  	return s.db.Delete([]byte(key), nil)
    99  }
   100  
   101  //
   102  func (s *DBStore) Close() error {
   103  	return s.db.Close()
   104  }