-
Notifications
You must be signed in to change notification settings - Fork 14
/
ledger_frontier.go
92 lines (81 loc) · 2.34 KB
/
ledger_frontier.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
package ledger
import (
"fmt"
"sort"
"github.com/qlcchain/go-qlc/common/storage"
"github.com/qlcchain/go-qlc/common/types"
)
type FrontierStore interface {
AddFrontier(frontier *types.Frontier, c storage.Cache) error
DeleteFrontier(key types.Hash, c storage.Cache) error
GetFrontier(hash types.Hash, cache ...storage.Cache) (*types.Frontier, error)
GetFrontiers() ([]*types.Frontier, error)
CountFrontiers() (uint64, error)
}
func (l *Ledger) GetFrontier(hash types.Hash, c ...storage.Cache) (*types.Frontier, error) {
k, err := storage.GetKeyOfParts(storage.KeyPrefixFrontier, hash)
if err != nil {
return nil, err
}
frontier := types.Frontier{HeaderBlock: hash}
if r, err := l.getFromCache(k, c...); r != nil {
h := r.(*types.Hash)
frontier.OpenBlock = *h
return &frontier, nil
} else {
if err == ErrKeyDeleted {
return nil, ErrFrontierNotFound
}
}
v, err := l.store.Get(k)
if err != nil {
if err == storage.KeyNotFound {
return nil, ErrFrontierNotFound
}
return nil, err
}
open := new(types.Hash)
if err := open.Deserialize(v); err != nil {
return nil, fmt.Errorf("frontier deserialize: %s", err)
}
frontier.OpenBlock = *open
return &frontier, nil
}
func (l *Ledger) GetFrontiers() ([]*types.Frontier, error) {
var frontiers []*types.Frontier
prefix, _ := storage.GetKeyOfParts(storage.KeyPrefixFrontier)
err := l.store.Iterator(prefix, nil, func(key []byte, val []byte) error {
var frontier types.Frontier
copy(frontier.HeaderBlock[:], key[1:])
open := new(types.Hash)
if err := open.Deserialize(val); err != nil {
return fmt.Errorf("frontier deserialize: %s", err)
}
frontier.OpenBlock = *open
frontiers = append(frontiers, &frontier)
return nil
})
if err != nil {
return nil, err
}
sort.Sort(types.Frontiers(frontiers))
return frontiers, nil
}
func (l *Ledger) CountFrontiers() (uint64, error) {
return l.store.Count([]byte{byte(storage.KeyPrefixFrontier)})
}
func (l *Ledger) AddFrontier(frontier *types.Frontier, c storage.Cache) error {
v := frontier.OpenBlock
k, err := storage.GetKeyOfParts(storage.KeyPrefixFrontier, frontier.HeaderBlock)
if err != nil {
return err
}
return c.Put(k, &v)
}
func (l *Ledger) DeleteFrontier(key types.Hash, c storage.Cache) error {
k, err := storage.GetKeyOfParts(storage.KeyPrefixFrontier, key)
if err != nil {
return err
}
return c.Delete(k)
}