From c6d79bc91196709deb36e50c273f291722a124d0 Mon Sep 17 00:00:00 2001 From: Jim Date: Fri, 12 Nov 2021 18:10:09 -0500 Subject: [PATCH] feature (db): Add WithOnConflict support to CreateItems(...) (#1699) --- internal/db/read_writer.go | 2 +- internal/db/read_writer_ext_test.go | 31 +++++++++++++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/internal/db/read_writer.go b/internal/db/read_writer.go index 338339a68d..e942b7c1f7 100644 --- a/internal/db/read_writer.go +++ b/internal/db/read_writer.go @@ -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()) } } diff --git a/internal/db/read_writer_ext_test.go b/internal/db/read_writer_ext_test.go index 2405da0753..6b6a9e3408 100644 --- a/internal/db/read_writer_ext_test.go +++ b/internal/db/read_writer_ext_test.go @@ -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) + }) }