/
request.go
77 lines (65 loc) · 1.88 KB
/
request.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
package cliftondbserver
import (
"encoding/binary"
"errors"
"github.com/zl14917/MastersProject/api/internal_request"
"sync/atomic"
"unsafe"
)
type RequestIdGenerator interface {
NextId() uint64
}
type requestIdGenerator struct {
current uint64
}
func NewRequestIdGenerator(initial uint64) RequestIdGenerator {
g := &requestIdGenerator{
current: initial,
}
return g
}
func (g *requestIdGenerator) NextId() uint64 {
v := atomic.AddUint64(&g.current, 1)
return v
}
type RequestBuilder struct {
idGenerator RequestIdGenerator
}
func NewRequestBuilder(gen RequestIdGenerator) *RequestBuilder {
return &RequestBuilder{}
}
func (b *RequestBuilder) NewGetRequest(key []byte) *internal_request.InternalRequest {
nextId := b.idGenerator.NextId()
req := &internal_request.InternalRequest{
Request: &internal_request.InternalRequest_GetReq{GetReq: &internal_request.GetReq{Key: key}},
Header: &internal_request.RequestHeader{
ID: nextId,
},
}
return req
}
func (b *RequestBuilder) NewPutRequest(key []byte, value []byte) *internal_request.InternalRequest {
nextId := b.idGenerator.NextId()
req := &internal_request.InternalRequest{
Request: &internal_request.InternalRequest_PutReq{&internal_request.PutReq{Key: key, Value: value}},
Header: &internal_request.RequestHeader{ID: nextId},
}
return req
}
func (b *RequestBuilder) NewDeleteRequest(key []byte) *internal_request.InternalRequest {
nextId := b.idGenerator.NextId()
req := &internal_request.InternalRequest{
Request: &internal_request.InternalRequest_DeleteReq{&internal_request.DeleteReq{Key: key}},
Header: &internal_request.RequestHeader{ID: nextId},
}
return req
}
func IdAsBytes(id uint64, buffer []byte) {
if len(buffer) < int(unsafe.Sizeof(id)) {
panic(errors.New("buffer too small"))
}
binary.BigEndian.PutUint64(buffer, id)
}
func BytesAsId(buffer []byte) uint64 {
return binary.BigEndian.Uint64(buffer)
}