From 36e26e35eda90fc396efa1fe87804290bd22c699 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Tue, 10 Mar 2020 03:02:31 +0000 Subject: [PATCH] =?UTF-8?q?=E8=A7=A3=E5=86=B3Conversion=E6=8E=A5=E5=8F=A3T?= =?UTF-8?q?oDB()=20([]byte,=20error)=E6=96=B9=E6=B3=95=E8=BF=94=E5=9B=9E*T?= =?UTF-8?q?ype=E5=80=BC=E4=B8=BAnil=E6=97=B6,=E6=95=B0=E6=8D=AE=E7=B1=BB?= =?UTF-8?q?=E5=9E=8B=E4=B8=BA[]byte(nil)=E7=9A=84=E2=80=A6=20(#1296)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit add test 解决Conversion接口ToDB() ([]byte, error)方法返回*Type值为nil时,数据类型为[]byte(nil)的bug,解决*Type值为nil时插入数据变为""的bug Co-authored-by: peihexian Reviewed-on: https://gitea.com/xorm/xorm/pulls/1296 --- internal/statements/values.go | 3 +++ types_test.go | 31 +++++++++++++++++++++++++++++++ 2 files changed, 34 insertions(+) diff --git a/internal/statements/values.go b/internal/statements/values.go index b545a605..0ab174d6 100644 --- a/internal/statements/values.go +++ b/internal/statements/values.go @@ -44,6 +44,9 @@ func (statement *Statement) Value2Interface(col *schemas.Column, fieldValue refl if col.SQLType.IsBlob() { return data, nil } + if nil == data { + return nil, nil + } return string(data), nil } diff --git a/types_test.go b/types_test.go index 77407e98..5cd01be2 100644 --- a/types_test.go +++ b/types_test.go @@ -119,10 +119,17 @@ type ConvConfig struct { } func (s *ConvConfig) FromDB(data []byte) error { + if data == nil { + s = nil + return nil + } return json.DefaultJSONHandler.Unmarshal(data, s) } func (s *ConvConfig) ToDB() ([]byte, error) { + if s == nil { + return nil, nil + } return json.DefaultJSONHandler.Marshal(s) } @@ -184,6 +191,30 @@ func TestConversion(t *testing.T) { assert.EqualValues(t, 2, len(c1.Slice)) assert.EqualValues(t, *c.Slice[0], *c1.Slice[0]) assert.EqualValues(t, *c.Slice[1], *c1.Slice[1]) + + cnt, err := testEngine.Where("1=1").Delete(new(ConvStruct)) + assert.NoError(t, err) + assert.EqualValues(t, 1, cnt) + + c.Cfg2 = nil + + _, err = testEngine.Insert(c) + assert.NoError(t, err) + + c2 := new(ConvStruct) + has, err = testEngine.Get(c2) + assert.NoError(t, err) + assert.True(t, has) + assert.EqualValues(t, "prefix---tttt", string(c2.Conv)) + assert.NotNil(t, c2.Conv2) + assert.EqualValues(t, "prefix---"+s, *c2.Conv2) + assert.EqualValues(t, c.Cfg1, c2.Cfg1) + assert.Nil(t, c2.Cfg2) + assert.NotNil(t, c2.Cfg3) + assert.EqualValues(t, *c.Cfg3.(*ConvConfig), *c2.Cfg3.(*ConvConfig)) + assert.EqualValues(t, 2, len(c2.Slice)) + assert.EqualValues(t, *c.Slice[0], *c2.Slice[0]) + assert.EqualValues(t, *c.Slice[1], *c2.Slice[1]) } type MyInt int