-
Notifications
You must be signed in to change notification settings - Fork 0
/
container.go
51 lines (43 loc) · 1.18 KB
/
container.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
package deks
import (
"encoding/binary"
"time"
"github.com/simia-tech/errx"
)
type container struct {
key []byte
value []byte
revision uint64
deletedAt time.Time
}
func (c *container) delete() {
c.deletedAt = time.Now()
}
func (c *container) undelete() {
c.deletedAt = time.Time{}
}
func (c *container) isDeleted() bool {
return !c.deletedAt.IsZero()
}
func (c *container) MarshalBinary() ([]byte, error) {
keyLength := uint16(len(c.key))
valueLength := len(c.value)
buffer := make([]byte, int(keyLength)+valueLength+20)
binary.BigEndian.PutUint64(buffer[:8], c.revision)
binary.BigEndian.PutUint64(buffer[8:16], uint64(c.deletedAt.Unix()))
binary.BigEndian.PutUint16(buffer[16:20], keyLength)
copy(buffer[20:20+keyLength], c.key)
copy(buffer[20+keyLength:], c.value)
return buffer, nil
}
func (c *container) UnmarshalBinary(data []byte) error {
if len(data) < 20 {
return errx.Errorf("need at least 20 bytes")
}
c.revision = binary.BigEndian.Uint64(data[:8])
c.deletedAt = time.Unix(int64(binary.BigEndian.Uint64(data[8:16])), 0)
keyLength := binary.BigEndian.Uint16(data[16:20])
c.key = data[20 : 20+keyLength]
c.value = data[20+keyLength:]
return nil
}