Skip to content

Commit a49e426

Browse files
committed
code health: extract a msgpack code from the code and tests
The patch replaces the msgpack code by internal wrappers. The msgpack usage have been extracted to msgpack.go file for the code and to msgpack_helper_test.go for tests. It is the same logic for submodules. Part of #124
1 parent 831d12f commit a49e426

33 files changed

+296
-220
lines changed

client_tools.go

+6-10
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,12 @@
11
package tarantool
22

3-
import (
4-
"gopkg.in/vmihailenco/msgpack.v2"
5-
)
6-
73
// IntKey is utility type for passing integer key to Select*, Update* and Delete*.
84
// It serializes to array with single integer element.
95
type IntKey struct {
106
I int
117
}
128

13-
func (k IntKey) EncodeMsgpack(enc *msgpack.Encoder) error {
9+
func (k IntKey) EncodeMsgpack(enc *encoder) error {
1410
enc.EncodeArrayLen(1)
1511
enc.EncodeInt(k.I)
1612
return nil
@@ -22,7 +18,7 @@ type UintKey struct {
2218
I uint
2319
}
2420

25-
func (k UintKey) EncodeMsgpack(enc *msgpack.Encoder) error {
21+
func (k UintKey) EncodeMsgpack(enc *encoder) error {
2622
enc.EncodeArrayLen(1)
2723
enc.EncodeUint(k.I)
2824
return nil
@@ -34,7 +30,7 @@ type StringKey struct {
3430
S string
3531
}
3632

37-
func (k StringKey) EncodeMsgpack(enc *msgpack.Encoder) error {
33+
func (k StringKey) EncodeMsgpack(enc *encoder) error {
3834
enc.EncodeArrayLen(1)
3935
enc.EncodeString(k.S)
4036
return nil
@@ -46,7 +42,7 @@ type IntIntKey struct {
4642
I1, I2 int
4743
}
4844

49-
func (k IntIntKey) EncodeMsgpack(enc *msgpack.Encoder) error {
45+
func (k IntIntKey) EncodeMsgpack(enc *encoder) error {
5046
enc.EncodeArrayLen(2)
5147
enc.EncodeInt(k.I1)
5248
enc.EncodeInt(k.I2)
@@ -60,7 +56,7 @@ type Op struct {
6056
Arg interface{}
6157
}
6258

63-
func (o Op) EncodeMsgpack(enc *msgpack.Encoder) error {
59+
func (o Op) EncodeMsgpack(enc *encoder) error {
6460
enc.EncodeArrayLen(3)
6561
enc.EncodeString(o.Op)
6662
enc.EncodeInt(o.Field)
@@ -148,7 +144,7 @@ type OpSplice struct {
148144
Replace string
149145
}
150146

151-
func (o OpSplice) EncodeMsgpack(enc *msgpack.Encoder) error {
147+
func (o OpSplice) EncodeMsgpack(enc *encoder) error {
152148
enc.EncodeArrayLen(5)
153149
enc.EncodeString(o.Op)
154150
enc.EncodeInt(o.Field)

connection.go

+6-8
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,6 @@ import (
1515
"sync"
1616
"sync/atomic"
1717
"time"
18-
19-
"gopkg.in/vmihailenco/msgpack.v2"
2018
)
2119

2220
const requestsMap = 128
@@ -142,7 +140,7 @@ type Connection struct {
142140
rlimit chan struct{}
143141
opts Opts
144142
state uint32
145-
dec *msgpack.Decoder
143+
dec *decoder
146144
lenbuf [PacketLengthBytes]byte
147145

148146
lastStreamId uint64
@@ -199,7 +197,7 @@ type connShard struct {
199197
requestsWithCtx [requestsMap]futureList
200198
bufmut sync.Mutex
201199
buf smallWBuf
202-
enc *msgpack.Encoder
200+
enc *encoder
203201
}
204202

205203
// Greeting is a message sent by Tarantool on connect.
@@ -320,7 +318,7 @@ func Connect(addr string, opts Opts) (conn *Connection, err error) {
320318
Greeting: &Greeting{},
321319
control: make(chan struct{}),
322320
opts: opts,
323-
dec: msgpack.NewDecoder(&smallBuf{}),
321+
dec: newDecoder(&smallBuf{}),
324322
}
325323
maxprocs := uint32(runtime.GOMAXPROCS(-1))
326324
if conn.opts.Concurrency == 0 || conn.opts.Concurrency > maxprocs*128 {
@@ -531,7 +529,7 @@ func (conn *Connection) dial() (err error) {
531529
return
532530
}
533531

534-
func pack(h *smallWBuf, enc *msgpack.Encoder, reqid uint32,
532+
func pack(h *smallWBuf, enc *encoder, reqid uint32,
535533
req Request, streamId uint64, res SchemaResolver) (err error) {
536534
hl := h.Len()
537535

@@ -569,7 +567,7 @@ func pack(h *smallWBuf, enc *msgpack.Encoder, reqid uint32,
569567
func (conn *Connection) writeAuthRequest(w *bufio.Writer, scramble []byte) (err error) {
570568
var packet smallWBuf
571569
req := newAuthRequest(conn.opts.User, string(scramble))
572-
err = pack(&packet, msgpack.NewEncoder(&packet), 0, req, ignoreStreamId, conn.Schema)
570+
err = pack(&packet, newEncoder(&packet), 0, req, ignoreStreamId, conn.Schema)
573571

574572
if err != nil {
575573
return errors.New("auth: pack error " + err.Error())
@@ -916,7 +914,7 @@ func (conn *Connection) putFuture(fut *Future, req Request, streamId uint64) {
916914
firstWritten := shard.buf.Len() == 0
917915
if shard.buf.Cap() == 0 {
918916
shard.buf.b = make([]byte, 0, 128)
919-
shard.enc = msgpack.NewEncoder(&shard.buf)
917+
shard.enc = newEncoder(&shard.buf)
920918
}
921919
blen := shard.buf.Len()
922920
reqid := fut.requestId

datetime/datetime.go

-9
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,6 @@ import (
1313
"encoding/binary"
1414
"fmt"
1515
"time"
16-
17-
"gopkg.in/vmihailenco/msgpack.v2"
1816
)
1917

2018
// Datetime MessagePack serialization schema is an MP_EXT extension, which
@@ -101,9 +99,6 @@ func (dtime *Datetime) ToTime() time.Time {
10199
return dtime.time
102100
}
103101

104-
var _ msgpack.Marshaler = (*Datetime)(nil)
105-
var _ msgpack.Unmarshaler = (*Datetime)(nil)
106-
107102
func (dtime *Datetime) MarshalMsgpack() ([]byte, error) {
108103
tm := dtime.ToTime()
109104

@@ -152,7 +147,3 @@ func (tm *Datetime) UnmarshalMsgpack(b []byte) error {
152147
}
153148
return err
154149
}
155-
156-
func init() {
157-
msgpack.RegisterExt(datetime_extId, &Datetime{})
158-
}

datetime/datetime_test.go

+8-9
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ import (
1212
. "github.com/tarantool/go-tarantool"
1313
. "github.com/tarantool/go-tarantool/datetime"
1414
"github.com/tarantool/go-tarantool/test_helpers"
15-
"gopkg.in/vmihailenco/msgpack.v2"
1615
)
1716

1817
var lesserBoundaryTimes = []time.Time{
@@ -270,7 +269,7 @@ type Tuple1 struct {
270269
Datetime Datetime
271270
}
272271

273-
func (t *Tuple1) EncodeMsgpack(e *msgpack.Encoder) error {
272+
func (t *Tuple1) EncodeMsgpack(e *encoder) error {
274273
if err := e.EncodeArrayLen(2); err != nil {
275274
return err
276275
}
@@ -280,7 +279,7 @@ func (t *Tuple1) EncodeMsgpack(e *msgpack.Encoder) error {
280279
return nil
281280
}
282281

283-
func (t *Tuple1) DecodeMsgpack(d *msgpack.Decoder) error {
282+
func (t *Tuple1) DecodeMsgpack(d *decoder) error {
284283
var err error
285284
var l int
286285
if l, err = d.DecodeArrayLen(); err != nil {
@@ -296,7 +295,7 @@ func (t *Tuple1) DecodeMsgpack(d *msgpack.Decoder) error {
296295
return nil
297296
}
298297

299-
func (ev *Event) EncodeMsgpack(e *msgpack.Encoder) error {
298+
func (ev *Event) EncodeMsgpack(e *encoder) error {
300299
if err := e.EncodeArrayLen(2); err != nil {
301300
return err
302301
}
@@ -309,7 +308,7 @@ func (ev *Event) EncodeMsgpack(e *msgpack.Encoder) error {
309308
return nil
310309
}
311310

312-
func (ev *Event) DecodeMsgpack(d *msgpack.Decoder) error {
311+
func (ev *Event) DecodeMsgpack(d *decoder) error {
313312
var err error
314313
var l int
315314
if l, err = d.DecodeArrayLen(); err != nil {
@@ -329,7 +328,7 @@ func (ev *Event) DecodeMsgpack(d *msgpack.Decoder) error {
329328
return nil
330329
}
331330

332-
func (c *Tuple2) EncodeMsgpack(e *msgpack.Encoder) error {
331+
func (c *Tuple2) EncodeMsgpack(e *encoder) error {
333332
if err := e.EncodeArrayLen(3); err != nil {
334333
return err
335334
}
@@ -343,7 +342,7 @@ func (c *Tuple2) EncodeMsgpack(e *msgpack.Encoder) error {
343342
return nil
344343
}
345344

346-
func (c *Tuple2) DecodeMsgpack(d *msgpack.Decoder) error {
345+
func (c *Tuple2) DecodeMsgpack(d *decoder) error {
347346
var err error
348347
var l int
349348
if l, err = d.DecodeArrayLen(); err != nil {
@@ -525,7 +524,7 @@ func TestMPEncode(t *testing.T) {
525524
if err != nil {
526525
t.Fatalf("Unable to create Datetime from %s: %s", tm, err)
527526
}
528-
buf, err := msgpack.Marshal(dt)
527+
buf, err := marshal(dt)
529528
if err != nil {
530529
t.Fatalf("Marshalling failed: %s", err.Error())
531530
}
@@ -549,7 +548,7 @@ func TestMPDecode(t *testing.T) {
549548
}
550549
buf, _ := hex.DecodeString(testcase.mpBuf)
551550
var v Datetime
552-
err = msgpack.Unmarshal(buf, &v)
551+
err = unmarshal(buf, &v)
553552
if err != nil {
554553
t.Fatalf("Unmarshalling failed: %s", err.Error())
555554
}

datetime/msgpack.go

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package datetime
2+
3+
import (
4+
"gopkg.in/vmihailenco/msgpack.v2"
5+
)
6+
7+
func init() {
8+
msgpack.RegisterExt(datetime_extId, &Datetime{})
9+
}

datetime/msgpack_helper_test.go

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package datetime_test
2+
3+
import (
4+
"gopkg.in/vmihailenco/msgpack.v2"
5+
)
6+
7+
type encoder = msgpack.Encoder
8+
type decoder = msgpack.Decoder
9+
10+
func marshal(v interface{}) ([]byte, error) {
11+
return msgpack.Marshal(v)
12+
}
13+
14+
func unmarshal(data []byte, v interface{}) error {
15+
return msgpack.Unmarshal(data, v)
16+
}

decimal/decimal.go

-8
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ import (
1919
"fmt"
2020

2121
"github.com/shopspring/decimal"
22-
"gopkg.in/vmihailenco/msgpack.v2"
2322
)
2423

2524
// Decimal numbers have 38 digits of precision, that is, the total
@@ -56,9 +55,6 @@ func NewDecimalFromString(src string) (result *Decimal, err error) {
5655
return
5756
}
5857

59-
var _ msgpack.Marshaler = (*Decimal)(nil)
60-
var _ msgpack.Unmarshaler = (*Decimal)(nil)
61-
6258
func (decNum *Decimal) MarshalMsgpack() ([]byte, error) {
6359
one := decimal.NewFromInt(1)
6460
maxSupportedDecimal := decimal.New(1, DecimalPrecision).Sub(one) // 10^DecimalPrecision - 1
@@ -99,7 +95,3 @@ func (decNum *Decimal) UnmarshalMsgpack(b []byte) error {
9995

10096
return nil
10197
}
102-
103-
func init() {
104-
msgpack.RegisterExt(decimalExtID, &Decimal{})
105-
}

decimal/decimal_test.go

+13-14
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ import (
1313
. "github.com/tarantool/go-tarantool"
1414
. "github.com/tarantool/go-tarantool/decimal"
1515
"github.com/tarantool/go-tarantool/test_helpers"
16-
"gopkg.in/vmihailenco/msgpack.v2"
1716
)
1817

1918
var isDecimalSupported = false
@@ -40,14 +39,14 @@ type TupleDecimal struct {
4039
number Decimal
4140
}
4241

43-
func (t *TupleDecimal) EncodeMsgpack(e *msgpack.Encoder) error {
42+
func (t *TupleDecimal) EncodeMsgpack(e *encoder) error {
4443
if err := e.EncodeArrayLen(1); err != nil {
4544
return err
4645
}
4746
return e.EncodeValue(reflect.ValueOf(&t.number))
4847
}
4948

50-
func (t *TupleDecimal) DecodeMsgpack(d *msgpack.Decoder) error {
49+
func (t *TupleDecimal) DecodeMsgpack(d *decoder) error {
5150
var err error
5251
var l int
5352
if l, err = d.DecodeArrayLen(); err != nil {
@@ -144,11 +143,11 @@ func TestMPEncodeDecode(t *testing.T) {
144143
}
145144
var buf []byte
146145
tuple := TupleDecimal{number: *decNum}
147-
if buf, err = msgpack.Marshal(&tuple); err != nil {
146+
if buf, err = marshal(&tuple); err != nil {
148147
t.Fatalf("Failed to encode decimal number '%s' to a MessagePack buffer: %s", testcase.numString, err)
149148
}
150149
var v TupleDecimal
151-
if err = msgpack.Unmarshal(buf, &v); err != nil {
150+
if err = unmarshal(buf, &v); err != nil {
152151
t.Fatalf("Failed to decode MessagePack buffer '%x' to a decimal number: %s", buf, err)
153152
}
154153
if !decNum.Equal(v.number.Decimal) {
@@ -247,7 +246,7 @@ func TestEncodeMaxNumber(t *testing.T) {
247246
referenceErrMsg := "msgpack: decimal number is bigger than maximum supported number (10^38 - 1)"
248247
decNum := decimal.New(1, DecimalPrecision) // // 10^DecimalPrecision
249248
tuple := TupleDecimal{number: *NewDecimal(decNum)}
250-
_, err := msgpack.Marshal(&tuple)
249+
_, err := marshal(&tuple)
251250
if err == nil {
252251
t.Fatalf("It is possible to encode a number unsupported by Tarantool")
253252
}
@@ -261,7 +260,7 @@ func TestEncodeMinNumber(t *testing.T) {
261260
two := decimal.NewFromInt(2)
262261
decNum := decimal.New(1, DecimalPrecision).Neg().Sub(two) // -10^DecimalPrecision - 2
263262
tuple := TupleDecimal{number: *NewDecimal(decNum)}
264-
_, err := msgpack.Marshal(&tuple)
263+
_, err := marshal(&tuple)
265264
if err == nil {
266265
t.Fatalf("It is possible to encode a number unsupported by Tarantool")
267266
}
@@ -280,10 +279,10 @@ func benchmarkMPEncodeDecode(b *testing.B, src decimal.Decimal, dst interface{})
280279
var err error
281280
for i := 0; i < b.N; i++ {
282281
tuple := TupleDecimal{number: *NewDecimal(src)}
283-
if buf, err = msgpack.Marshal(&tuple); err != nil {
282+
if buf, err = marshal(&tuple); err != nil {
284283
b.Fatal(err)
285284
}
286-
if err = msgpack.Unmarshal(buf, &v); err != nil {
285+
if err = unmarshal(buf, &v); err != nil {
287286
b.Fatal(err)
288287
}
289288
}
@@ -310,7 +309,7 @@ func BenchmarkMPEncodeDecimal(b *testing.B) {
310309
}
311310
b.ResetTimer()
312311
for i := 0; i < b.N; i++ {
313-
msgpack.Marshal(decNum)
312+
marshal(decNum)
314313
}
315314
})
316315
}
@@ -324,13 +323,13 @@ func BenchmarkMPDecodeDecimal(b *testing.B) {
324323
b.Fatal(err)
325324
}
326325
var buf []byte
327-
if buf, err = msgpack.Marshal(decNum); err != nil {
326+
if buf, err = marshal(decNum); err != nil {
328327
b.Fatal(err)
329328
}
330329
b.ResetTimer()
331330
var v TupleDecimal
332331
for i := 0; i < b.N; i++ {
333-
msgpack.Unmarshal(buf, &v)
332+
unmarshal(buf, &v)
334333
}
335334

336335
})
@@ -417,7 +416,7 @@ func TestMPEncode(t *testing.T) {
417416
if err != nil {
418417
t.Fatalf("NewDecimalFromString() failed: %s", err.Error())
419418
}
420-
buf, err := msgpack.Marshal(dec)
419+
buf, err := marshal(dec)
421420
if err != nil {
422421
t.Fatalf("Marshalling failed: %s", err.Error())
423422
}
@@ -442,7 +441,7 @@ func TestMPDecode(t *testing.T) {
442441
t.Fatalf("hex.DecodeString() failed: %s", err)
443442
}
444443
var v interface{}
445-
err = msgpack.Unmarshal(mpBuf, &v)
444+
err = unmarshal(mpBuf, &v)
446445
if err != nil {
447446
t.Fatalf("Unmarshalling failed: %s", err.Error())
448447
}

0 commit comments

Comments
 (0)