github.com/linapex/ethereum-dpos-chinese@v0.0.0-20190316121959-b78b3a4a1ece/swarm/api/storage.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:47</date>
    10  //</624342670101188608>
    11  
    12  //
    13  //
    14  //
    15  //
    16  //
    17  //
    18  //
    19  //
    20  //
    21  //
    22  //
    23  //
    24  //
    25  //
    26  //
    27  
    28  package api
    29  
    30  import (
    31  	"context"
    32  	"path"
    33  
    34  	"github.com/ethereum/go-ethereum/swarm/storage"
    35  )
    36  
    37  type Response struct {
    38  	MimeType string
    39  	Status   int
    40  	Size     int64
    41  //
    42  	Content string
    43  }
    44  
    45  //
    46  //
    47  //
    48  type Storage struct {
    49  	api *API
    50  }
    51  
    52  func NewStorage(api *API) *Storage {
    53  	return &Storage{api}
    54  }
    55  
    56  //
    57  //
    58  //
    59  //
    60  func (s *Storage) Put(ctx context.Context, content string, contentType string, toEncrypt bool) (storage.Address, func(context.Context) error, error) {
    61  	return s.api.Put(ctx, content, contentType, toEncrypt)
    62  }
    63  
    64  //
    65  //
    66  //
    67  //
    68  //
    69  //
    70  //
    71  //
    72  func (s *Storage) Get(ctx context.Context, bzzpath string) (*Response, error) {
    73  	uri, err := Parse(path.Join("bzz:/", bzzpath))
    74  	if err != nil {
    75  		return nil, err
    76  	}
    77  	addr, err := s.api.Resolve(ctx, uri.Addr)
    78  	if err != nil {
    79  		return nil, err
    80  	}
    81  	reader, mimeType, status, _, err := s.api.Get(ctx, nil, addr, uri.Path)
    82  	if err != nil {
    83  		return nil, err
    84  	}
    85  	quitC := make(chan bool)
    86  	expsize, err := reader.Size(ctx, quitC)
    87  	if err != nil {
    88  		return nil, err
    89  	}
    90  	body := make([]byte, expsize)
    91  	size, err := reader.Read(body)
    92  	if int64(size) == expsize {
    93  		err = nil
    94  	}
    95  	return &Response{mimeType, status, expsize, string(body[:size])}, err
    96  }
    97  
    98  //
    99  //
   100  //
   101  //
   102  func (s *Storage) Modify(ctx context.Context, rootHash, path, contentHash, contentType string) (newRootHash string, err error) {
   103  	uri, err := Parse("bzz:/" + rootHash)
   104  	if err != nil {
   105  		return "", err
   106  	}
   107  	addr, err := s.api.Resolve(ctx, uri.Addr)
   108  	if err != nil {
   109  		return "", err
   110  	}
   111  	addr, err = s.api.Modify(ctx, addr, path, contentHash, contentType)
   112  	if err != nil {
   113  		return "", err
   114  	}
   115  	return addr.Hex(), nil
   116  }
   117