feature (db): Add WithOnConflict support to CreateItems(...) (#1699)

pull/1700/head
Jim 5 years ago committed by GitHub
parent 5d2b0e94aa
commit c6d79bc911
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -433,7 +433,7 @@ func (rw *Db) CreateItems(ctx context.Context, createItems []interface{}, opt ..
}
}
for _, item := range createItems {
if err := rw.Create(ctx, item); err != nil {
if err := rw.Create(ctx, item, WithOnConflict(opts.withOnConflict), WithReturnRowsAffected(opts.withRowsAffected)); err != nil {
return errors.Wrap(ctx, err, op, errors.WithoutEvent())
}
}

@ -150,4 +150,35 @@ func TestDb_Create_OnConflict(t *testing.T) {
}
})
}
t.Run("CreateItems", func(t *testing.T) {
assert, require := assert.New(t), require.New(t)
conflictUser, err := db_test.NewTestUser()
require.NoError(err)
userNameId, err := db.NewPublicId("test-user-name")
require.NoError(err)
conflictUser.PublicId = initialUser.PublicId
conflictUser.Name = userNameId
md := oplog.Metadata{
"resource-public-id": []string{conflictUser.PublicId},
"op-type": []string{oplog.OpType_OP_TYPE_CREATE.String()},
}
onConflict := db.OnConflict{
Target: db.Constraint("db_test_user_public_id_key"),
Action: db.SetColumns([]string{"name"}),
}
users := []interface{}{}
users = append(users, conflictUser)
var rowsAffected int64
err = rw.CreateItems(ctx, users, db.WithOnConflict(&onConflict), db.WithOplog(wrapper, md), db.WithReturnRowsAffected(&rowsAffected))
require.NoError(err)
foundUser, err := db_test.NewTestUser()
require.NoError(err)
foundUser.PublicId = conflictUser.PublicId
err = rw.LookupByPublicId(context.Background(), foundUser)
require.NoError(err)
assert.Equal(int64(1), rowsAffected)
assert.Equal(conflictUser.Id, foundUser.Id)
assert.Equal(conflictUser.Name, foundUser.Name)
})
}

Loading…
Cancel
Save