-
Notifications
You must be signed in to change notification settings - Fork 669
/
prefixed_state.go
129 lines (91 loc) · 3.08 KB
/
prefixed_state.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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
// (c) 2019-2020, Ava Labs, Inc. All rights reserved.
// See the file LICENSE for licensing terms.
package queue
import (
"github.com/ava-labs/avalanchego/database"
"github.com/ava-labs/avalanchego/ids"
"github.com/ava-labs/avalanchego/utils/hashing"
"github.com/ava-labs/avalanchego/utils/wrappers"
)
// Constants
const (
stackSizeID byte = iota
stackID
jobID
blockingID
)
var (
stackSize = []byte{stackSizeID}
)
type prefixedState struct{ state }
func (ps *prefixedState) SetStackSize(db database.Database, size uint32) error {
return ps.state.SetInt(db, stackSize, size)
}
func (ps *prefixedState) StackSize(db database.Database) (uint32, error) {
return ps.state.Int(db, stackSize)
}
func (ps *prefixedState) SetStackIndex(db database.Database, index uint32, job Job) error {
p := wrappers.Packer{Bytes: make([]byte, 1+wrappers.IntLen)}
p.PackByte(stackID)
p.PackInt(index)
return ps.state.SetJob(db, p.Bytes, job)
}
func (ps *prefixedState) DeleteStackIndex(db database.Database, index uint32) error {
p := wrappers.Packer{Bytes: make([]byte, 1+wrappers.IntLen)}
p.PackByte(stackID)
p.PackInt(index)
return db.Delete(p.Bytes)
}
func (ps *prefixedState) StackIndex(db database.Database, index uint32) (Job, error) {
p := wrappers.Packer{Bytes: make([]byte, 1+wrappers.IntLen)}
p.PackByte(stackID)
p.PackInt(index)
return ps.state.Job(db, p.Bytes)
}
func (ps *prefixedState) SetJob(db database.Database, job Job) error {
p := wrappers.Packer{Bytes: make([]byte, 1+hashing.HashLen)}
p.PackByte(jobID)
p.PackFixedBytes(job.ID().Bytes())
return ps.state.SetJob(db, p.Bytes, job)
}
func (ps *prefixedState) HasJob(db database.Database, id ids.ID) (bool, error) {
p := wrappers.Packer{Bytes: make([]byte, 1+hashing.HashLen)}
p.PackByte(jobID)
p.PackFixedBytes(id.Bytes())
return db.Has(p.Bytes)
}
func (ps *prefixedState) DeleteJob(db database.Database, id ids.ID) error {
p := wrappers.Packer{Bytes: make([]byte, 1+hashing.HashLen)}
p.PackByte(jobID)
p.PackFixedBytes(id.Bytes())
return db.Delete(p.Bytes)
}
func (ps *prefixedState) Job(db database.Database, id ids.ID) (Job, error) {
p := wrappers.Packer{Bytes: make([]byte, 1+hashing.HashLen)}
p.PackByte(jobID)
p.PackFixedBytes(id.Bytes())
return ps.state.Job(db, p.Bytes)
}
func (ps *prefixedState) AddBlocking(db database.Database, id ids.ID, blocking ids.ID) error {
p := wrappers.Packer{Bytes: make([]byte, 1+hashing.HashLen)}
p.PackByte(blockingID)
p.PackFixedBytes(id.Bytes())
return ps.state.AddID(db, p.Bytes, blocking)
}
func (ps *prefixedState) DeleteBlocking(db database.Database, id ids.ID, blocking []ids.ID) error {
p := wrappers.Packer{Bytes: make([]byte, 1+hashing.HashLen)}
p.PackByte(blockingID)
p.PackFixedBytes(id.Bytes())
for _, blocked := range blocking {
if err := ps.state.RemoveID(db, p.Bytes, blocked); err != nil {
return err
}
}
return nil
}
func (ps *prefixedState) Blocking(db database.Database, id ids.ID) ([]ids.ID, error) {
p := wrappers.Packer{Bytes: make([]byte, 1+hashing.HashLen)}
p.PackByte(blockingID)
p.PackFixedBytes(id.Bytes())
return ps.state.IDs(db, p.Bytes)
}