github.com/linapex/ethereum-dpos-chinese@v0.0.0-20190316121959-b78b3a4a1ece/swarm/state/dbstore.go (about) 1 2 //<developer> 3 // <name>linapex 曹一峰</name> 4 // <email>linapex@163.com</email> 5 // <wx>superexc</wx> 6 // <qqgroup>128148617</qqgroup> 7 // <url>https://jsq.ink</url> 8 // <role>pku engineer</role> 9 // <date>2019-03-16 12:09:49</date> 10 //</624342679932637184> 11 12 // 13 // 14 // 15 // 16 // 17 // 18 // 19 // 20 // 21 // 22 // 23 // 24 // 25 // 26 // 27 28 package state 29 30 import ( 31 "encoding" 32 "encoding/json" 33 "errors" 34 35 "github.com/syndtr/goleveldb/leveldb" 36 ) 37 38 // 39 var ErrNotFound = errors.New("ErrorNotFound") 40 41 // 42 var ErrInvalidArgument = errors.New("ErrorInvalidArgument") 43 44 // 45 type DBStore struct { 46 db *leveldb.DB 47 } 48 49 // 50 func NewDBStore(path string) (s *DBStore, err error) { 51 db, err := leveldb.OpenFile(path, nil) 52 if err != nil { 53 return nil, err 54 } 55 return &DBStore{ 56 db: db, 57 }, nil 58 } 59 60 // 61 // 62 // 63 func (s *DBStore) Get(key string, i interface{}) (err error) { 64 has, err := s.db.Has([]byte(key), nil) 65 if err != nil || !has { 66 return ErrNotFound 67 } 68 69 data, err := s.db.Get([]byte(key), nil) 70 if err == leveldb.ErrNotFound { 71 return ErrNotFound 72 } 73 74 unmarshaler, ok := i.(encoding.BinaryUnmarshaler) 75 if !ok { 76 return json.Unmarshal(data, i) 77 } 78 return unmarshaler.UnmarshalBinary(data) 79 } 80 81 // 82 func (s *DBStore) Put(key string, i interface{}) (err error) { 83 bytes := []byte{} 84 85 marshaler, ok := i.(encoding.BinaryMarshaler) 86 if !ok { 87 if bytes, err = json.Marshal(i); err != nil { 88 return err 89 } 90 } else { 91 if bytes, err = marshaler.MarshalBinary(); err != nil { 92 return err 93 } 94 } 95 96 return s.db.Put([]byte(key), bytes, nil) 97 } 98 99 // 100 func (s *DBStore) Delete(key string) (err error) { 101 return s.db.Delete([]byte(key), nil) 102 } 103 104 // 105 func (s *DBStore) Close() error { 106 return s.db.Close() 107 } 108