first part to resolve #504

This commit is contained in:
Lunny Xiao 2017-03-27 15:45:15 +08:00
parent bdb225ceb5
commit 5789833408
No known key found for this signature in database
GPG Key ID: C3B7C91B632F738A
6 changed files with 138 additions and 4 deletions

View File

@ -180,6 +180,20 @@ func isStructZero(v reflect.Value) bool {
return true return true
} }
func isArrayValueZero(v reflect.Value) bool {
if !v.IsValid() || v.Len() == 0 {
return true
}
for i := 0; i < v.Len(); i++ {
if !isZero(v.Index(i).Interface()) {
return false
}
}
return true
}
func int64ToIntValue(id int64, tp reflect.Type) reflect.Value { func int64ToIntValue(id int64, tp reflect.Type) reflect.Value {
var v interface{} var v interface{}
switch tp.Kind() { switch tp.Kind() {

View File

@ -458,7 +458,21 @@ func (session *Session) row2Bean(rows *core.Rows, fields []string, fieldsCount i
case reflect.Uint8: case reflect.Uint8:
if fieldType.Elem().Kind() == reflect.Uint8 { if fieldType.Elem().Kind() == reflect.Uint8 {
hasAssigned = true hasAssigned = true
fieldValue.Set(vv) if col.SQLType.IsText() {
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))
}
}
}
} }
} }
} }

View File

@ -410,7 +410,11 @@ func buildUpdates(engine *Engine, table *core.Table, bean interface{},
if fieldValue == reflect.Zero(fieldType) { if fieldValue == reflect.Zero(fieldType) {
continue continue
} }
if fieldValue.IsNil() || !fieldValue.IsValid() || fieldValue.Len() == 0 { if fieldType.Kind() == reflect.Array {
if isArrayValueZero(fieldValue) {
continue
}
} else if fieldValue.IsNil() || !fieldValue.IsValid() || fieldValue.Len() == 0 {
continue continue
} }
} }
@ -425,13 +429,16 @@ func buildUpdates(engine *Engine, table *core.Table, bean interface{},
} else if col.SQLType.IsBlob() { } else if col.SQLType.IsBlob() {
var bytes []byte var bytes []byte
var err error var err error
if (fieldType.Kind() == reflect.Array || fieldType.Kind() == reflect.Slice) && if fieldType.Kind() == reflect.Slice &&
fieldType.Elem().Kind() == reflect.Uint8 { fieldType.Elem().Kind() == reflect.Uint8 {
if fieldValue.Len() > 0 { if fieldValue.Len() > 0 {
val = fieldValue.Bytes() val = fieldValue.Bytes()
} else { } else {
continue continue
} }
} else if fieldType.Kind() == reflect.Array &&
fieldType.Elem().Kind() == reflect.Uint8 {
val = fieldValue.Slice(0, 0).Interface()
} else { } else {
bytes, err = json.Marshal(fieldValue.Interface()) bytes, err = json.Marshal(fieldValue.Interface())
if err != nil { if err != nil {
@ -643,7 +650,9 @@ func buildConds(engine *Engine, table *core.Table, bean interface{},
} }
} }
} }
case reflect.Array, reflect.Slice, reflect.Map: case reflect.Array:
continue
case reflect.Slice, reflect.Map:
if fieldValue == reflect.Zero(fieldType) { if fieldValue == reflect.Zero(fieldType) {
continue continue
} }

View File

@ -1,3 +1,7 @@
// Copyright 2017 The Xorm Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package xorm package xorm
import ( import (

74
types_test.go Normal file
View File

@ -0,0 +1,74 @@
// Copyright 2017 The Xorm Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package xorm
import (
"testing"
"github.com/stretchr/testify/assert"
)
func TestArrayField(t *testing.T) {
assert.NoError(t, prepareEngine())
type ArrayStruct struct {
Id int64
Name [20]byte `xorm:"char(20)"`
}
assert.NoError(t, testEngine.Sync2(new(ArrayStruct)))
var as = ArrayStruct{
Name: [20]byte{
96, 96, 96, 96, 96,
96, 96, 96, 96, 96,
96, 96, 96, 96, 96,
96, 96, 96, 96, 96,
},
}
cnt, err := testEngine.Insert(&as)
assert.NoError(t, err)
assert.EqualValues(t, 1, cnt)
var arr ArrayStruct
has, err := testEngine.Id(1).Get(&arr)
assert.NoError(t, err)
assert.Equal(t, true, has)
assert.Equal(t, as.Name, arr.Name)
var arrs []ArrayStruct
err = testEngine.Find(&arrs)
assert.NoError(t, err)
assert.EqualValues(t, 1, len(arrs))
assert.Equal(t, as.Name, arrs[0].Name)
var newName = [20]byte{
90, 96, 96, 96, 96,
96, 96, 96, 96, 96,
96, 96, 96, 96, 96,
96, 96, 96, 96, 96,
}
cnt, err = testEngine.ID(1).Update(&ArrayStruct{
Name: newName,
})
assert.NoError(t, err)
assert.EqualValues(t, 1, cnt)
var newArr ArrayStruct
has, err = testEngine.ID(1).Get(&newArr)
assert.NoError(t, err)
assert.Equal(t, true, has)
assert.Equal(t, newName, newArr.Name)
cnt, err = testEngine.ID(1).Delete(new(ArrayStruct))
assert.NoError(t, err)
assert.EqualValues(t, 1, cnt)
var cfgArr ArrayStruct
has, err = testEngine.ID(1).Get(&cfgArr)
assert.NoError(t, err)
assert.Equal(t, false, has)
}

View File

@ -12,6 +12,7 @@ import (
var ( var (
testEngine *Engine testEngine *Engine
dbType string dbType string
connStr string
) )
func prepareSqlite3Engine() error { func prepareSqlite3Engine() error {
@ -27,9 +28,27 @@ func prepareSqlite3Engine() error {
return nil return nil
} }
func prepareMysqlEngine() error {
if testEngine == nil {
var err error
testEngine, err = NewEngine("mysql", connStr)
if err != nil {
return err
}
testEngine.ShowSQL(*showSQL)
_, err = testEngine.Exec("DROP DATABASE")
if err != nil {
return err
}
}
return nil
}
func prepareEngine() error { func prepareEngine() error {
if dbType == "sqlite" { if dbType == "sqlite" {
return prepareSqlite3Engine() return prepareSqlite3Engine()
} else if dbType == "mysql" {
return prepareMysqlEngine()
} }
return errors.New("Unknown test database driver") return errors.New("Unknown test database driver")
} }