fix #559
This commit is contained in:
parent
71e934b5c6
commit
b1474190eb
43
session.go
43
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,16 +476,21 @@ 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 {
|
||||
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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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))
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue