@cryptotaxi247 / kubo / commits / c75ac6a7f

Allow dagmodifier to be created (but not used) with raw nodes

License: MIT Signed-off-by: Jeromy <jeromyj@gmail.com>

Jeromy committed Jun 19, 2017 at 22:10 UTC c75ac6a7fa1909dddad145684f5b17c791d667ff
1 file changed +45 -10
unixfs/mod/dagmodifier.go
+45 -10
@@ -4,6 +4,7 @@ import (
4 "bytes"
5 "context"
6 "errors"
7 + "fmt"
8 "io"
9
10 chunk "github.com/ipfs/go-ipfs/importer/chunk"
@@ -29,7 +30,7 @@ var writebufferSize = 1 << 21
30 // Dear god, please rename this to something more pleasant
31 type DagModifier struct {
32 dagserv mdag.DAGService
32 - curNode *mdag.ProtoNode
33 + curNode node.Node
34
35 splitter chunk.SplitterGen
36 ctx context.Context
@@ -42,14 +43,18 @@ type DagModifier struct {
43 read uio.DagReader
44 }
45
46 +var ErrNotUnixfs = fmt.Errorf("dagmodifier only supports unixfs nodes (proto or raw)")
47 +
48 func NewDagModifier(ctx context.Context, from node.Node, serv mdag.DAGService, spl chunk.SplitterGen) (*DagModifier, error) {
46 - pbn, ok := from.(*mdag.ProtoNode)
47 - if !ok {
48 - return nil, mdag.ErrNotProtobuf
49 + switch from.(type) {
50 + case *mdag.ProtoNode, *mdag.RawNode:
51 + // ok
52 + default:
53 + return nil, ErrNotUnixfs
54 }
55
56 return &DagModifier{
52 - curNode: pbn.Copy().(*mdag.ProtoNode),
57 + curNode: from.Copy(),
58 dagserv: serv,
59 splitter: spl,
60 ctx: ctx,
@@ -144,8 +149,15 @@ func (dm *DagModifier) Write(b []byte) (int, error) {
149 return n, nil
150 }
151
152 +var ErrNoRawYet = fmt.Errorf("currently only fully support protonodes in the dagmodifier")
153 +
154 func (dm *DagModifier) Size() (int64, error) {
148 - pbn, err := ft.FromBytes(dm.curNode.Data())
155 + pbnd, ok := dm.curNode.(*mdag.ProtoNode)
156 + if !ok {
157 + return 0, ErrNoRawYet
158 + }
159 +
160 + pbn, err := ft.FromBytes(pbnd.Data())
161 if err != nil {
162 return 0, err
163 }
@@ -222,7 +234,12 @@ func (dm *DagModifier) Sync() error {
234 // modifyDag writes the data in 'data' over the data in 'node' starting at 'offset'
235 // returns the new key of the passed in node and whether or not all the data in the reader
236 // has been consumed.
225 -func (dm *DagModifier) modifyDag(node *mdag.ProtoNode, offset uint64, data io.Reader) (*cid.Cid, bool, error) {
237 +func (dm *DagModifier) modifyDag(n node.Node, offset uint64, data io.Reader) (*cid.Cid, bool, error) {
238 + node, ok := n.(*mdag.ProtoNode)
239 + if !ok {
240 + return nil, false, ErrNoRawYet
241 + }
242 +
243 f, err := ft.FromBytes(node.Data())
244 if err != nil {
245 return nil, false, err
@@ -301,13 +318,26 @@ func (dm *DagModifier) modifyDag(node *mdag.ProtoNode, offset uint64, data io.Re
318 }
319
320 // appendData appends the blocks from the given chan to the end of this dag
304 -func (dm *DagModifier) appendData(node *mdag.ProtoNode, spl chunk.Splitter) (node.Node, error) {
321 +func (dm *DagModifier) appendData(nd node.Node, spl chunk.Splitter) (node.Node, error) {
322 +
323 + var root *mdag.ProtoNode
324 + switch nd := nd.(type) {
325 + case *mdag.ProtoNode:
326 + root = nd
327 + case *mdag.RawNode:
328 + // TODO: be able to append to rawnodes. Probably requires making this
329 + // node a child of a unxifs intermediate node and passing it down
330 + return nil, fmt.Errorf("appending to raw node types not yet supported")
331 + default:
332 + return nil, ErrNotUnixfs
333 + }
334 +
335 dbp := &help.DagBuilderParams{
336 Dagserv: dm.dagserv,
337 Maxlinks: help.DefaultLinksPerBlock,
338 }
339
310 - return trickle.TrickleAppend(dm.ctx, node, dbp.New(spl))
340 + return trickle.TrickleAppend(dm.ctx, root, dbp.New(spl))
341 }
342
343 // Read data from this dag starting at the current offset
@@ -452,7 +482,12 @@ func (dm *DagModifier) Truncate(size int64) error {
482 }
483
484 // dagTruncate truncates the given node to 'size' and returns the modified Node
455 -func dagTruncate(ctx context.Context, nd *mdag.ProtoNode, size uint64, ds mdag.DAGService) (*mdag.ProtoNode, error) {
485 +func dagTruncate(ctx context.Context, n node.Node, size uint64, ds mdag.DAGService) (*mdag.ProtoNode, error) {
486 + nd, ok := n.(*mdag.ProtoNode)
487 + if !ok {
488 + return nil, ErrNoRawYet
489 + }
490 +
491 if len(nd.Links()) == 0 {
492 // TODO: this can likely be done without marshaling and remarshaling
493 pbn, err := ft.FromBytes(nd.Data())