update for valueof interface (#578)

This commit is contained in:
Henry Huang 2017-05-22 23:03:57 +08:00 committed by Lunny Xiao
parent a012756d38
commit 9d7e85c39d
2 changed files with 86 additions and 9 deletions

View File

@ -67,7 +67,7 @@ func (session *Session) innerInsertMulti(rowsSlicePtr interface{}) (int64, error
return 0, errors.New("could not insert a empty slice") return 0, errors.New("could not insert a empty slice")
} }
if err := session.Statement.setRefValue(sliceValue.Index(0)); err != nil { if err := session.Statement.setRefValue(reflect.ValueOf(sliceValue.Index(0).Interface())); err != nil {
return 0, err return 0, err
} }

View File

@ -5,6 +5,8 @@
package xorm package xorm
import ( import (
"fmt"
"reflect"
"testing" "testing"
"time" "time"
@ -27,14 +29,89 @@ func TestInsertOne(t *testing.T) {
assert.NoError(t, err) assert.NoError(t, err)
} }
func TestInsertMulti(t *testing.T) {
assert.NoError(t, prepareEngine())
type TestMulti struct {
Id int64 `xorm:"int(11) pk"`
Name string `xorm:"varchar(255)"`
}
assert.NoError(t, testEngine.Sync2(new(TestMulti)))
num, err := insertMultiDatas(1,
append([]TestMulti{}, TestMulti{1, "test1"}, TestMulti{2, "test2"}, TestMulti{3, "test3"}))
assert.NoError(t, err)
assert.EqualValues(t, 3, num)
}
func insertMultiDatas(step int, datas interface{}) (num int64, err error) {
sliceValue := reflect.Indirect(reflect.ValueOf(datas))
var iLen int64
if sliceValue.Kind() != reflect.Slice {
return 0, fmt.Errorf("not silce")
}
iLen = int64(sliceValue.Len())
if iLen == 0 {
return
}
session := testEngine.NewSession()
defer session.Close()
if err = callbackLooper(datas, step,
func(innerDatas interface{}) error {
n, e := session.InsertMulti(innerDatas)
if e != nil {
return e
}
num += n
return nil
}); err != nil {
return 0, err
} else if num != iLen {
return 0, fmt.Errorf("num error: %d - %d", num, iLen)
}
return
}
func callbackLooper(datas interface{}, step int, actionFunc func(interface{}) error) (err error) {
sliceValue := reflect.Indirect(reflect.ValueOf(datas))
if sliceValue.Kind() != reflect.Slice {
return fmt.Errorf("not slice")
}
if sliceValue.Len() <= 0 {
return
}
tempLen := 0
processedLen := sliceValue.Len()
for i := 0; i < sliceValue.Len(); i += step {
if processedLen > step {
tempLen = i + step
} else {
tempLen = sliceValue.Len()
}
var tempInterface []interface{}
for j := i; j < tempLen; j++ {
tempInterface = append(tempInterface, sliceValue.Index(j).Interface())
}
if err = actionFunc(tempInterface); err != nil {
return
}
processedLen = processedLen - step
}
return
}
func TestInsertOneIfPkIsPoint(t *testing.T) { func TestInsertOneIfPkIsPoint(t *testing.T) {
assert.NoError(t, prepareEngine()) assert.NoError(t, prepareEngine())
type TestPoint struct { type TestPoint struct {
Id *int64 `xorm:"autoincr pk notnull 'id'"` Id *int64 `xorm:"autoincr pk notnull 'id'"`
Msg *string `xorm:"varchar(255)"` Msg *string `xorm:"varchar(255)"`
Created *time.Time `xorm:"created"` Created *time.Time `xorm:"created"`
} }
assert.NoError(t, testEngine.Sync2(new(TestPoint))) assert.NoError(t, testEngine.Sync2(new(TestPoint)))
@ -44,13 +121,13 @@ func TestInsertOneIfPkIsPoint(t *testing.T) {
assert.NoError(t, err) assert.NoError(t, err)
} }
func TestInsertOneIfPkIsPointRename (t *testing.T) { func TestInsertOneIfPkIsPointRename(t *testing.T) {
assert.NoError(t, prepareEngine()) assert.NoError(t, prepareEngine())
type ID *int64 type ID *int64
type TestPoint struct { type TestPoint struct {
Id ID `xorm:"autoincr pk notnull 'id'"` Id ID `xorm:"autoincr pk notnull 'id'"`
Msg *string `xorm:"varchar(255)"` Msg *string `xorm:"varchar(255)"`
Created *time.Time `xorm:"created"` Created *time.Time `xorm:"created"`
} }
assert.NoError(t, testEngine.Sync2(new(TestPoint))) assert.NoError(t, testEngine.Sync2(new(TestPoint)))