@cryptotaxi247 / kubo / commits / 724515104

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