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 }