1
1
package unixfsnode
2
2
3
3
import (
4
+ "io"
5
+
4
6
"github.com/ipld/go-ipld-prime"
5
7
"github.com/ipld/go-ipld-prime/datamodel"
6
8
"github.com/ipld/go-ipld-prime/linking"
7
9
"github.com/ipld/go-ipld-prime/node/basicnode"
10
+ "github.com/ipld/go-ipld-prime/traversal"
8
11
"github.com/ipld/go-ipld-prime/traversal/selector"
9
12
"github.com/ipld/go-ipld-prime/traversal/selector/builder"
10
13
)
@@ -27,7 +30,12 @@ var ExploreAllRecursivelySelector = specBuilder(func(ssb builder.SelectorSpecBui
27
30
// MatchUnixfsPreloadSelector is precompiled for use with
28
31
// UnixFSPathSelectorBuilder().
29
32
var MatchUnixFSPreloadSelector = specBuilder (func (ssb builder.SelectorSpecBuilder ) builder.SelectorSpec {
30
- return ssb .ExploreInterpretAs ("unixfs-preload" , ssb .Matcher ())
33
+ return ssb .ExploreInterpretAs ("unixfs" , ssb .ExploreUnion (ssb .Matcher (),
34
+ ssb .ExploreRecursive (
35
+ selector .RecursionLimitDepth (1 ),
36
+ ssb .ExploreAll (ssb .ExploreRecursiveEdge ()),
37
+ ),
38
+ ))
31
39
})
32
40
33
41
// MatchUnixFSSelector is a selector that will match a single node, similar to
@@ -40,6 +48,23 @@ var MatchUnixFSSelector = specBuilder(func(ssb builder.SelectorSpecBuilder) buil
40
48
return ssb .ExploreInterpretAs ("unixfs" , ssb .Matcher ())
41
49
})
42
50
51
+ // BytesConsumingMatcher is a traversal.WalkMatching matcher function that
52
+ // consumes the bytes of a LargeBytesNode where one is matched. Use this in
53
+ // conjunction with the Match* selectors in this package to ensure that all
54
+ // blocks of sharded files are loaded during a traversal, or that the subset
55
+ // of blocks required to fulful a range selector are loaded.
56
+ func BytesConsumingMatcher (p traversal.Progress , n datamodel.Node ) error {
57
+ if lbn , ok := n .(datamodel.LargeBytesNode ); ok {
58
+ rdr , err := lbn .AsLargeBytes ()
59
+ if err != nil {
60
+ return err
61
+ }
62
+ _ , err = io .Copy (io .Discard , rdr )
63
+ return err
64
+ }
65
+ return nil
66
+ }
67
+
43
68
func AddUnixFSReificationToLinkSystem (lsys * ipld.LinkSystem ) {
44
69
if lsys .KnownReifiers == nil {
45
70
lsys .KnownReifiers = make (map [string ]linking.NodeReifier )
0 commit comments