@@ -80,39 +80,43 @@ func CreateDag(path string, encoding ...multibase.Encoding) (*Dag, error) {
80
80
return nil , err
81
81
}
82
82
83
- leaf , err := CheckMetaFile (path , dag , encoder )
83
+ metaLeaf , err := CheckMetaFile (path , dag , encoder )
84
84
if err != nil {
85
85
log .Println ("Failed to check meta file" )
86
86
} else {
87
- builder .AddLink ("0" , leaf .Hash )
88
- leaf .SetLabel ("0" )
89
- dag .AddLeaf (leaf , encoder , nil )
87
+ builder .AddLink ("0" , metaLeaf .Hash )
88
+ metaLeaf .SetLabel ("0" )
89
+ dag .AddLeaf (metaLeaf , encoder , nil )
90
90
}
91
91
92
+ dag .AddLeaf (metaLeaf , encoder , nil )
93
+
92
94
for _ , entry := range entries {
93
95
if entry .Name () != ".meta" {
94
96
leaf , err := processEntry (entry , & path , dag , encoder )
95
97
if err != nil {
96
98
return nil , err
97
99
}
98
100
99
- label := builder .GetNextAvailableLabel ()
101
+ label := dag .GetNextAvailableLabel ()
100
102
builder .AddLink (label , leaf .Hash )
101
103
leaf .SetLabel (label )
102
104
dag .AddLeaf (leaf , encoder , nil )
103
105
}
104
106
}
105
107
106
- leaf , err = builder .BuildLeaf (encoder )
107
-
108
+ leaf , err := builder .BuildRootLeaf (encoder , len (dag .Leafs ))
108
109
if err != nil {
109
110
return nil , err
110
111
}
111
112
112
113
dag .AddLeaf (leaf , encoder , nil )
113
114
114
- rootHash := leaf .Hash
115
- return dag .BuildDag (rootHash ), nil
115
+ builtDag := dag .BuildDag (leaf .Hash )
116
+
117
+ builtDag .GenerateLabelMap ()
118
+
119
+ return builtDag , nil
116
120
}
117
121
118
122
func processMetaFile (path * string , basePath * string , dag * DagBuilder , encoder multibase.Encoder ) (* DagLeaf , error ) {
@@ -147,7 +151,7 @@ func processMetaFile(path *string, basePath *string, dag *DagBuilder, encoder mu
147
151
return nil , err
148
152
}
149
153
150
- label := builder .GetNextAvailableLabel ()
154
+ label := dag .GetNextAvailableLabel ()
151
155
builder .AddLink (label , chunkLeaf .Hash )
152
156
chunkLeaf .SetLabel (label )
153
157
dag .AddLeaf (chunkLeaf , encoder , nil )
@@ -180,23 +184,14 @@ func processEntry(entry fs.FileInfo, path *string, dag *DagBuilder, encoder mult
180
184
return nil , err
181
185
}
182
186
183
- leaf , err := CheckMetaFile (entryPath , dag , encoder )
184
- if err != nil {
185
- log .Println ("Failed to check meta file" )
186
- } else {
187
- builder .AddLink ("0" , leaf .Hash )
188
- leaf .SetLabel ("0" )
189
- dag .AddLeaf (leaf , encoder , nil )
190
- }
191
-
192
187
for _ , entry := range entries {
193
188
if entry .Name () != ".meta" {
194
189
leaf , err := processEntry (entry , & entryPath , dag , encoder )
195
190
if err != nil {
196
191
return nil , err
197
192
}
198
193
199
- label := builder .GetNextAvailableLabel ()
194
+ label := dag .GetNextAvailableLabel ()
200
195
builder .AddLink (label , leaf .Hash )
201
196
leaf .SetLabel (label )
202
197
dag .AddLeaf (leaf , encoder , nil )
@@ -227,7 +222,7 @@ func processEntry(entry fs.FileInfo, path *string, dag *DagBuilder, encoder mult
227
222
return nil , err
228
223
}
229
224
230
- label := builder .GetNextAvailableLabel ()
225
+ label := dag .GetNextAvailableLabel ()
231
226
builder .AddLink (label , chunkLeaf .Hash )
232
227
chunkLeaf .SetLabel (label )
233
228
dag .AddLeaf (chunkLeaf , encoder , nil )
@@ -260,7 +255,8 @@ func chunkFile(fileData []byte, chunkSize int) [][]byte {
260
255
261
256
func CreateDagBuilder () * DagBuilder {
262
257
return & DagBuilder {
263
- Leafs : map [string ]* DagLeaf {},
258
+ Labels : map [string ]string {},
259
+ Leafs : map [string ]* DagLeaf {},
264
260
}
265
261
}
266
262
@@ -271,6 +267,8 @@ func (b *DagBuilder) AddLeaf(leaf *DagLeaf, encoder multibase.Encoder, parentLea
271
267
if ! exists {
272
268
parentLeaf .AddLink (leaf .Hash )
273
269
}
270
+
271
+ b .Labels [label ] = leaf .Hash
274
272
}
275
273
276
274
b .Leafs [leaf .Hash ] = leaf
@@ -280,22 +278,34 @@ func (b *DagBuilder) AddLeaf(leaf *DagLeaf, encoder multibase.Encoder, parentLea
280
278
281
279
func (b * DagBuilder ) BuildDag (root string ) * Dag {
282
280
return & Dag {
283
- Leafs : b .Leafs ,
284
- Root : root ,
281
+ Leafs : b .Leafs ,
282
+ Labels : b .Labels ,
283
+ Root : root ,
285
284
}
286
285
}
287
286
288
287
func (dag * Dag ) Verify (encoder multibase.Encoder ) (bool , error ) {
289
288
result := true
290
289
291
- for _ , leaf := range dag .Leafs {
292
- leafResult , err := leaf .VerifyLeaf (encoder )
293
- if err != nil {
294
- return false , err
295
- }
290
+ for hash , leaf := range dag .Leafs {
291
+ if hash == dag .Root {
292
+ leafResult , err := leaf .VerifyRootLeaf (encoder )
293
+ if err != nil {
294
+ return false , err
295
+ }
296
+
297
+ if ! leafResult {
298
+ return false , nil
299
+ }
300
+ } else {
301
+ leafResult , err := leaf .VerifyLeaf (encoder )
302
+ if err != nil {
303
+ return false , err
304
+ }
296
305
297
- if ! leafResult {
298
- result = false
306
+ if ! leafResult {
307
+ return false , nil
308
+ }
299
309
}
300
310
}
301
311
@@ -332,7 +342,8 @@ func (dag *Dag) CreateDirectory(path string, encoder multibase.Encoder) error {
332
342
333
343
/*
334
344
if runtime.GOOS == "windows" {
335
- p, err := syscall.UTF16PtrFromString(fileName)
345
+ p, err := syscal
346
+ l.UTF16PtrFromString(fileName)
336
347
if err != nil {
337
348
log.Fatal(err)
338
349
}
@@ -363,9 +374,40 @@ func ReadDag(path string) (*Dag, error) {
363
374
return nil , fmt .Errorf ("could not decode Dag: %w" , err )
364
375
}
365
376
377
+ result .GenerateLabelMap ()
378
+
366
379
return & result , nil
367
380
}
368
381
382
+ func (dag * Dag ) GenerateLabelMap () {
383
+ dag .Labels = map [string ]string {}
384
+
385
+ for hash , _ := range dag .Leafs {
386
+ label := GetLabel (hash )
387
+
388
+ dag .Labels [label ] = hash
389
+ }
390
+ }
391
+
392
+ func (dag * Dag ) FindLeafByLabel (label string ) * DagLeaf {
393
+ hash , exists := dag .Labels [label ]
394
+
395
+ fmt .Println ("Find leaf: " + label )
396
+
397
+ if exists {
398
+ fmt .Println ("Found leaf: " + hash )
399
+
400
+ leaf , result := dag .Leafs [hash ]
401
+ if result {
402
+ return leaf
403
+ } else {
404
+ return nil
405
+ }
406
+ } else {
407
+ return nil
408
+ }
409
+ }
410
+
369
411
func (dag * Dag ) FindLeafByHash (hash string ) * DagLeaf {
370
412
leaf , result := dag .Leafs [hash ]
371
413
if result {
@@ -398,7 +440,13 @@ func (dag *Dag) DeleteLeaf(leaf *DagLeaf, encoder multibase.Encoder) error {
398
440
return fmt .Errorf ("Parent leaf does not exist" )
399
441
}
400
442
401
- err := parentLeaf .RemoveLink (GetLabel (leaf .Hash ))
443
+ label := GetLabel (leaf .Hash )
444
+
445
+ if label == "0" {
446
+ return fmt .Errorf ("Unable to delete leaf 0" )
447
+ }
448
+
449
+ err := parentLeaf .RemoveLink (label )
402
450
if err != nil {
403
451
return err
404
452
}
@@ -407,11 +455,18 @@ func (dag *Dag) DeleteLeaf(leaf *DagLeaf, encoder multibase.Encoder) error {
407
455
408
456
delete (dag .Leafs , leaf .Hash )
409
457
458
+ err = dag .WriteToMetaLeaf (label , encoder )
459
+ if err != nil {
460
+ return err
461
+ }
462
+
410
463
root , err := dag .RegenerateDag (parentLeaf , encoder )
411
464
if err != nil {
412
465
return err
413
466
}
414
467
468
+ dag .GenerateLabelMap ()
469
+
415
470
dag .Root = * root
416
471
417
472
return nil
@@ -503,7 +558,92 @@ func (dag *Dag) RemoveChildren(leaf *DagLeaf, encoder multibase.Encoder) {
503
558
}
504
559
}
505
560
506
- // There must be a better way, but this is all I could think of doing at the time
561
+ func (dag * Dag ) AddLeaf (leaf * DagLeaf ) {
562
+ dag .Leafs [leaf .Hash ] = leaf
563
+ }
564
+
565
+ func (dag * Dag ) GetDataFromLeaf (leaf * DagLeaf ) ([]byte , error ) {
566
+ if len (leaf .Data ) <= 0 {
567
+ return []byte {}, nil
568
+ }
569
+
570
+ var content []byte
571
+
572
+ if len (leaf .Links ) > 0 {
573
+ for _ , link := range leaf .Links {
574
+ childLeaf := dag .Leafs [link ]
575
+ if childLeaf == nil {
576
+ return nil , fmt .Errorf ("invalid link: %s" , link )
577
+ }
578
+
579
+ content = append (content , childLeaf .Data ... )
580
+ }
581
+ } else {
582
+ content = leaf .Data
583
+ }
584
+
585
+ return content , nil
586
+ }
587
+
588
+ func (dag * Dag ) WriteToMetaLeaf (label string , encoder multibase.Encoder ) error {
589
+ leaf := dag .FindLeafByLabel ("0" )
590
+
591
+ if leaf == nil {
592
+ return fmt .Errorf ("Meta leaf does not exist" )
593
+ }
594
+
595
+ content , err := dag .GetDataFromLeaf (leaf )
596
+ if err != nil {
597
+ return err
598
+ }
599
+
600
+ builder := CreateDagLeafBuilder (".meta" )
601
+
602
+ builder .SetType (FileLeafType )
603
+
604
+ fileChunks := chunkFile (content , ChunkSize )
605
+
606
+ if len (fileChunks ) == 1 {
607
+ builder .SetData (fileChunks [0 ])
608
+ } else {
609
+ for i , chunk := range fileChunks {
610
+ chunkEntryPath := filepath .Join (".meta" , strconv .Itoa (i ))
611
+ chunkBuilder := CreateDagLeafBuilder (chunkEntryPath )
612
+
613
+ chunkBuilder .SetType (ChunkLeafType )
614
+ chunkBuilder .SetData (chunk )
615
+
616
+ chunkLeaf , err := chunkBuilder .BuildLeaf (encoder )
617
+ if err != nil {
618
+ return err
619
+ }
620
+
621
+ label := dag .GetNextAvailableLabel ()
622
+ builder .AddLink (label , chunkLeaf .Hash )
623
+ chunkLeaf .SetLabel (label )
624
+ dag .AddLeaf (chunkLeaf )
625
+ }
626
+ }
627
+
628
+ metaLeaf , err := builder .BuildLeaf (encoder )
629
+ if err != nil {
630
+ return err
631
+ }
632
+
633
+ rootLeaf := dag .Leafs [dag .Root ]
634
+
635
+ if err != nil {
636
+ log .Println ("Failed to update meta leaf" )
637
+ } else {
638
+ metaLeaf .SetLabel ("0" )
639
+ rootLeaf .AddLink (metaLeaf .Hash )
640
+
641
+ dag .AddLeaf (metaLeaf )
642
+ }
643
+
644
+ return nil
645
+ }
646
+
507
647
func (dag * Dag ) DoesExistMoreThanOnce (hash string ) bool {
508
648
count := 0
509
649
0 commit comments