Skip to content

Commit 7faddd5

Browse files
Merge pull request #1 from HORNET-Storage/labelling
Added differences for root leaves
2 parents acd630e + a549705 commit 7faddd5

File tree

5 files changed

+384
-117
lines changed

5 files changed

+384
-117
lines changed

dag/dag.go

+174-34
Original file line numberDiff line numberDiff line change
@@ -80,39 +80,43 @@ func CreateDag(path string, encoding ...multibase.Encoding) (*Dag, error) {
8080
return nil, err
8181
}
8282

83-
leaf, err := CheckMetaFile(path, dag, encoder)
83+
metaLeaf, err := CheckMetaFile(path, dag, encoder)
8484
if err != nil {
8585
log.Println("Failed to check meta file")
8686
} 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)
9090
}
9191

92+
dag.AddLeaf(metaLeaf, encoder, nil)
93+
9294
for _, entry := range entries {
9395
if entry.Name() != ".meta" {
9496
leaf, err := processEntry(entry, &path, dag, encoder)
9597
if err != nil {
9698
return nil, err
9799
}
98100

99-
label := builder.GetNextAvailableLabel()
101+
label := dag.GetNextAvailableLabel()
100102
builder.AddLink(label, leaf.Hash)
101103
leaf.SetLabel(label)
102104
dag.AddLeaf(leaf, encoder, nil)
103105
}
104106
}
105107

106-
leaf, err = builder.BuildLeaf(encoder)
107-
108+
leaf, err := builder.BuildRootLeaf(encoder, len(dag.Leafs))
108109
if err != nil {
109110
return nil, err
110111
}
111112

112113
dag.AddLeaf(leaf, encoder, nil)
113114

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
116120
}
117121

118122
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
147151
return nil, err
148152
}
149153

150-
label := builder.GetNextAvailableLabel()
154+
label := dag.GetNextAvailableLabel()
151155
builder.AddLink(label, chunkLeaf.Hash)
152156
chunkLeaf.SetLabel(label)
153157
dag.AddLeaf(chunkLeaf, encoder, nil)
@@ -180,23 +184,14 @@ func processEntry(entry fs.FileInfo, path *string, dag *DagBuilder, encoder mult
180184
return nil, err
181185
}
182186

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-
192187
for _, entry := range entries {
193188
if entry.Name() != ".meta" {
194189
leaf, err := processEntry(entry, &entryPath, dag, encoder)
195190
if err != nil {
196191
return nil, err
197192
}
198193

199-
label := builder.GetNextAvailableLabel()
194+
label := dag.GetNextAvailableLabel()
200195
builder.AddLink(label, leaf.Hash)
201196
leaf.SetLabel(label)
202197
dag.AddLeaf(leaf, encoder, nil)
@@ -227,7 +222,7 @@ func processEntry(entry fs.FileInfo, path *string, dag *DagBuilder, encoder mult
227222
return nil, err
228223
}
229224

230-
label := builder.GetNextAvailableLabel()
225+
label := dag.GetNextAvailableLabel()
231226
builder.AddLink(label, chunkLeaf.Hash)
232227
chunkLeaf.SetLabel(label)
233228
dag.AddLeaf(chunkLeaf, encoder, nil)
@@ -260,7 +255,8 @@ func chunkFile(fileData []byte, chunkSize int) [][]byte {
260255

261256
func CreateDagBuilder() *DagBuilder {
262257
return &DagBuilder{
263-
Leafs: map[string]*DagLeaf{},
258+
Labels: map[string]string{},
259+
Leafs: map[string]*DagLeaf{},
264260
}
265261
}
266262

@@ -271,6 +267,8 @@ func (b *DagBuilder) AddLeaf(leaf *DagLeaf, encoder multibase.Encoder, parentLea
271267
if !exists {
272268
parentLeaf.AddLink(leaf.Hash)
273269
}
270+
271+
b.Labels[label] = leaf.Hash
274272
}
275273

276274
b.Leafs[leaf.Hash] = leaf
@@ -280,22 +278,34 @@ func (b *DagBuilder) AddLeaf(leaf *DagLeaf, encoder multibase.Encoder, parentLea
280278

281279
func (b *DagBuilder) BuildDag(root string) *Dag {
282280
return &Dag{
283-
Leafs: b.Leafs,
284-
Root: root,
281+
Leafs: b.Leafs,
282+
Labels: b.Labels,
283+
Root: root,
285284
}
286285
}
287286

288287
func (dag *Dag) Verify(encoder multibase.Encoder) (bool, error) {
289288
result := true
290289

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+
}
296305

297-
if !leafResult {
298-
result = false
306+
if !leafResult {
307+
return false, nil
308+
}
299309
}
300310
}
301311

@@ -332,7 +342,8 @@ func (dag *Dag) CreateDirectory(path string, encoder multibase.Encoder) error {
332342

333343
/*
334344
if runtime.GOOS == "windows" {
335-
p, err := syscall.UTF16PtrFromString(fileName)
345+
p, err := syscal
346+
l.UTF16PtrFromString(fileName)
336347
if err != nil {
337348
log.Fatal(err)
338349
}
@@ -363,9 +374,40 @@ func ReadDag(path string) (*Dag, error) {
363374
return nil, fmt.Errorf("could not decode Dag: %w", err)
364375
}
365376

377+
result.GenerateLabelMap()
378+
366379
return &result, nil
367380
}
368381

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+
369411
func (dag *Dag) FindLeafByHash(hash string) *DagLeaf {
370412
leaf, result := dag.Leafs[hash]
371413
if result {
@@ -398,7 +440,13 @@ func (dag *Dag) DeleteLeaf(leaf *DagLeaf, encoder multibase.Encoder) error {
398440
return fmt.Errorf("Parent leaf does not exist")
399441
}
400442

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)
402450
if err != nil {
403451
return err
404452
}
@@ -407,11 +455,18 @@ func (dag *Dag) DeleteLeaf(leaf *DagLeaf, encoder multibase.Encoder) error {
407455

408456
delete(dag.Leafs, leaf.Hash)
409457

458+
err = dag.WriteToMetaLeaf(label, encoder)
459+
if err != nil {
460+
return err
461+
}
462+
410463
root, err := dag.RegenerateDag(parentLeaf, encoder)
411464
if err != nil {
412465
return err
413466
}
414467

468+
dag.GenerateLabelMap()
469+
415470
dag.Root = *root
416471

417472
return nil
@@ -503,7 +558,92 @@ func (dag *Dag) RemoveChildren(leaf *DagLeaf, encoder multibase.Encoder) {
503558
}
504559
}
505560

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+
507647
func (dag *Dag) DoesExistMoreThanOnce(hash string) bool {
508648
count := 0
509649

0 commit comments

Comments
 (0)