-
Notifications
You must be signed in to change notification settings - Fork 4
/
zentry.go
81 lines (65 loc) · 2.02 KB
/
zentry.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 bubt
import "encoding/binary"
const (
zflagDeleted byte = 0x1
zflagVlog byte = 0x2
)
// zentry represents the binary layout of each entry in the leaf(z) block.
// hdr1: flags[64:60] seqno[60:0]
// hdr2: 8 bytes // key-len
// hdr3: 8 bytes // value-len
// byte array of key
// 8-byte fpos into value log, if value is present, and stored in value-log.
// or byte array of value, if value is present.
type zentry []byte // key, and optionally value shall follow.
const zentrysize = 24
func (ze zentry) setdeleted() zentry {
hdr1 := binary.BigEndian.Uint64(ze[:8])
binary.BigEndian.PutUint64(ze[:8], hdr1|(uint64(zflagDeleted)<<60))
return ze
}
func (ze zentry) cleardeleted() zentry {
hdr1 := binary.BigEndian.Uint64(ze[:8])
binary.BigEndian.PutUint64(ze[:8], hdr1&(^(uint64(zflagDeleted) << 60)))
return ze
}
func (ze zentry) isdeleted() bool {
return ((binary.BigEndian.Uint64(ze[:8]) >> 60) & uint64(zflagDeleted)) != 0
}
func (ze zentry) setvlog() zentry {
hdr1 := binary.BigEndian.Uint64(ze[:8])
binary.BigEndian.PutUint64(ze[:8], hdr1|(uint64(zflagVlog)<<60))
return ze
}
func (ze zentry) clearvlog() zentry {
hdr1 := binary.BigEndian.Uint64(ze[:8])
binary.BigEndian.PutUint64(ze[:8], hdr1&(^(uint64(zflagVlog) << 60)))
return ze
}
func (ze zentry) isvlog() bool {
return ((binary.BigEndian.Uint64(ze[:8]) >> 60) & uint64(zflagVlog)) != 0
}
func (ze zentry) setseqno(seqno uint64) zentry {
hdr1 := binary.BigEndian.Uint64(ze[:8])
hdr1 = (hdr1 & 0xF000000000000000) | seqno
binary.BigEndian.PutUint64(ze[:8], hdr1)
return ze
}
func (ze zentry) seqno() uint64 {
hdr1 := binary.BigEndian.Uint64(ze[:8])
return hdr1 & 0x0FFFFFFFFFFFFFFF
}
func (ze zentry) setkeylen(keylen uint64) zentry {
binary.BigEndian.PutUint64(ze[8:16], keylen)
return ze
}
func (ze zentry) keylen() uint64 {
return binary.BigEndian.Uint64(ze[8:16])
}
func (ze zentry) setvaluelen(keylen uint64) zentry {
binary.BigEndian.PutUint64(ze[16:24], keylen)
return ze
}
func (ze zentry) valuelen() uint64 {
return binary.BigEndian.Uint64(ze[16:24])
}