@@ -13,6 +13,7 @@ import (
13
13
14
14
dag "github.com/ipfs/go-ipfs/merkledag"
15
15
ft "github.com/ipfs/go-ipfs/unixfs"
16
+ uio "github.com/ipfs/go-ipfs/unixfs/io"
16
17
ufspb "github.com/ipfs/go-ipfs/unixfs/pb"
17
18
)
18
19
@@ -28,25 +29,31 @@ type Directory struct {
28
29
files map [string ]* File
29
30
30
31
lock sync.Mutex
31
- node * dag.Node
32
32
ctx context.Context
33
33
34
+ dirbuilder * uio.Directory
35
+
34
36
modTime time.Time
35
37
36
38
name string
37
39
}
38
40
39
- func NewDirectory (ctx context.Context , name string , node * dag.Node , parent childCloser , dserv dag.DAGService ) * Directory {
40
- return & Directory {
41
- dserv : dserv ,
42
- ctx : ctx ,
43
- name : name ,
44
- node : node ,
45
- parent : parent ,
46
- childDirs : make (map [string ]* Directory ),
47
- files : make (map [string ]* File ),
48
- modTime : time .Now (),
41
+ func NewDirectory (ctx context.Context , name string , node * dag.Node , parent childCloser , dserv dag.DAGService ) (* Directory , error ) {
42
+ db , err := uio .NewDirectoryFromNode (dserv , node )
43
+ if err != nil {
44
+ return nil , err
49
45
}
46
+
47
+ return & Directory {
48
+ dserv : dserv ,
49
+ ctx : ctx ,
50
+ name : name ,
51
+ dirbuilder : db ,
52
+ parent : parent ,
53
+ childDirs : make (map [string ]* Directory ),
54
+ files : make (map [string ]* File ),
55
+ modTime : time .Now (),
56
+ }, nil
50
57
}
51
58
52
59
// closeChild updates the child by the given name to the dag node 'nd'
@@ -80,21 +87,21 @@ func (d *Directory) closeChildUpdate(name string, nd *dag.Node, sync bool) (*dag
80
87
}
81
88
82
89
func (d * Directory ) flushCurrentNode () (* dag.Node , error ) {
83
- _ , err := d .dserv . Add ( d . node )
90
+ nd , err := d .dirbuilder . GetNode ( )
84
91
if err != nil {
85
92
return nil , err
86
93
}
87
94
88
- return d .node .Copy (), nil
95
+ _ , err = d .dserv .Add (nd )
96
+ if err != nil {
97
+ return nil , err
98
+ }
99
+
100
+ return nd .Copy (), nil
89
101
}
90
102
91
103
func (d * Directory ) updateChild (name string , nd * dag.Node ) error {
92
- err := d .node .RemoveNodeLink (name )
93
- if err != nil && err != dag .ErrNotFound {
94
- return err
95
- }
96
-
97
- err = d .node .AddNodeLinkClean (name , nd )
104
+ err := d .dirbuilder .AddChild (d .ctx , name , nd )
98
105
if err != nil {
99
106
return err
100
107
}
@@ -128,7 +135,11 @@ func (d *Directory) cacheNode(name string, nd *dag.Node) (FSNode, error) {
128
135
129
136
switch i .GetType () {
130
137
case ufspb .Data_Directory :
131
- ndir := NewDirectory (d .ctx , name , nd , d , d .dserv )
138
+ ndir , err := NewDirectory (d .ctx , name , nd , d , d .dserv )
139
+ if err != nil {
140
+ return nil , err
141
+ }
142
+
132
143
d .childDirs [name ] = ndir
133
144
return ndir , nil
134
145
case ufspb .Data_File , ufspb .Data_Raw , ufspb .Data_Symlink :
@@ -162,13 +173,12 @@ func (d *Directory) Uncache(name string) {
162
173
// childFromDag searches through this directories dag node for a child link
163
174
// with the given name
164
175
func (d * Directory ) childFromDag (name string ) (* dag.Node , error ) {
165
- for _ , lnk := range d .node .Links {
166
- if lnk .Name == name {
167
- return lnk .GetNode (d .ctx , d .dserv )
168
- }
176
+ nd , err := d .dirbuilder .Find (d .ctx , name )
177
+ if err != nil {
178
+ return nil , err
169
179
}
170
180
171
- return nil , os . ErrNotExist
181
+ return nd . Copy (), nil
172
182
}
173
183
174
184
// childUnsync returns the child under this directory by the given name
@@ -194,7 +204,7 @@ type NodeListing struct {
194
204
Hash string
195
205
}
196
206
197
- func (d * Directory ) ListNames () []string {
207
+ func (d * Directory ) ListNames () ( []string , error ) {
198
208
d .lock .Lock ()
199
209
defer d .lock .Unlock ()
200
210
@@ -206,7 +216,12 @@ func (d *Directory) ListNames() []string {
206
216
names [n ] = struct {}{}
207
217
}
208
218
209
- for _ , l := range d .node .Links {
219
+ links , err := d .dirbuilder .Links ()
220
+ if err != nil {
221
+ return nil , err
222
+ }
223
+
224
+ for _ , l := range links {
210
225
names [l .Name ] = struct {}{}
211
226
}
212
227
@@ -216,15 +231,21 @@ func (d *Directory) ListNames() []string {
216
231
}
217
232
sort .Strings (out )
218
233
219
- return out
234
+ return out , nil
220
235
}
221
236
222
237
func (d * Directory ) List () ([]NodeListing , error ) {
223
238
d .lock .Lock ()
224
239
defer d .lock .Unlock ()
225
240
226
241
var out []NodeListing
227
- for _ , l := range d .node .Links {
242
+
243
+ links , err := d .dirbuilder .Links ()
244
+ if err != nil {
245
+ return nil , err
246
+ }
247
+
248
+ for _ , l := range links {
228
249
child := NodeListing {}
229
250
child .Name = l .Name
230
251
@@ -275,20 +296,23 @@ func (d *Directory) Mkdir(name string) (*Directory, error) {
275
296
}
276
297
}
277
298
278
- ndir := new (dag.Node )
279
- ndir .SetData (ft .FolderPBData ())
299
+ ndir := ft .EmptyDirNode ()
280
300
281
301
_ , err = d .dserv .Add (ndir )
282
302
if err != nil {
283
303
return nil , err
284
304
}
285
305
286
- err = d .node .AddNodeLinkClean (name , ndir )
306
+ err = d .dirbuilder .AddChild (d .ctx , name , ndir )
307
+ if err != nil {
308
+ return nil , err
309
+ }
310
+
311
+ dirobj , err := NewDirectory (d .ctx , name , ndir , d , d .dserv )
287
312
if err != nil {
288
313
return nil , err
289
314
}
290
315
291
- dirobj := NewDirectory (d .ctx , name , ndir , d , d .dserv )
292
316
d .childDirs [name ] = dirobj
293
317
return dirobj , nil
294
318
}
@@ -300,12 +324,7 @@ func (d *Directory) Unlink(name string) error {
300
324
delete (d .childDirs , name )
301
325
delete (d .files , name )
302
326
303
- err := d .node .RemoveNodeLink (name )
304
- if err != nil {
305
- return err
306
- }
307
-
308
- _ , err = d .dserv .Add (d .node )
327
+ err := d .dirbuilder .RemoveChild (d .ctx , name )
309
328
if err != nil {
310
329
return err
311
330
}
@@ -340,7 +359,7 @@ func (d *Directory) AddChild(name string, nd *dag.Node) error {
340
359
return err
341
360
}
342
361
343
- err = d .node . AddNodeLinkClean ( name , nd )
362
+ err = d .dirbuilder . AddChild ( d . ctx , name , nd )
344
363
if err != nil {
345
364
return err
346
365
}
@@ -396,10 +415,15 @@ func (d *Directory) GetNode() (*dag.Node, error) {
396
415
return nil , err
397
416
}
398
417
399
- _ , err = d .dserv .Add (d .node )
418
+ nd , err := d .dirbuilder .GetNode ()
419
+ if err != nil {
420
+ return nil , err
421
+ }
422
+
423
+ _ , err = d .dserv .Add (nd )
400
424
if err != nil {
401
425
return nil , err
402
426
}
403
427
404
- return d . node . Copy (), nil
428
+ return nd , err
405
429
}
0 commit comments