Skip to content

Commit b54858d

Browse files
committed
codec: implement codec v2
1 parent 615f978 commit b54858d

File tree

3 files changed

+69
-23
lines changed

3 files changed

+69
-23
lines changed

codec/grpc/grpc_codec.go

Lines changed: 48 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,65 @@
11
package grpc
22

3-
import "fmt"
3+
import (
4+
"google.golang.org/grpc/encoding"
5+
"google.golang.org/grpc/mem"
6+
7+
// Guarantee that the built-in proto is called registered before this one
8+
// so that it can be replaced.
9+
_ "google.golang.org/grpc/encoding/proto"
10+
)
411

512
// Name is the name registered for the proto compressor.
613
const Name = "proto"
714

8-
type Codec struct{}
9-
1015
type vtprotoMessage interface {
11-
MarshalVT() ([]byte, error)
16+
MarshalToVT(data []byte) (int, error)
1217
UnmarshalVT([]byte) error
18+
SizeVT() int
19+
}
20+
21+
type Codec struct {
22+
fallback encoding.CodecV2
1323
}
1424

15-
func (Codec) Marshal(v interface{}) ([]byte, error) {
16-
vt, ok := v.(vtprotoMessage)
17-
if !ok {
18-
return nil, fmt.Errorf("failed to marshal, message is %T (missing vtprotobuf helpers)", v)
25+
func (Codec) Name() string { return Name }
26+
27+
func (c *Codec) Marshal(v any) (data mem.BufferSlice, err error) {
28+
if m, ok := v.(vtprotoMessage); ok {
29+
size := m.SizeVT()
30+
if mem.IsBelowBufferPoolingThreshold(size) {
31+
buf := make([]byte, 0, size)
32+
if _, err := m.MarshalToVT(buf[:0]); err != nil {
33+
return nil, err
34+
}
35+
data = append(data, mem.SliceBuffer(buf))
36+
} else {
37+
pool := mem.DefaultBufferPool()
38+
buf := pool.Get(size)
39+
if _, err := m.MarshalToVT((*buf)[:0]); err != nil {
40+
pool.Put(buf)
41+
return nil, err
42+
}
43+
data = append(data, mem.NewBuffer(buf, pool))
44+
}
45+
return data, nil
1946
}
20-
return vt.MarshalVT()
47+
48+
return c.fallback.Marshal(v)
2149
}
2250

23-
func (Codec) Unmarshal(data []byte, v interface{}) error {
24-
vt, ok := v.(vtprotoMessage)
25-
if !ok {
26-
return fmt.Errorf("failed to unmarshal, message is %T (missing vtprotobuf helpers)", v)
51+
func (c *Codec) Unmarshal(data mem.BufferSlice, v any) error {
52+
if m, ok := v.(vtprotoMessage); ok {
53+
buf := data.MaterializeToBuffer(mem.DefaultBufferPool())
54+
defer buf.Free()
55+
return m.UnmarshalVT(buf.ReadOnlyData())
2756
}
28-
return vt.UnmarshalVT(data)
57+
58+
return c.fallback.Unmarshal(data, v)
2959
}
3060

31-
func (Codec) Name() string {
32-
return Name
61+
func init() {
62+
encoding.RegisterCodecV2(&Codec{
63+
fallback: encoding.GetCodecV2("proto"),
64+
})
3365
}

go.mod

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,22 @@
11
module github.com/planetscale/vtprotobuf
22

3-
go 1.20
3+
go 1.21
4+
5+
toolchain go1.23.0
46

57
require (
68
github.com/stretchr/testify v1.8.4
7-
google.golang.org/grpc v1.58.2
8-
google.golang.org/protobuf v1.31.0
9+
google.golang.org/grpc v1.67.0-dev.0.20240821211139-9ab8b62505c8
10+
google.golang.org/protobuf v1.34.2
911
)
1012

1113
require (
1214
github.com/davecgh/go-spew v1.1.1 // indirect
1315
github.com/golang/protobuf v1.5.3 // indirect
1416
github.com/pmezard/go-difflib v1.0.0 // indirect
15-
golang.org/x/net v0.14.0 // indirect
16-
golang.org/x/sys v0.11.0 // indirect
17-
golang.org/x/text v0.12.0 // indirect
18-
google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d // indirect
17+
golang.org/x/net v0.28.0 // indirect
18+
golang.org/x/sys v0.24.0 // indirect
19+
golang.org/x/text v0.17.0 // indirect
20+
google.golang.org/genproto/googleapis/rpc v0.0.0-20240814211410-ddb44dafa142 // indirect
1921
gopkg.in/yaml.v3 v3.0.1 // indirect
2022
)

go.sum

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,19 +11,31 @@ github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcU
1111
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
1212
golang.org/x/net v0.14.0 h1:BONx9s002vGdD9umnlX1Po8vOZmrgH34qlHcD1MfK14=
1313
golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI=
14+
golang.org/x/net v0.28.0 h1:a9JDOJc5GMUJ0+UDqmLT86WiEy7iWyIhz8gz8E4e5hE=
15+
golang.org/x/net v0.28.0/go.mod h1:yqtgsTWOOnlGLG9GFRrK3++bGOUEkNBoHZc8MEDWPNg=
1416
golang.org/x/sys v0.11.0 h1:eG7RXZHdqOJ1i+0lgLgCpSXAp6M3LYlAo6osgSi0xOM=
1517
golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
18+
golang.org/x/sys v0.24.0 h1:Twjiwq9dn6R1fQcyiK+wQyHWfaz/BJB+YIpzU/Cv3Xg=
19+
golang.org/x/sys v0.24.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
1620
golang.org/x/text v0.12.0 h1:k+n5B8goJNdU7hSvEtMUz3d1Q6D/XW4COJSJR6fN0mc=
1721
golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
22+
golang.org/x/text v0.17.0 h1:XtiM5bkSOt+ewxlOE/aE/AKEHibwj/6gvWMl9Rsh0Qc=
23+
golang.org/x/text v0.17.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY=
1824
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
1925
google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d h1:uvYuEyMHKNt+lT4K3bN6fGswmK8qSvcreM3BwjDh+y4=
2026
google.golang.org/genproto/googleapis/rpc v0.0.0-20230822172742-b8732ec3820d/go.mod h1:+Bk1OCOj40wS2hwAMA+aCW9ypzm63QTBBHp6lQ3p+9M=
27+
google.golang.org/genproto/googleapis/rpc v0.0.0-20240814211410-ddb44dafa142 h1:e7S5W7MGGLaSu8j3YjdezkZ+m1/Nm0uRVRMEMGk26Xs=
28+
google.golang.org/genproto/googleapis/rpc v0.0.0-20240814211410-ddb44dafa142/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU=
2129
google.golang.org/grpc v1.58.2 h1:SXUpjxeVF3FKrTYQI4f4KvbGD5u2xccdYdurwowix5I=
2230
google.golang.org/grpc v1.58.2/go.mod h1:tgX3ZQDlNJGU96V6yHh1T/JeoBQ2TXdr43YbYSsCJk0=
31+
google.golang.org/grpc v1.67.0-dev.0.20240821211139-9ab8b62505c8 h1:b61arqKMyICRrCxna/qIyjYGWlfem3U2iLpF7LMnDaU=
32+
google.golang.org/grpc v1.67.0-dev.0.20240821211139-9ab8b62505c8/go.mod h1:1gLDyUQU7CTLJI90u3nXZ9ekeghjeM7pTDZlqFNg2AA=
2333
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
2434
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
2535
google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8=
2636
google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
37+
google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg=
38+
google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw=
2739
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
2840
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
2941
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=

0 commit comments

Comments
 (0)