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())