github.com/linapex/ethereum-go-chinese@v0.0.0-20190316121929-f8b7a73c3fa1/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 19:16:44</date> 10 //</624450118199808000> 11 12 13 package state 14 15 import ( 16 "encoding" 17 "encoding/json" 18 "errors" 19 20 "github.com/syndtr/goleveldb/leveldb" 21 "github.com/syndtr/goleveldb/leveldb/storage" 22 ) 23 24 //如果没有从数据库返回结果,则返回errnotfound。 25 var ErrNotFound = errors.New("ErrorNotFound") 26 27 //存储区定义获取、设置和删除不同键的值所需的方法 28 //关闭基础资源。 29 type Store interface { 30 Get(key string, i interface{}) (err error) 31 Put(key string, i interface{}) (err error) 32 Delete(key string) (err error) 33 Close() error 34 } 35 36 //dbstore使用leveldb存储值。 37 type DBStore struct { 38 db *leveldb.DB 39 } 40 41 //new dbstore创建dbstore的新实例。 42 func NewDBStore(path string) (s *DBStore, err error) { 43 db, err := leveldb.OpenFile(path, nil) 44 if err != nil { 45 return nil, err 46 } 47 return &DBStore{ 48 db: db, 49 }, nil 50 } 51 52 //newInMemoryStore返回dbstore的新实例。仅用于测试和模拟。 53 func NewInmemoryStore() *DBStore { 54 db, err := leveldb.Open(storage.NewMemStorage(), nil) 55 if err != nil { 56 panic(err) 57 } 58 return &DBStore{ 59 db: db, 60 } 61 } 62 63 //get检索特定键的持久化值。如果没有结果 64 //返回errnotfound。提供的参数应为字节片或 65 //实现encoding.binaryUnmarshaler接口的结构 66 func (s *DBStore) Get(key string, i interface{}) (err error) { 67 has, err := s.db.Has([]byte(key), nil) 68 if err != nil || !has { 69 return ErrNotFound 70 } 71 72 data, err := s.db.Get([]byte(key), nil) 73 if err == leveldb.ErrNotFound { 74 return ErrNotFound 75 } 76 77 unmarshaler, ok := i.(encoding.BinaryUnmarshaler) 78 if !ok { 79 return json.Unmarshal(data, i) 80 } 81 return unmarshaler.UnmarshalBinary(data) 82 } 83 84 //Put存储为特定键实现二进制的对象。 85 func (s *DBStore) Put(key string, i interface{}) (err error) { 86 var bytes []byte 87 88 marshaler, ok := i.(encoding.BinaryMarshaler) 89 if !ok { 90 if bytes, err = json.Marshal(i); err != nil { 91 return err 92 } 93 } else { 94 if bytes, err = marshaler.MarshalBinary(); err != nil { 95 return err 96 } 97 } 98 99 return s.db.Put([]byte(key), bytes, nil) 100 } 101 102 //删除删除存储在特定键下的条目。 103 func (s *DBStore) Delete(key string) (err error) { 104 return s.db.Delete([]byte(key), nil) 105 } 106 107 //close释放基础级别db使用的资源。 108 func (s *DBStore) Close() error { 109 return s.db.Close() 110 } 111