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