Skip to content

Commit 2513e09

Browse files
committed
Add test for second insert error (#1527)
Add test for second insert error Reviewed-on: https://gitea.com/xorm/xorm/pulls/1527
1 parent 189e272 commit 2513e09

File tree

3 files changed

+52
-12
lines changed

3 files changed

+52
-12
lines changed

error.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ var (
2727
// ErrConditionType condition type unsupported
2828
ErrConditionType = errors.New("Unsupported condition type")
2929
// ErrUnSupportedSQLType parameter of SQL is not supported
30-
ErrUnSupportedSQLType = errors.New("unsupported sql type")
30+
ErrUnSupportedSQLType = errors.New("Unsupported sql type")
3131
)
3232

3333
// ErrFieldIsNotExist columns does not exist

session_insert.go

Lines changed: 16 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@ import (
1616
"xorm.io/core"
1717
)
1818

19+
// ErrNoElementsOnSlice represents an error there is no element when insert
20+
var ErrNoElementsOnSlice = errors.New("No element on slice when insert")
21+
1922
// Insert insert one or more beans
2023
func (session *Session) Insert(beans ...interface{}) (int64, error) {
2124
var affected int64
@@ -67,21 +70,23 @@ func (session *Session) Insert(beans ...interface{}) (int64, error) {
6770
sliceValue := reflect.Indirect(reflect.ValueOf(bean))
6871
if sliceValue.Kind() == reflect.Slice {
6972
size := sliceValue.Len()
70-
if size > 0 {
71-
if session.engine.SupportInsertMany() {
72-
cnt, err := session.innerInsertMulti(bean)
73+
if size <= 0 {
74+
return 0, ErrNoElementsOnSlice
75+
}
76+
77+
if session.engine.SupportInsertMany() {
78+
cnt, err := session.innerInsertMulti(bean)
79+
if err != nil {
80+
return affected, err
81+
}
82+
affected += cnt
83+
} else {
84+
for i := 0; i < size; i++ {
85+
cnt, err := session.innerInsert(sliceValue.Index(i).Interface())
7386
if err != nil {
7487
return affected, err
7588
}
7689
affected += cnt
77-
} else {
78-
for i := 0; i < size; i++ {
79-
cnt, err := session.innerInsert(sliceValue.Index(i).Interface())
80-
if err != nil {
81-
return affected, err
82-
}
83-
affected += cnt
84-
}
8590
}
8691
}
8792
} else {

session_insert_test.go

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1067,3 +1067,38 @@ func TestInsertMultiWithOmit(t *testing.T) {
10671067
assert.EqualValues(t, 3, num)
10681068
check()
10691069
}
1070+
1071+
func TestInsertTwice(t *testing.T) {
1072+
assert.NoError(t, prepareEngine())
1073+
1074+
type InsertStructA struct {
1075+
FieldA int
1076+
}
1077+
1078+
type InsertStructB struct {
1079+
FieldB int
1080+
}
1081+
1082+
assert.NoError(t, testEngine.Sync2(new(InsertStructA), new(InsertStructB)))
1083+
1084+
var sliceA []InsertStructA // sliceA is empty
1085+
sliceB := []InsertStructB{
1086+
InsertStructB{
1087+
FieldB: 1,
1088+
},
1089+
}
1090+
1091+
ssn := testEngine.NewSession()
1092+
defer ssn.Close()
1093+
1094+
err := ssn.Begin()
1095+
assert.NoError(t, err)
1096+
1097+
_, err = ssn.Insert(sliceA)
1098+
assert.EqualValues(t, ErrNoElementsOnSlice, err)
1099+
1100+
_, err = ssn.Insert(sliceB)
1101+
assert.NoError(t, err)
1102+
1103+
assert.NoError(t, ssn.Commit())
1104+
}

0 commit comments

Comments
 (0)