From b1474190ebb38ddd4901ae58afcb8e3846b4f163 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Wed, 12 Apr 2017 15:39:59 +0800 Subject: [PATCH] fix #559 --- session.go | 49 ++++++++++++++++++++++++------------------------- types_test.go | 23 +++++++++++++++++++++++ 2 files changed, 47 insertions(+), 25 deletions(-) diff --git a/session.go b/session.go index 29d840e2..213f46fd 100644 --- a/session.go +++ b/session.go @@ -377,9 +377,11 @@ func (session *Session) row2Bean(rows *core.Rows, fields []string, fieldsCount i if fieldValue.CanAddr() { if structConvert, ok := fieldValue.Addr().Interface().(core.Conversion); ok { if data, err := value2Bytes(&rawValue); err == nil { - structConvert.FromDB(data) + if err := structConvert.FromDB(data); err != nil { + return nil, err + } } else { - session.Engine.logger.Error(err) + return nil, err } continue } @@ -392,7 +394,7 @@ func (session *Session) row2Bean(rows *core.Rows, fields []string, fieldsCount i } fieldValue.Interface().(core.Conversion).FromDB(data) } else { - session.Engine.logger.Error(err) + return nil, err } continue } @@ -422,14 +424,12 @@ func (session *Session) row2Bean(rows *core.Rows, fields []string, fieldsCount i if fieldValue.CanAddr() { err := json.Unmarshal(bs, fieldValue.Addr().Interface()) if err != nil { - session.Engine.logger.Error(key, err) return nil, err } } else { x := reflect.New(fieldType) err := json.Unmarshal(bs, x.Interface()) if err != nil { - session.Engine.logger.Error(key, err) return nil, err } fieldValue.Set(x.Elem()) @@ -454,14 +454,12 @@ func (session *Session) row2Bean(rows *core.Rows, fields []string, fieldsCount i if fieldValue.CanAddr() { err := json.Unmarshal(bs, fieldValue.Addr().Interface()) if err != nil { - session.Engine.logger.Error(err) return nil, err } } else { x := reflect.New(fieldType) err := json.Unmarshal(bs, x.Interface()) if err != nil { - session.Engine.logger.Error(err) return nil, err } fieldValue.Set(x.Elem()) @@ -478,14 +476,19 @@ func (session *Session) row2Bean(rows *core.Rows, fields []string, fieldsCount i x := reflect.New(fieldType) err := json.Unmarshal(vv.Bytes(), x.Interface()) if err != nil { - session.Engine.logger.Error(err) return nil, err } fieldValue.Set(x.Elem()) } else { - for i := 0; i < fieldValue.Len(); i++ { - if i < vv.Len() { - fieldValue.Index(i).Set(vv.Index(i)) + if fieldValue.Len() > 0 { + for i := 0; i < fieldValue.Len(); i++ { + if i < vv.Len() { + fieldValue.Index(i).Set(vv.Index(i)) + } + } + } else { + for i := 0; i < vv.Len(); i++ { + fieldValue.Set(reflect.Append(*fieldValue, vv.Index(i))) } } } @@ -596,7 +599,6 @@ func (session *Session) row2Bean(rows *core.Rows, fields []string, fieldsCount i if len([]byte(vv.String())) > 0 { err := json.Unmarshal([]byte(vv.String()), x.Interface()) if err != nil { - session.Engine.logger.Error(err) return nil, err } fieldValue.Set(x.Elem()) @@ -607,7 +609,6 @@ func (session *Session) row2Bean(rows *core.Rows, fields []string, fieldsCount i if len(vv.Bytes()) > 0 { err := json.Unmarshal(vv.Bytes(), x.Interface()) if err != nil { - session.Engine.logger.Error(err) return nil, err } fieldValue.Set(x.Elem()) @@ -749,10 +750,9 @@ func (session *Session) row2Bean(rows *core.Rows, fields []string, fieldsCount i if len([]byte(vv.String())) > 0 { err := json.Unmarshal([]byte(vv.String()), &x) if err != nil { - session.Engine.logger.Error(err) - } else { - fieldValue.Set(reflect.ValueOf(&x)) + return nil, err } + fieldValue.Set(reflect.ValueOf(&x)) } hasAssigned = true case core.Complex128Type: @@ -760,24 +760,23 @@ func (session *Session) row2Bean(rows *core.Rows, fields []string, fieldsCount i if len([]byte(vv.String())) > 0 { err := json.Unmarshal([]byte(vv.String()), &x) if err != nil { - session.Engine.logger.Error(err) - } else { - fieldValue.Set(reflect.ValueOf(&x)) + return nil, err } + fieldValue.Set(reflect.ValueOf(&x)) } hasAssigned = true } // switch fieldType - // default: - // session.Engine.LogError("unsupported type in Scan: ", reflect.TypeOf(v).String()) } // switch fieldType.Kind() // !nashtsai! for value can't be assigned directly fallback to convert to []byte then back to value if !hasAssigned { data, err := value2Bytes(&rawValue) - if err == nil { - session.bytes2Value(col, fieldValue, data) - } else { - session.Engine.logger.Error(err.Error()) + if err != nil { + return nil, err + } + + if err = session.bytes2Value(col, fieldValue, data); err != nil { + return nil, err } } } diff --git a/types_test.go b/types_test.go index fae2f0c0..f5a51679 100644 --- a/types_test.go +++ b/types_test.go @@ -72,3 +72,26 @@ func TestArrayField(t *testing.T) { assert.NoError(t, err) assert.Equal(t, false, has) } + +func TestGetBytes(t *testing.T) { + assert.NoError(t, prepareEngine()) + + type Varbinary struct { + Data []byte `xorm:"VARBINARY"` + } + + err := testEngine.Sync2(new(Varbinary)) + assert.NoError(t, err) + + cnt, err := testEngine.Insert(&Varbinary{ + Data: []byte("test"), + }) + assert.NoError(t, err) + assert.EqualValues(t, 1, cnt) + + var b Varbinary + has, err := testEngine.Get(&b) + assert.NoError(t, err) + assert.Equal(t, true, has) + assert.Equal(t, "test", string(b.Data)) +}