From 2513e09caa48d96cbbe0870bf9cf15db72354d91 Mon Sep 17 00:00:00 2001 From: Lunny Xiao Date: Thu, 20 Feb 2020 07:52:44 +0000 Subject: [PATCH] Add test for second insert error (#1527) Add test for second insert error Reviewed-on: https://gitea.com/xorm/xorm/pulls/1527 --- error.go | 2 +- session_insert.go | 27 ++++++++++++++++----------- session_insert_test.go | 35 +++++++++++++++++++++++++++++++++++ 3 files changed, 52 insertions(+), 12 deletions(-) diff --git a/error.go b/error.go index a67527ac..2e9cbfaa 100644 --- a/error.go +++ b/error.go @@ -27,7 +27,7 @@ var ( // ErrConditionType condition type unsupported ErrConditionType = errors.New("Unsupported condition type") // ErrUnSupportedSQLType parameter of SQL is not supported - ErrUnSupportedSQLType = errors.New("unsupported sql type") + ErrUnSupportedSQLType = errors.New("Unsupported sql type") ) // ErrFieldIsNotExist columns does not exist diff --git a/session_insert.go b/session_insert.go index c9859b7a..fb67db16 100644 --- a/session_insert.go +++ b/session_insert.go @@ -16,6 +16,9 @@ import ( "xorm.io/core" ) +// ErrNoElementsOnSlice represents an error there is no element when insert +var ErrNoElementsOnSlice = errors.New("No element on slice when insert") + // Insert insert one or more beans func (session *Session) Insert(beans ...interface{}) (int64, error) { var affected int64 @@ -67,21 +70,23 @@ func (session *Session) Insert(beans ...interface{}) (int64, error) { sliceValue := reflect.Indirect(reflect.ValueOf(bean)) if sliceValue.Kind() == reflect.Slice { size := sliceValue.Len() - if size > 0 { - if session.engine.SupportInsertMany() { - cnt, err := session.innerInsertMulti(bean) + if size <= 0 { + return 0, ErrNoElementsOnSlice + } + + if session.engine.SupportInsertMany() { + cnt, err := session.innerInsertMulti(bean) + if err != nil { + return affected, err + } + affected += cnt + } else { + for i := 0; i < size; i++ { + cnt, err := session.innerInsert(sliceValue.Index(i).Interface()) if err != nil { return affected, err } affected += cnt - } else { - for i := 0; i < size; i++ { - cnt, err := session.innerInsert(sliceValue.Index(i).Interface()) - if err != nil { - return affected, err - } - affected += cnt - } } } } else { diff --git a/session_insert_test.go b/session_insert_test.go index 657d2b12..9cd5b86a 100644 --- a/session_insert_test.go +++ b/session_insert_test.go @@ -1067,3 +1067,38 @@ func TestInsertMultiWithOmit(t *testing.T) { assert.EqualValues(t, 3, num) check() } + +func TestInsertTwice(t *testing.T) { + assert.NoError(t, prepareEngine()) + + type InsertStructA struct { + FieldA int + } + + type InsertStructB struct { + FieldB int + } + + assert.NoError(t, testEngine.Sync2(new(InsertStructA), new(InsertStructB))) + + var sliceA []InsertStructA // sliceA is empty + sliceB := []InsertStructB{ + InsertStructB{ + FieldB: 1, + }, + } + + ssn := testEngine.NewSession() + defer ssn.Close() + + err := ssn.Begin() + assert.NoError(t, err) + + _, err = ssn.Insert(sliceA) + assert.EqualValues(t, ErrNoElementsOnSlice, err) + + _, err = ssn.Insert(sliceB) + assert.NoError(t, err) + + assert.NoError(t, ssn.Commit()) +}