Skip to content

Commit 1f844f0

Browse files
crud: more careful response process
In go-tarantool, crud API result decoding assumes that there are always two response values, except for truncate. Such approach is based on actual experience: success result is always `return res, nil`, not `return res`. But this is not a feature guaranteed by crud module API, just a current implementation quirk [1] (since in Lua function result process there is no any difference). See also similar patch in tarantool/python [2]. 1. https://github.com/tarantool/crud/blob/53457477974fed42351cbd87f566d11e9f7e39bb/crud/common/schema.lua#L88 2. tarantool/tarantool-python@a4b734a
1 parent c33f351 commit 1f844f0

File tree

2 files changed

+45
-41
lines changed

2 files changed

+45
-41
lines changed

crud/result.go

Lines changed: 32 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -70,12 +70,14 @@ func msgpackIsArray(code byte) bool {
7070

7171
// DecodeMsgpack provides custom msgpack decoder.
7272
func (r *Result) DecodeMsgpack(d *msgpack.Decoder) error {
73+
var retErr error
74+
7375
arrLen, err := d.DecodeArrayLen()
7476
if err != nil {
7577
return err
7678
}
7779

78-
if arrLen < 2 {
80+
if arrLen == 0 {
7981
return fmt.Errorf("array len doesn't match: %d", arrLen)
8082
}
8183

@@ -130,27 +132,27 @@ func (r *Result) DecodeMsgpack(d *msgpack.Decoder) error {
130132
}
131133
}
132134

133-
code, err := d.PeekCode()
134-
if err != nil {
135-
return err
136-
}
137-
138-
var retErr error
139-
if msgpackIsArray(code) {
140-
crudErr := newErrorMany(r.rowType)
141-
if err := d.Decode(&crudErr); err != nil {
142-
return err
143-
}
144-
retErr = *crudErr
145-
} else if code != msgpcode.Nil {
146-
crudErr := newError(r.rowType)
147-
if err := d.Decode(&crudErr); err != nil {
135+
if arrLen > 1 {
136+
code, err := d.PeekCode()
137+
if err != nil {
148138
return err
149139
}
150-
retErr = *crudErr
151-
} else {
152-
if err := d.DecodeNil(); err != nil {
153-
return err
140+
if msgpackIsArray(code) {
141+
crudErr := newErrorMany(r.rowType)
142+
if err := d.Decode(&crudErr); err != nil {
143+
return err
144+
}
145+
retErr = *crudErr
146+
} else if code != msgpcode.Nil {
147+
crudErr := newError(r.rowType)
148+
if err := d.Decode(&crudErr); err != nil {
149+
return err
150+
}
151+
retErr = *crudErr
152+
} else {
153+
if err := d.DecodeNil(); err != nil {
154+
return err
155+
}
154156
}
155157
}
156158

@@ -175,18 +177,24 @@ func (r *NumberResult) DecodeMsgpack(d *msgpack.Decoder) error {
175177
return err
176178
}
177179

178-
if arrLen < 2 {
180+
if arrLen == 0 {
179181
return fmt.Errorf("array len doesn't match: %d", arrLen)
180182
}
181183

182184
if r.Value, err = d.DecodeUint64(); err != nil {
183185
return err
184186
}
185187

186-
var crudErr *Error = nil
188+
if arrLen > 1 {
189+
var crudErr *Error = nil
187190

188-
if err := d.Decode(&crudErr); err != nil {
189-
return err
191+
if err := d.Decode(&crudErr); err != nil {
192+
return err
193+
}
194+
195+
if crudErr != nil {
196+
return crudErr
197+
}
190198
}
191199

192200
for i := 2; i < arrLen; i++ {
@@ -195,10 +203,6 @@ func (r *NumberResult) DecodeMsgpack(d *msgpack.Decoder) error {
195203
}
196204
}
197205

198-
if crudErr != nil {
199-
return crudErr
200-
}
201-
202206
return nil
203207
}
204208

crud/tarantool_test.go

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -254,71 +254,71 @@ var testGenerateDataCases = []struct {
254254
}{
255255
{
256256
"Insert",
257-
2,
257+
1,
258258
1,
259259
crud.MakeInsertRequest(spaceName).
260260
Tuple(tuple).
261261
Opts(simpleOperationOpts),
262262
},
263263
{
264264
"InsertObject",
265-
2,
265+
1,
266266
1,
267267
crud.MakeInsertObjectRequest(spaceName).
268268
Object(object).
269269
Opts(simpleOperationObjectOpts),
270270
},
271271
{
272272
"InsertMany",
273-
2,
273+
1,
274274
10,
275275
crud.MakeInsertManyRequest(spaceName).
276276
Tuples(tuples).
277277
Opts(opManyOpts),
278278
},
279279
{
280280
"InsertObjectMany",
281-
2,
281+
1,
282282
10,
283283
crud.MakeInsertObjectManyRequest(spaceName).
284284
Objects(objects).
285285
Opts(opObjManyOpts),
286286
},
287287
{
288288
"Replace",
289-
2,
289+
1,
290290
1,
291291
crud.MakeReplaceRequest(spaceName).
292292
Tuple(tuple).
293293
Opts(simpleOperationOpts),
294294
},
295295
{
296296
"ReplaceObject",
297-
2,
297+
1,
298298
1,
299299
crud.MakeReplaceObjectRequest(spaceName).
300300
Object(object).
301301
Opts(simpleOperationObjectOpts),
302302
},
303303
{
304304
"ReplaceMany",
305-
2,
305+
1,
306306
10,
307307
crud.MakeReplaceManyRequest(spaceName).
308308
Tuples(tuples).
309309
Opts(opManyOpts),
310310
},
311311
{
312312
"ReplaceObjectMany",
313-
2,
313+
1,
314314
10,
315315
crud.MakeReplaceObjectManyRequest(spaceName).
316316
Objects(objects).
317317
Opts(opObjManyOpts),
318318
},
319319
{
320320
"Upsert",
321-
2,
321+
1,
322322
1,
323323
crud.MakeUpsertRequest(spaceName).
324324
Tuple(tuple).
@@ -327,7 +327,7 @@ var testGenerateDataCases = []struct {
327327
},
328328
{
329329
"UpsertObject",
330-
2,
330+
1,
331331
1,
332332
crud.MakeUpsertObjectRequest(spaceName).
333333
Object(object).
@@ -336,15 +336,15 @@ var testGenerateDataCases = []struct {
336336
},
337337
{
338338
"UpsertMany",
339-
2,
339+
1,
340340
10,
341341
crud.MakeUpsertManyRequest(spaceName).
342342
TuplesOperationsData(tuplesOperationsData).
343343
Opts(opManyOpts),
344344
},
345345
{
346346
"UpsertObjectMany",
347-
2,
347+
1,
348348
10,
349349
crud.MakeUpsertObjectManyRequest(spaceName).
350350
ObjectsOperationsData(objectsOperationData).
@@ -475,7 +475,7 @@ func testCrudRequestCheck(t *testing.T, req tarantool.Request,
475475

476476
// resp.Data[0] - CRUD res.
477477
// resp.Data[1] - CRUD err.
478-
if expectedLen >= 2 {
478+
if expectedLen >= 2 && resp.Data[1] != nil {
479479
if crudErr, err := getCrudError(req, resp.Data[1]); err != nil {
480480
t.Fatalf("Failed to get CRUD error: %#v", err)
481481
} else if crudErr != nil {

0 commit comments

Comments
 (0)