@@ -12,6 +12,7 @@ import (
12
12
13
13
dag "github.com/ipfs/go-ipfs/merkledag"
14
14
ft "github.com/ipfs/go-ipfs/unixfs"
15
+ uio "github.com/ipfs/go-ipfs/unixfs/io"
15
16
ufspb "github.com/ipfs/go-ipfs/unixfs/pb"
16
17
17
18
node "gx/ipfs/QmU7bFWQ793qmvNy7outdCaMfSDNk8uqhx4VNrxYj5fj5g/go-ipld-node"
@@ -29,25 +30,31 @@ type Directory struct {
29
30
files map [string ]* File
30
31
31
32
lock sync.Mutex
32
- node * dag.ProtoNode
33
33
ctx context.Context
34
34
35
+ dirbuilder * uio.Directory
36
+
35
37
modTime time.Time
36
38
37
39
name string
38
40
}
39
41
40
- func NewDirectory (ctx context.Context , name string , node * dag.ProtoNode , parent childCloser , dserv dag.DAGService ) * Directory {
41
- return & Directory {
42
- dserv : dserv ,
43
- ctx : ctx ,
44
- name : name ,
45
- node : node ,
46
- parent : parent ,
47
- childDirs : make (map [string ]* Directory ),
48
- files : make (map [string ]* File ),
49
- modTime : time .Now (),
42
+ func NewDirectory (ctx context.Context , name string , node node.Node , parent childCloser , dserv dag.DAGService ) (* Directory , error ) {
43
+ db , err := uio .NewDirectoryFromNode (dserv , node )
44
+ if err != nil {
45
+ return nil , err
50
46
}
47
+
48
+ return & Directory {
49
+ dserv : dserv ,
50
+ ctx : ctx ,
51
+ name : name ,
52
+ dirbuilder : db ,
53
+ parent : parent ,
54
+ childDirs : make (map [string ]* Directory ),
55
+ files : make (map [string ]* File ),
56
+ modTime : time .Now (),
57
+ }, nil
51
58
}
52
59
53
60
// closeChild updates the child by the given name to the dag node 'nd'
@@ -81,21 +88,26 @@ func (d *Directory) closeChildUpdate(name string, nd *dag.ProtoNode, sync bool)
81
88
}
82
89
83
90
func (d * Directory ) flushCurrentNode () (* dag.ProtoNode , error ) {
84
- _ , err := d .dserv . Add ( d . node )
91
+ nd , err := d .dirbuilder . GetNode ( )
85
92
if err != nil {
86
93
return nil , err
87
94
}
88
95
89
- return d .node .Copy (), nil
90
- }
96
+ _ , err = d .dserv .Add (nd )
97
+ if err != nil {
98
+ return nil , err
99
+ }
91
100
92
- func (d * Directory ) updateChild (name string , nd node.Node ) error {
93
- err := d .node .RemoveNodeLink (name )
94
- if err != nil && err != dag .ErrNotFound {
95
- return err
101
+ pbnd , ok := nd .(* dag.ProtoNode )
102
+ if ! ok {
103
+ return nil , dag .ErrNotProtobuf
96
104
}
97
105
98
- err = d .node .AddNodeLinkClean (name , nd )
106
+ return pbnd .Copy (), nil
107
+ }
108
+
109
+ func (d * Directory ) updateChild (name string , nd node.Node ) error {
110
+ err := d .dirbuilder .AddChild (d .ctx , name , nd )
99
111
if err != nil {
100
112
return err
101
113
}
@@ -130,8 +142,12 @@ func (d *Directory) cacheNode(name string, nd node.Node) (FSNode, error) {
130
142
}
131
143
132
144
switch i .GetType () {
133
- case ufspb .Data_Directory :
134
- ndir := NewDirectory (d .ctx , name , nd , d , d .dserv )
145
+ case ufspb .Data_Directory , ufspb .Data_HAMTShard :
146
+ ndir , err := NewDirectory (d .ctx , name , nd , d , d .dserv )
147
+ if err != nil {
148
+ return nil , err
149
+ }
150
+
135
151
d .childDirs [name ] = ndir
136
152
return ndir , nil
137
153
case ufspb .Data_File , ufspb .Data_Raw , ufspb .Data_Symlink :
@@ -175,15 +191,7 @@ func (d *Directory) Uncache(name string) {
175
191
// childFromDag searches through this directories dag node for a child link
176
192
// with the given name
177
193
func (d * Directory ) childFromDag (name string ) (node.Node , error ) {
178
- pbn , err := d .node .GetLinkedNode (d .ctx , d .dserv , name )
179
- switch err {
180
- case nil :
181
- return pbn , nil
182
- case dag .ErrLinkNotFound :
183
- return nil , os .ErrNotExist
184
- default :
185
- return nil , err
186
- }
194
+ return d .dirbuilder .Find (d .ctx , name )
187
195
}
188
196
189
197
// childUnsync returns the child under this directory by the given name
@@ -209,7 +217,7 @@ type NodeListing struct {
209
217
Hash string
210
218
}
211
219
212
- func (d * Directory ) ListNames () []string {
220
+ func (d * Directory ) ListNames () ( []string , error ) {
213
221
d .lock .Lock ()
214
222
defer d .lock .Unlock ()
215
223
@@ -221,7 +229,12 @@ func (d *Directory) ListNames() []string {
221
229
names [n ] = struct {}{}
222
230
}
223
231
224
- for _ , l := range d .node .Links () {
232
+ links , err := d .dirbuilder .Links ()
233
+ if err != nil {
234
+ return nil , err
235
+ }
236
+
237
+ for _ , l := range links {
225
238
names [l .Name ] = struct {}{}
226
239
}
227
240
@@ -231,15 +244,21 @@ func (d *Directory) ListNames() []string {
231
244
}
232
245
sort .Strings (out )
233
246
234
- return out
247
+ return out , nil
235
248
}
236
249
237
250
func (d * Directory ) List () ([]NodeListing , error ) {
238
251
d .lock .Lock ()
239
252
defer d .lock .Unlock ()
240
253
241
254
var out []NodeListing
242
- for _ , l := range d .node .Links () {
255
+
256
+ links , err := d .dirbuilder .Links ()
257
+ if err != nil {
258
+ return nil , err
259
+ }
260
+
261
+ for _ , l := range links {
243
262
child := NodeListing {}
244
263
child .Name = l .Name
245
264
@@ -285,20 +304,23 @@ func (d *Directory) Mkdir(name string) (*Directory, error) {
285
304
}
286
305
}
287
306
288
- ndir := new (dag.ProtoNode )
289
- ndir .SetData (ft .FolderPBData ())
307
+ ndir := ft .EmptyDirNode ()
290
308
291
309
_ , err = d .dserv .Add (ndir )
292
310
if err != nil {
293
311
return nil , err
294
312
}
295
313
296
- err = d .node .AddNodeLinkClean (name , ndir )
314
+ err = d .dirbuilder .AddChild (d .ctx , name , ndir )
315
+ if err != nil {
316
+ return nil , err
317
+ }
318
+
319
+ dirobj , err := NewDirectory (d .ctx , name , ndir , d , d .dserv )
297
320
if err != nil {
298
321
return nil , err
299
322
}
300
323
301
- dirobj := NewDirectory (d .ctx , name , ndir , d , d .dserv )
302
324
d .childDirs [name ] = dirobj
303
325
return dirobj , nil
304
326
}
@@ -310,12 +332,7 @@ func (d *Directory) Unlink(name string) error {
310
332
delete (d .childDirs , name )
311
333
delete (d .files , name )
312
334
313
- err := d .node .RemoveNodeLink (name )
314
- if err != nil {
315
- return err
316
- }
317
-
318
- _ , err = d .dserv .Add (d .node )
335
+ err := d .dirbuilder .RemoveChild (d .ctx , name )
319
336
if err != nil {
320
337
return err
321
338
}
@@ -350,7 +367,7 @@ func (d *Directory) AddChild(name string, nd node.Node) error {
350
367
return err
351
368
}
352
369
353
- err = d .node . AddNodeLinkClean ( name , nd )
370
+ err = d .dirbuilder . AddChild ( d . ctx , name , nd )
354
371
if err != nil {
355
372
return err
356
373
}
@@ -406,10 +423,15 @@ func (d *Directory) GetNode() (node.Node, error) {
406
423
return nil , err
407
424
}
408
425
409
- _ , err = d .dserv .Add (d .node )
426
+ nd , err := d .dirbuilder .GetNode ()
427
+ if err != nil {
428
+ return nil , err
429
+ }
430
+
431
+ _ , err = d .dserv .Add (nd )
410
432
if err != nil {
411
433
return nil , err
412
434
}
413
435
414
- return d . node . Copy (), nil
436
+ return nd , err
415
437
}
0 commit comments