github.com/yinchengtsinghua/golang-Eos-dpos-Ethereum@v0.0.0-20190121132951-92cc4225ed8e/swarm/api/storage.go (about)

     1  
     2  //此源码被清华学神尹成大魔王专业翻译分析并修改
     3  //尹成QQ77025077
     4  //尹成微信18510341407
     5  //尹成所在QQ群721929980
     6  //尹成邮箱 yinc13@mails.tsinghua.edu.cn
     7  //尹成毕业于清华大学,微软区块链领域全球最有价值专家
     8  //https://mvp.microsoft.com/zh-cn/PublicProfile/4033620
     9  //
    10  //
    11  //
    12  //
    13  //
    14  //
    15  //
    16  //
    17  //
    18  //
    19  //
    20  //
    21  //
    22  //
    23  //
    24  
    25  package api
    26  
    27  import (
    28  	"context"
    29  	"path"
    30  
    31  	"github.com/ethereum/go-ethereum/swarm/storage"
    32  )
    33  
    34  type Response struct {
    35  	MimeType string
    36  	Status   int
    37  	Size     int64
    38  //
    39  	Content string
    40  }
    41  
    42  //
    43  //
    44  //
    45  type Storage struct {
    46  	api *API
    47  }
    48  
    49  func NewStorage(api *API) *Storage {
    50  	return &Storage{api}
    51  }
    52  
    53  //
    54  //
    55  //
    56  //
    57  func (s *Storage) Put(ctx context.Context, content string, contentType string, toEncrypt bool) (storage.Address, func(context.Context) error, error) {
    58  	return s.api.Put(ctx, content, contentType, toEncrypt)
    59  }
    60  
    61  //
    62  //
    63  //
    64  //
    65  //
    66  //
    67  //
    68  //
    69  func (s *Storage) Get(ctx context.Context, bzzpath string) (*Response, error) {
    70  	uri, err := Parse(path.Join("bzz:/", bzzpath))
    71  	if err != nil {
    72  		return nil, err
    73  	}
    74  	addr, err := s.api.Resolve(ctx, uri.Addr)
    75  	if err != nil {
    76  		return nil, err
    77  	}
    78  	reader, mimeType, status, _, err := s.api.Get(ctx, nil, addr, uri.Path)
    79  	if err != nil {
    80  		return nil, err
    81  	}
    82  	quitC := make(chan bool)
    83  	expsize, err := reader.Size(ctx, quitC)
    84  	if err != nil {
    85  		return nil, err
    86  	}
    87  	body := make([]byte, expsize)
    88  	size, err := reader.Read(body)
    89  	if int64(size) == expsize {
    90  		err = nil
    91  	}
    92  	return &Response{mimeType, status, expsize, string(body[:size])}, err
    93  }
    94  
    95  //
    96  //
    97  //
    98  //
    99  func (s *Storage) Modify(ctx context.Context, rootHash, path, contentHash, contentType string) (newRootHash string, err error) {
   100  	uri, err := Parse("bzz:/" + rootHash)
   101  	if err != nil {
   102  		return "", err
   103  	}
   104  	addr, err := s.api.Resolve(ctx, uri.Addr)
   105  	if err != nil {
   106  		return "", err
   107  	}
   108  	addr, err = s.api.Modify(ctx, addr, path, contentHash, contentType)
   109  	if err != nil {
   110  		return "", err
   111  	}
   112  	return addr.Hex(), nil
   113  }