github.com/linapex/ethereum-dpos-chinese@v0.0.0-20190316121959-b78b3a4a1ece/swarm/state/inmemorystore.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 //</624342680083632128> 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 "sync" 34 ) 35 36 // 37 // 38 type InmemoryStore struct { 39 db map[string][]byte 40 mu sync.RWMutex 41 } 42 43 // 44 func NewInmemoryStore() *InmemoryStore { 45 return &InmemoryStore{ 46 db: make(map[string][]byte), 47 } 48 } 49 50 // 51 // 52 func (s *InmemoryStore) Get(key string, i interface{}) (err error) { 53 s.mu.RLock() 54 defer s.mu.RUnlock() 55 56 bytes, ok := s.db[key] 57 if !ok { 58 return ErrNotFound 59 } 60 61 unmarshaler, ok := i.(encoding.BinaryUnmarshaler) 62 if !ok { 63 return json.Unmarshal(bytes, i) 64 } 65 66 return unmarshaler.UnmarshalBinary(bytes) 67 } 68 69 // 70 func (s *InmemoryStore) Put(key string, i interface{}) (err error) { 71 s.mu.Lock() 72 defer s.mu.Unlock() 73 bytes := []byte{} 74 75 marshaler, ok := i.(encoding.BinaryMarshaler) 76 if !ok { 77 if bytes, err = json.Marshal(i); err != nil { 78 return err 79 } 80 } else { 81 if bytes, err = marshaler.MarshalBinary(); err != nil { 82 return err 83 } 84 } 85 86 s.db[key] = bytes 87 return nil 88 } 89 90 // 91 func (s *InmemoryStore) Delete(key string) (err error) { 92 s.mu.Lock() 93 defer s.mu.Unlock() 94 95 if _, ok := s.db[key]; !ok { 96 return ErrNotFound 97 } 98 delete(s.db, key) 99 return nil 100 } 101 102 // 103 func (s *InmemoryStore) Close() error { 104 return nil 105 } 106