forked from spacemeshos/go-spacemesh
-
Notifications
You must be signed in to change notification settings - Fork 0
/
table.go
81 lines (68 loc) · 1.93 KB
/
table.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
package post
const (
s = 65536 // 137438953472 // number of entries (factor 1) - must be 2^H for some H
e = 8 // bits - entry size
)
// Table is a simple binary data table backed by a data file in local store.
type Table interface {
read(off int64, out []byte) error // read len(out) bytes at offset off from the table
seek(off int64) error
write(data []byte) error // write data at current offset and increases offset
sync() error // syncs all writes to disk
deleteAllData() error // delete all existing data from the table
}
type tableImpl struct {
id string
size int64
entries int64
dir string
dataFile dataFile
}
// NewTable creates a new post data table.
// id: node id - base58 encoded key
// dir: node data dir directory
// mul: table size factor, e.g. 2 for x2 of min table size of S*E
func NewTable(mul int, id string, dir string) (Table, error) {
size := s * int64(mul)
entries := size / e
dataFile := newDataFile(dir)
// for now always delete the file if it exists and create a new one
if dataFile.exists() {
err := dataFile.delete()
if err != nil {
return nil, err
}
}
if !dataFile.exists() {
err := dataFile.create()
if err != nil {
return nil, err
}
}
t := &tableImpl{id: id, size: size, entries: entries, dir: dir, dataFile: dataFile}
return t, nil
}
// Deletes all data
func (d *tableImpl) deleteAllData() error {
err := d.dataFile.delete()
if err != nil {
return err
}
return d.dataFile.create()
}
// Writes data at current table offset
func (d *tableImpl) write(data []byte) error {
return d.dataFile.write(data)
}
// Seeks to a new offset relative to 0
func (d *tableImpl) seek(off int64) error {
return d.dataFile.seek(off)
}
// Saves all writes to data file on disk
func (d *tableImpl) sync() error {
return d.dataFile.sync()
}
// Reads len(out) bytes at offset
func (d *tableImpl) read(off int64, out []byte) error {
return d.dataFile.read(off, out)
}