Make unixio.DagReader an interface
License: MIT Signed-off-by: Jakub Sztandera <kubuxu@protonmail.ch>
Jakub Sztandera committed
Nov 21, 2016 at 17:12 UTC
724515104e6f2a9c1f41aab340777b1e678e041d
4 files changed
+24
-17
core/coreunix/cat.go
+1
-1
@@ -8,7 +8,7 @@ import (
8
uio "github.com/ipfs/go-ipfs/unixfs/io"
9
)
10
11
-func Cat(ctx context.Context, n *core.IpfsNode, pstr string) (*uio.DagReader, error) {
11
+func Cat(ctx context.Context, n *core.IpfsNode, pstr string) (uio.DagReader, error) {
12
dagNode, err := core.Resolve(ctx, n.Namesys, n.Resolver, path.Path(pstr))
13
if err != nil {
14
return nil, err
unixfs/io/dagreader.go
+21
-14
@@ -20,8 +20,15 @@ var ErrIsDir = errors.New("this dag node is a directory")
20
21
var ErrCantReadSymlinks = errors.New("cannot currently read symlinks")
22
23
+type DagReader interface {
24
+ ReadSeekCloser
25
+ Size() uint64
26
+ CtxReadFull(context.Context, []byte) (int, error)
27
+ Offset() int64
28
+}
29
+
30
// DagReader provides a way to easily read the data contained in a dag.
24
-type DagReader struct {
31
+type pbDagReader struct {
32
serv mdag.DAGService
33
34
// the node being read
@@ -59,10 +66,10 @@ type ReadSeekCloser interface {
66
67
// NewDagReader creates a new reader object that reads the data represented by
68
// the given node, using the passed in DAGService for data retreival
62
-func NewDagReader(ctx context.Context, n node.Node, serv mdag.DAGService) (*DagReader, error) {
69
+func NewDagReader(ctx context.Context, n node.Node, serv mdag.DAGService) (DagReader, error) {
70
switch n := n.(type) {
71
case *mdag.RawNode:
65
- return &DagReader{
72
+ return &pbDagReader{
73
buf: NewRSNCFromBytes(n.RawData()),
74
}, nil
75
case *mdag.ProtoNode:
@@ -101,10 +108,10 @@ func NewDagReader(ctx context.Context, n node.Node, serv mdag.DAGService) (*DagR
108
}
109
}
110
104
-func NewDataFileReader(ctx context.Context, n *mdag.ProtoNode, pb *ftpb.Data, serv mdag.DAGService) *DagReader {
111
+func NewDataFileReader(ctx context.Context, n *mdag.ProtoNode, pb *ftpb.Data, serv mdag.DAGService) *pbDagReader {
112
fctx, cancel := context.WithCancel(ctx)
113
promises := mdag.GetDAG(fctx, serv, n)
107
- return &DagReader{
114
+ return &pbDagReader{
115
node: n,
116
serv: serv,
117
buf: NewRSNCFromBytes(pb.GetData()),
@@ -117,7 +124,7 @@ func NewDataFileReader(ctx context.Context, n *mdag.ProtoNode, pb *ftpb.Data, se
124
125
// precalcNextBuf follows the next link in line and loads it from the
126
// DAGService, setting the next buffer to read from
120
-func (dr *DagReader) precalcNextBuf(ctx context.Context) error {
127
+func (dr *pbDagReader) precalcNextBuf(ctx context.Context) error {
128
dr.buf.Close() // Just to make sure
129
if dr.linkPosition >= len(dr.promises) {
130
return io.EOF
@@ -158,22 +165,22 @@ func (dr *DagReader) precalcNextBuf(ctx context.Context) error {
165
dr.buf = NewRSNCFromBytes(nxt.RawData())
166
return nil
167
default:
161
- return errors.New("unrecognized node type in DagReader")
168
+ return errors.New("unrecognized node type in pbDagReader")
169
}
170
}
171
172
// Size return the total length of the data from the DAG structured file.
166
-func (dr *DagReader) Size() uint64 {
173
+func (dr *pbDagReader) Size() uint64 {
174
return dr.pbdata.GetFilesize()
175
}
176
177
// Read reads data from the DAG structured file
171
-func (dr *DagReader) Read(b []byte) (int, error) {
178
+func (dr *pbDagReader) Read(b []byte) (int, error) {
179
return dr.CtxReadFull(dr.ctx, b)
180
}
181
182
// CtxReadFull reads data from the DAG structured file
176
-func (dr *DagReader) CtxReadFull(ctx context.Context, b []byte) (int, error) {
183
+func (dr *pbDagReader) CtxReadFull(ctx context.Context, b []byte) (int, error) {
184
// If no cached buffer, load one
185
total := 0
186
for {
@@ -201,7 +208,7 @@ func (dr *DagReader) CtxReadFull(ctx context.Context, b []byte) (int, error) {
208
}
209
}
210
204
-func (dr *DagReader) WriteTo(w io.Writer) (int64, error) {
211
+func (dr *pbDagReader) WriteTo(w io.Writer) (int64, error) {
212
// If no cached buffer, load one
213
total := int64(0)
214
for {
@@ -226,12 +233,12 @@ func (dr *DagReader) WriteTo(w io.Writer) (int64, error) {
233
}
234
}
235
229
-func (dr *DagReader) Close() error {
236
+func (dr *pbDagReader) Close() error {
237
dr.cancel()
238
return nil
239
}
240
234
-func (dr *DagReader) Offset() int64 {
241
+func (dr *pbDagReader) Offset() int64 {
242
return dr.offset
243
}
244
@@ -239,7 +246,7 @@ func (dr *DagReader) Offset() int64 {
246
// interface matches standard unix seek
247
// TODO: check if we can do relative seeks, to reduce the amount of dagreader
248
// recreations that need to happen.
242
-func (dr *DagReader) Seek(offset int64, whence int) (int64, error) {
249
+func (dr *pbDagReader) Seek(offset int64, whence int) (int64, error) {
250
switch whence {
251
case os.SEEK_SET:
252
if offset < 0 {
unixfs/io/dagreader_test.go
+1
-1
@@ -236,7 +236,7 @@ func TestReaderSzie(t *testing.T) {
236
}
237
}
238
239
-func readByte(t testing.TB, reader *DagReader) byte {
239
+func readByte(t testing.TB, reader DagReader) byte {
240
out := make([]byte, 1)
241
c, err := reader.Read(out)
242
unixfs/mod/dagmodifier.go
+1
-1
@@ -43,7 +43,7 @@ type DagModifier struct {
43
curWrOff uint64
44
wrBuf *bytes.Buffer
45
46
- read *uio.DagReader
46
+ read uio.DagReader
47
}
48
49
func NewDagModifier(ctx context.Context, from node.Node, serv mdag.DAGService, spl chunk.SplitterGen) (*DagModifier, error) {