@@ -50,9 +50,10 @@ type OnNewCarBlockFunc func(Block) error
50
50
// the Car file like size and number of blocks that go into it
51
51
type SelectiveCarPrepared struct {
52
52
SelectiveCar
53
- size uint64
54
- header CarHeader
55
- cids []cid.Cid
53
+ size uint64
54
+ header CarHeader
55
+ cids []cid.Cid
56
+ userOnNewCarBlocks []OnNewCarBlockFunc
56
57
}
57
58
58
59
// NewSelectiveCar creates a new SelectiveCar for the given car file based
@@ -72,7 +73,7 @@ func (sc SelectiveCar) traverse(onCarHeader OnCarHeaderFunc, onNewCarBlock OnNew
72
73
73
74
// Prepare traverse a car file and collects data on what is about to be written, but
74
75
// does not actually write the file
75
- func (sc SelectiveCar ) Prepare () (SelectiveCarPrepared , error ) {
76
+ func (sc SelectiveCar ) Prepare (userOnNewCarBlocks ... OnNewCarBlockFunc ) (SelectiveCarPrepared , error ) {
76
77
var header CarHeader
77
78
var cids []cid.Cid
78
79
@@ -88,7 +89,7 @@ func (sc SelectiveCar) Prepare() (SelectiveCarPrepared, error) {
88
89
if err != nil {
89
90
return SelectiveCarPrepared {}, err
90
91
}
91
- return SelectiveCarPrepared {sc , size , header , cids }, nil
92
+ return SelectiveCarPrepared {sc , size , header , cids , userOnNewCarBlocks }, nil
92
93
}
93
94
94
95
func (sc SelectiveCar ) Write (w io.Writer , userOnNewCarBlocks ... OnNewCarBlockFunc ) error {
@@ -133,6 +134,10 @@ func (sc SelectiveCarPrepared) Cids() []cid.Cid {
133
134
// Dump writes the car file as quickly as possible based on information already
134
135
// collected
135
136
func (sc SelectiveCarPrepared ) Dump (w io.Writer ) error {
137
+ offset , err := HeaderSize (& sc .header )
138
+ if err != nil {
139
+ return fmt .Errorf ("failed to size car header: %s" , err )
140
+ }
136
141
if err := WriteHeader (& sc .header , w ); err != nil {
137
142
return fmt .Errorf ("failed to write car header: %s" , err )
138
143
}
@@ -142,10 +147,23 @@ func (sc SelectiveCarPrepared) Dump(w io.Writer) error {
142
147
return err
143
148
}
144
149
raw := blk .RawData ()
150
+ size := util .LdSize (c .Bytes (), raw )
145
151
err = util .LdWrite (w , c .Bytes (), raw )
146
152
if err != nil {
147
153
return err
148
154
}
155
+ for _ , userOnNewCarBlock := range sc .userOnNewCarBlocks {
156
+ err := userOnNewCarBlock (Block {
157
+ BlockCID : c ,
158
+ Data : raw ,
159
+ Offset : offset ,
160
+ Size : size ,
161
+ })
162
+ if err != nil {
163
+ return err
164
+ }
165
+ }
166
+ offset += size
149
167
}
150
168
return nil
151
169
}
0 commit comments