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