blocks.go 1.27 KB
Newer Older
Juan Batiz-Benet's avatar
Juan Batiz-Benet committed
1 2 3
package blocks

import (
Juan Batiz-Benet's avatar
Juan Batiz-Benet committed
4 5 6 7
	"fmt"
	ds "github.com/jbenet/datastore.go"
	u "github.com/jbenet/go-ipfs/util"
	mh "github.com/jbenet/go-multihash"
Juan Batiz-Benet's avatar
Juan Batiz-Benet committed
8 9 10 11 12
)

// Blocks is the ipfs blocks service. It is the way
// to retrieve blocks by the higher level ipfs modules

Juan Batiz-Benet's avatar
Juan Batiz-Benet committed
13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29
type Block struct {
	Multihash mh.Multihash
	Data      []byte
}

func NewBlock(data []byte) (*Block, error) {
	h, err := u.Hash(data)
	if err != nil {
		return nil, err
	}
	return &Block{Data: data, Multihash: h}, nil
}

func (b *Block) Key() u.Key {
	return u.Key(b.Multihash)
}

Juan Batiz-Benet's avatar
Juan Batiz-Benet committed
30
type BlockService struct {
Juan Batiz-Benet's avatar
Juan Batiz-Benet committed
31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
	Datastore ds.Datastore
	// Remote *bitswap.BitSwap // eventually.
}

func NewBlockService(d ds.Datastore) (*BlockService, error) {
	if d == nil {
		return nil, fmt.Errorf("BlockService requires valid datastore")
	}
	return &BlockService{Datastore: d}, nil
}

func (s *BlockService) AddBlock(b *Block) error {
	dsk := ds.NewKey(string(b.Key()))
	return s.Datastore.Put(dsk, b.Data)
}

func (s *BlockService) GetBlock(k u.Key) (*Block, error) {
	dsk := ds.NewKey(string(k))
	datai, err := s.Datastore.Get(dsk)
	if err != nil {
		return nil, err
	}

	data, ok := datai.([]byte)
	if !ok {
		return nil, fmt.Errorf("data associated with %s is not a []byte", k)
	}

	return &Block{
		Multihash: mh.Multihash(k),
		Data:      data,
	}, nil
Juan Batiz-Benet's avatar
Juan Batiz-Benet committed
63
}