Skip to content

Commit

Permalink
migration: Use msgpack.v5 by default
Browse files Browse the repository at this point in the history
An user can continue to use msgpack.v2 with tag:
go_tarantool_msgpack_v2

There are two problems that cannot be unified:

- Different signature and logic of RegisterExt in msgpack.v2[1] and
msgpack.v5[2].
- Different logic of map decoding, see[3][4].

These issues have been fixed in msgpack.v5 implementation, see
msgpack.go and uuid/msgpack.go.

Files naming changed:
msgpack.go - msgpack.v5 usage for the code
msgpack_helper_test.go - msgpack.v5 usage for tests
msgpack_v2.go - msgpack.v2 usage for the code
msgpack_v2_helper_test.go - msgpack.v2 usage for tests

1. https://pkg.go.dev/github.com/vmihailenco/msgpack@v2.9.2+incompatible#RegisterExt
2. https://pkg.go.dev/github.com/vmihailenco/msgpack/v5#RegisterExt
3. vmihailenco/msgpack#327
4. https://msgpack.uptrace.dev/guide/#decoding-maps-into-an-interface/
  • Loading branch information
oleg-jukovec committed May 19, 2022
1 parent 29ae9a6 commit 6aee9ae
Show file tree
Hide file tree
Showing 14 changed files with 266 additions and 25 deletions.
1 change: 1 addition & 0 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -9,4 +9,5 @@ require (
google.golang.org/appengine v1.6.7 // indirect
gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f // indirect
gopkg.in/vmihailenco/msgpack.v2 v2.9.2
github.com/vmihailenco/msgpack/v5 v5.3.5
)
5 changes: 5 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,13 @@ github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLA
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.1 h1:5TQK59W5E3v0r2duFAb7P95B6hEeOyEnHRa8MjYSMTY=
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/vmihailenco/msgpack/v5 v5.3.5 h1:5gO0H1iULLWGhs2H5tbAHIZTV8/cYafcFOr9znI5mJU=
github.com/vmihailenco/msgpack/v5 v5.3.5/go.mod h1:7xyJ9e+0+9SaZT0Wt1RGleJXzli6Q/V5KbhBonMG9jc=
github.com/vmihailenco/tagparser/v2 v2.0.0 h1:y09buUbR+b5aycVFQs/g70pqKVZNBmxwAhO7/IwNM9g=
github.com/vmihailenco/tagparser/v2 v2.0.0/go.mod h1:Wri+At7QHww0WTrCBeu4J6bNtoV6mEfg5OIWRZA9qds=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/net v0.0.0-20190603091049-60506f45cf65 h1:+rhAzEzT3f4JtomfC371qB+0Ola2caSKcY69NUBZrRQ=
golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
Expand Down
36 changes: 21 additions & 15 deletions msgpack.go
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
//go:build !go_tarantool_msgpack_v2
// +build !go_tarantool_msgpack_v2

package tarantool

import (
"io"

"gopkg.in/vmihailenco/msgpack.v2"
msgpcode "gopkg.in/vmihailenco/msgpack.v2/codes"
"github.com/vmihailenco/msgpack/v5"
"github.com/vmihailenco/msgpack/v5/msgpcode"
)

type Encoder struct {
Expand All @@ -22,15 +25,18 @@ func newEncoder(w io.Writer) *Encoder {

func newDecoder(r io.Reader) *Decoder {
dec := msgpack.NewDecoder(r)
dec.SetMapDecoder(func(dec *msgpack.Decoder) (interface{}, error) {
return dec.DecodeUntypedMap()
})
return &Decoder{Decoder: dec}
}

func (e *Encoder) encodeUintImpl(v uint64) error {
return e.EncodeUint(uint(v))
return e.EncodeUint(v)
}

func (e *Encoder) encodeIntImpl(v int64) error {
return e.EncodeInt(int(v))
return e.EncodeInt(v)
}

func msgpackIsUint(code byte) bool {
Expand All @@ -54,45 +60,45 @@ func msgpackIsString(code byte) bool {
}

func (s *single) DecodeMsgpack(d *msgpack.Decoder) error {
return s.decodeMsgpackImpl(&Decoder{d})
return s.decodeMsgpackImpl(&Decoder{Decoder: d})
}

func (space *Space) DecodeMsgpack(d *msgpack.Decoder) error {
return space.decodeMsgpackImpl(&Decoder{d})
return space.decodeMsgpackImpl(&Decoder{Decoder: d})
}

func (field *Field) DecodeMsgpack(d *msgpack.Decoder) error {
return field.decodeMsgpackImpl(&Decoder{d})
return field.decodeMsgpackImpl(&Decoder{Decoder: d})
}

func (index *Index) DecodeMsgpack(d *msgpack.Decoder) error {
return index.decodeMsgpackImpl(&Decoder{d})
return index.decodeMsgpackImpl(&Decoder{Decoder: d})
}

func (indexField *IndexField) DecodeMsgpack(d *msgpack.Decoder) error {
return indexField.decodeMsgpackImpl(&Decoder{d})
return indexField.decodeMsgpackImpl(&Decoder{Decoder: d})
}

func (k IntKey) EncodeMsgpack(enc *msgpack.Encoder) error {
return k.encodeMsgpackImpl(&Encoder{enc})
return k.encodeMsgpackImpl(&Encoder{Encoder: enc})
}

func (k UintKey) EncodeMsgpack(enc *msgpack.Encoder) error {
return k.encodeMsgpackImpl(&Encoder{enc})
return k.encodeMsgpackImpl(&Encoder{Encoder: enc})
}

func (k StringKey) EncodeMsgpack(enc *msgpack.Encoder) error {
return k.encodeMsgpackImpl(&Encoder{enc})
return k.encodeMsgpackImpl(&Encoder{Encoder: enc})
}

func (k IntIntKey) EncodeMsgpack(enc *msgpack.Encoder) error {
return k.encodeMsgpackImpl(&Encoder{enc})
return k.encodeMsgpackImpl(&Encoder{Encoder: enc})
}

func (o Op) EncodeMsgpack(enc *msgpack.Encoder) error {
return o.encodeMsgpackImpl(&Encoder{enc})
return o.encodeMsgpackImpl(&Encoder{Encoder: enc})
}

func (o OpSplice) EncodeMsgpack(enc *msgpack.Encoder) error {
return o.encodeMsgpackImpl(&Encoder{enc})
return o.encodeMsgpackImpl(&Encoder{Encoder: enc})
}
13 changes: 8 additions & 5 deletions msgpack_helper_test.go
Original file line number Diff line number Diff line change
@@ -1,22 +1,25 @@
//go:build !go_tarantool_msgpack_v2
// +build !go_tarantool_msgpack_v2

package tarantool_test

import (
. "github.com/tarantool/go-tarantool"
"gopkg.in/vmihailenco/msgpack.v2"
"github.com/vmihailenco/msgpack/v5"
)

func (m *Member) EncodeMsgpack(e *msgpack.Encoder) error {
return m.encodeMsgpackImpl(&Encoder{e})
return m.encodeMsgpackImpl(&Encoder{Encoder: e})
}

func (m *Member) DecodeMsgpack(d *msgpack.Decoder) error {
return m.decodeMsgpackImpl(&Decoder{d})
return m.decodeMsgpackImpl(&Decoder{Decoder: d})
}

func (c *Tuple2) EncodeMsgpack(e *msgpack.Encoder) error {
return c.encodeMsgpackImpl(&Encoder{e})
return c.encodeMsgpackImpl(&Encoder{Encoder: e})
}

func (c *Tuple2) DecodeMsgpack(d *msgpack.Decoder) error {
return c.decodeMsgpackImpl(&Decoder{d})
return c.decodeMsgpackImpl(&Decoder{Decoder: d})
}
101 changes: 101 additions & 0 deletions msgpack_v2.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,101 @@
//go:build go_tarantool_msgpack_v2
// +build go_tarantool_msgpack_v2

package tarantool

import (
"io"

"gopkg.in/vmihailenco/msgpack.v2"
msgpcode "gopkg.in/vmihailenco/msgpack.v2/codes"
)

type Encoder struct {
*msgpack.Encoder
}

type Decoder struct {
*msgpack.Decoder
}

func newEncoder(w io.Writer) *Encoder {
enc := msgpack.NewEncoder(w)
return &Encoder{Encoder: enc}
}

func newDecoder(r io.Reader) *Decoder {
dec := msgpack.NewDecoder(r)
return &Decoder{Decoder: dec}
}

func (e *Encoder) encodeUintImpl(v uint64) error {
return e.EncodeUint(uint(v))
}

func (e *Encoder) encodeIntImpl(v int64) error {
return e.EncodeInt(int(v))
}

func msgpackIsUint(code byte) bool {
return code == msgpcode.Uint8 || code == msgpcode.Uint16 ||
code == msgpcode.Uint32 || code == msgpcode.Uint64 ||
msgpcode.IsFixedNum(code)
}

func msgpackIsMap(code byte) bool {
return code == msgpcode.Map16 || code == msgpcode.Map32 || msgpcode.IsFixedMap(code)
}

func msgpackIsArray(code byte) bool {
return code == msgpcode.Array16 || code == msgpcode.Array32 ||
msgpcode.IsFixedArray(code)
}

func msgpackIsString(code byte) bool {
return msgpcode.IsFixedString(code) || code == msgpcode.Str8 ||
code == msgpcode.Str16 || code == msgpcode.Str32
}

func (s *single) DecodeMsgpack(d *msgpack.Decoder) error {
return s.decodeMsgpackImpl(&Decoder{Decoder: d})
}

func (space *Space) DecodeMsgpack(d *msgpack.Decoder) error {
return space.decodeMsgpackImpl(&Decoder{Decoder: d})
}

func (field *Field) DecodeMsgpack(d *msgpack.Decoder) error {
return field.decodeMsgpackImpl(&Decoder{Decoder: d})
}

func (index *Index) DecodeMsgpack(d *msgpack.Decoder) error {
return index.decodeMsgpackImpl(&Decoder{Decoder: d})
}

func (indexField *IndexField) DecodeMsgpack(d *msgpack.Decoder) error {
return indexField.decodeMsgpackImpl(&Decoder{Decoder: d})
}

func (k IntKey) EncodeMsgpack(enc *msgpack.Encoder) error {
return k.encodeMsgpackImpl(&Encoder{Encoder: enc})
}

func (k UintKey) EncodeMsgpack(enc *msgpack.Encoder) error {
return k.encodeMsgpackImpl(&Encoder{Encoder: enc})
}

func (k StringKey) EncodeMsgpack(enc *msgpack.Encoder) error {
return k.encodeMsgpackImpl(&Encoder{Encoder: enc})
}

func (k IntIntKey) EncodeMsgpack(enc *msgpack.Encoder) error {
return k.encodeMsgpackImpl(&Encoder{Encoder: enc})
}

func (o Op) EncodeMsgpack(enc *msgpack.Encoder) error {
return o.encodeMsgpackImpl(&Encoder{Encoder: enc})
}

func (o OpSplice) EncodeMsgpack(enc *msgpack.Encoder) error {
return o.encodeMsgpackImpl(&Encoder{Encoder: enc})
}
25 changes: 25 additions & 0 deletions msgpack_v2_helper_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
//go:build go_tarantool_msgpack_v2
// +build go_tarantool_msgpack_v2

package tarantool_test

import (
. "github.com/tarantool/go-tarantool"
"gopkg.in/vmihailenco/msgpack.v2"
)

func (m *Member) EncodeMsgpack(e *msgpack.Encoder) error {
return m.encodeMsgpackImpl(&Encoder{Encoder: e})
}

func (m *Member) DecodeMsgpack(d *msgpack.Decoder) error {
return m.decodeMsgpackImpl(&Decoder{Decoder: d})
}

func (c *Tuple2) EncodeMsgpack(e *msgpack.Encoder) error {
return c.encodeMsgpackImpl(&Encoder{Encoder: e})
}

func (c *Tuple2) DecodeMsgpack(d *msgpack.Decoder) error {
return c.decodeMsgpackImpl(&Decoder{Decoder: d})
}
5 changes: 4 additions & 1 deletion queue/msgpack.go
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
//go:build !go_tarantool_msgpack_v2
// +build !go_tarantool_msgpack_v2

package queue

import (
"github.com/tarantool/go-tarantool"
"gopkg.in/vmihailenco/msgpack.v2"
"github.com/vmihailenco/msgpack/v5"
)

func (qd *queueData) DecodeMsgpack(d *msgpack.Decoder) error {
Expand Down
5 changes: 4 additions & 1 deletion queue/msgpack_helper_test.go
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
//go:build !go_tarantool_msgpack_v2
// +build !go_tarantool_msgpack_v2

package queue_test

import (
. "github.com/tarantool/go-tarantool"
"gopkg.in/vmihailenco/msgpack.v2"
"github.com/vmihailenco/msgpack/v5"
)

func (c *customData) DecodeMsgpack(d *msgpack.Decoder) error {
Expand Down
17 changes: 17 additions & 0 deletions queue/msgpack_v2.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
//go:build go_tarantool_msgpack_v2
// +build go_tarantool_msgpack_v2

package queue

import (
"github.com/tarantool/go-tarantool"
"gopkg.in/vmihailenco/msgpack.v2"
)

func (qd *queueData) DecodeMsgpack(d *msgpack.Decoder) error {
return qd.decodeMsgpackImpl(&tarantool.Decoder{Decoder: d})
}

func (t *Task) DecodeMsgpack(d *msgpack.Decoder) error {
return t.decodeMsgpackImpl(&tarantool.Decoder{Decoder: d})
}
25 changes: 25 additions & 0 deletions queue/msgpack_v2_helper_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
//go:build go_tarantool_msgpack_v2
// +build go_tarantool_msgpack_v2

package queue_test

import (
. "github.com/tarantool/go-tarantool"
"gopkg.in/vmihailenco/msgpack.v2"
)

func (c *customData) DecodeMsgpack(d *msgpack.Decoder) error {
return c.decodeMsgpackImpl(&Decoder{Decoder: d})
}

func (c *customData) EncodeMsgpack(e *msgpack.Encoder) error {
return c.encodeMsgpackImpl(&Encoder{Encoder: e})
}

func (c *dummyData) DecodeMsgpack(d *msgpack.Decoder) error {
return c.decodeMsgpackImpl(&Decoder{Decoder: d})
}

func (c *dummyData) EncodeMsgpack(e *msgpack.Encoder) error {
return c.encodeMsgpackImpl(&Encoder{Encoder: e})
}
15 changes: 13 additions & 2 deletions uuid/msgpack.go
Original file line number Diff line number Diff line change
@@ -1,11 +1,14 @@
//go:build !go_tarantool_msgpack_v2
// +build !go_tarantool_msgpack_v2

package uuid

import (
"reflect"

"github.com/google/uuid"
. "github.com/tarantool/go-tarantool"
"gopkg.in/vmihailenco/msgpack.v2"
"github.com/vmihailenco/msgpack/v5"
)

func encodeUUID(e *msgpack.Encoder, v reflect.Value) error {
Expand All @@ -18,5 +21,13 @@ func decodeUUID(d *msgpack.Decoder, v reflect.Value) error {

func init() {
msgpack.Register(reflect.TypeOf((*uuid.UUID)(nil)).Elem(), encodeUUID, decodeUUID)
msgpack.RegisterExt(UUID_extId, (*uuid.UUID)(nil))
msgpack.RegisterExtEncoder(UUID_extId, uuid.UUID{},
func(e *msgpack.Encoder, v reflect.Value) ([]byte, error) {
uuid := v.Interface().(uuid.UUID)
return uuid.MarshalBinary()
})
msgpack.RegisterExtDecoder(UUID_extId, uuid.UUID{},
func(d *msgpack.Decoder, v reflect.Value, extLen int) error {
return decodeUUID(d, v)
})
}
5 changes: 4 additions & 1 deletion uuid/msgpack_helper_test.go
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
//go:build !go_tarantool_msgpack_v2
// +build !go_tarantool_msgpack_v2

package uuid_test

import (
. "github.com/tarantool/go-tarantool"
"gopkg.in/vmihailenco/msgpack.v2"
"github.com/vmihailenco/msgpack/v5"
)

func (t *TupleUUID) DecodeMsgpack(d *msgpack.Decoder) error {
Expand Down

0 comments on commit 6aee9ae

Please sign in to comment.