|
@@ -54,34 +54,43 @@ func TransInsertWithSize(trans *xorm.Session, size int, beans ...interface{}) er
|
|
|
for _, bean := range beans {
|
|
|
sliceValue := reflect.Indirect(reflect.ValueOf(bean))
|
|
|
if sliceValue.Kind() == reflect.Slice {
|
|
|
+ sLen := sliceValue.Len()
|
|
|
+ if sLen == 0 {
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ if sLen <= size {
|
|
|
+ objects = append(objects, bean)
|
|
|
+ continue
|
|
|
+ }
|
|
|
+ idx := 0
|
|
|
+ arrMap := make(map[int][]interface{})
|
|
|
for i := 0; i < sliceValue.Len(); i++ {
|
|
|
+ if i%size == 0 {
|
|
|
+ idx++
|
|
|
+ }
|
|
|
v := sliceValue.Index(i)
|
|
|
+ if v.Kind() == reflect.Ptr {
|
|
|
+ v = v.Elem()
|
|
|
+ }
|
|
|
elemValue := v.Interface()
|
|
|
- objects = append(objects, elemValue)
|
|
|
+ if nil == arrMap[idx] {
|
|
|
+ arrMap[idx] = []interface{}{elemValue}
|
|
|
+ } else {
|
|
|
+ arrMap[idx] = append(arrMap[idx], elemValue)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ for i := 1; i <= idx; i++ {
|
|
|
+ arr := arrMap[i]
|
|
|
+ objects = append(objects, &arr)
|
|
|
}
|
|
|
} else {
|
|
|
objects = append(objects, bean)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- total := len(objects)
|
|
|
- var err error
|
|
|
- if total <= size {
|
|
|
- _, err = trans.Insert(&objects)
|
|
|
+ _, err := trans.Insert(objects...)
|
|
|
+ if nil != err {
|
|
|
return err
|
|
|
}
|
|
|
-
|
|
|
- for i := 0; i < total; i += size {
|
|
|
- end := i + size
|
|
|
- if end > total {
|
|
|
- end = total
|
|
|
- }
|
|
|
- arr := objects[i:end]
|
|
|
- _, err = trans.Insert(&arr)
|
|
|
- if nil != err {
|
|
|
- return err
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- return err
|
|
|
+ return nil
|
|
|
}
|