Skip to content

Commit 3952ca0

Browse files
authored
Merge pull request #3 from smallstep/tx-exec
Add Exec method to Tx
2 parents d4457d0 + 9267dcb commit 3952ca0

2 files changed

Lines changed: 122 additions & 0 deletions

File tree

sequel.go

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -305,6 +305,12 @@ func (t *Tx) Rollback() error {
305305
return t.tx.Rollback()
306306
}
307307

308+
// Exec executes a query without returning any rows. The args are for any
309+
// placeholder parameters in the query.
310+
func (t *Tx) Exec(query string, args ...any) (sql.Result, error) {
311+
return t.tx.Exec(query, args...)
312+
}
313+
308314
// Insert adds a new insert query for the given model in the transaction.
309315
func (t *Tx) Insert(arg Model) error {
310316
var id string

sequel_test.go

Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,14 @@ import (
1919

2020
var personSelectQ, personInsertQ, personUpdateQ, personDeleteQ string
2121
var personInsertExecQ, personHardDeleteQ string
22+
var personExecQ string
2223

2324
func init() {
2425
builder := qb.Must(&personModel{})
2526
personSelectQ, personInsertQ, personUpdateQ, personDeleteQ = Queries(builder)
2627
personInsertExecQ = builder.NamedInsert()
2728
personHardDeleteQ = builder.HardDelete()
29+
personExecQ = builder.Insert()
2830
}
2931

3032
type personModel struct {
@@ -310,3 +312,117 @@ func TestDBQueries(t *testing.T) {
310312
assert.NoError(t, RowsAffected(res, 4)) // p1 to p4, p5 is hard deleted
311313
})
312314
}
315+
316+
func TestTxQueries(t *testing.T) {
317+
db, err := New(postgresDataSource)
318+
require.NoError(t, err)
319+
t.Cleanup(func() {
320+
assert.NoError(t, db.Close())
321+
})
322+
323+
ctx := context.Background()
324+
325+
tx, err := db.Begin(ctx)
326+
require.NoError(t, err)
327+
defer func() {
328+
assert.NoError(t, tx.Rollback())
329+
}()
330+
331+
p1 := &personModel{
332+
Name: "Lucky Luke",
333+
Email: NullString("lucky@example.com"),
334+
}
335+
p2 := &personModelExtra{
336+
personModel: personModel{
337+
Base: Base{
338+
ID: "d59a4685-9ab9-4323-9af9-14ca352cc65b",
339+
},
340+
Name: "Jolly Jumper",
341+
Email: NullString("jolly@example.com"),
342+
},
343+
}
344+
345+
t.Run("insert", func(t *testing.T) {
346+
tx, err := db.Begin(ctx)
347+
require.NoError(t, err)
348+
defer func() {
349+
assert.Error(t, tx.Rollback())
350+
}()
351+
352+
assert.NoError(t, tx.Insert(p1))
353+
assert.NoError(t, tx.Insert(p2))
354+
assert.NoError(t, tx.Commit())
355+
})
356+
357+
t.Run("insert error", func(t *testing.T) {
358+
tx, err := db.Begin(ctx)
359+
require.NoError(t, err)
360+
assert.Error(t, tx.Insert(p1))
361+
assert.NoError(t, tx.Rollback())
362+
})
363+
364+
t.Run("update", func(t *testing.T) {
365+
tx, err := db.Begin(ctx)
366+
require.NoError(t, err)
367+
defer func() {
368+
assert.Error(t, tx.Rollback())
369+
}()
370+
371+
assert.NoError(t, tx.Update(p1))
372+
assert.NoError(t, tx.Commit())
373+
})
374+
375+
t.Run("update error", func(t *testing.T) {
376+
tx, err := db.Begin(ctx)
377+
require.NoError(t, err)
378+
pp := &personModel{
379+
Base: p1.Base,
380+
Name: p1.Name,
381+
Email: p2.Email,
382+
}
383+
384+
assert.Error(t, tx.Update(pp))
385+
assert.NoError(t, tx.Rollback())
386+
})
387+
388+
t.Run("delete", func(t *testing.T) {
389+
tx, err := db.Begin(ctx)
390+
require.NoError(t, err)
391+
defer func() {
392+
assert.Error(t, tx.Rollback())
393+
}()
394+
395+
assert.NoError(t, tx.Delete(p1))
396+
assert.NoError(t, tx.HardDelete(p2))
397+
assert.NoError(t, tx.Commit())
398+
})
399+
400+
t.Run("delete error", func(t *testing.T) {
401+
tx, err := db.Begin(ctx)
402+
require.NoError(t, err)
403+
assert.Error(t, tx.Delete(p2))
404+
assert.NoError(t, tx.Rollback())
405+
})
406+
407+
t.Run("hard delete error", func(t *testing.T) {
408+
tx, err := db.Begin(ctx)
409+
require.NoError(t, err)
410+
assert.Error(t, tx.HardDelete(p2))
411+
assert.NoError(t, tx.Rollback())
412+
})
413+
414+
t.Run("exec", func(t *testing.T) {
415+
tx, err := db.Begin(ctx)
416+
require.NoError(t, err)
417+
defer func() {
418+
assert.Error(t, tx.Rollback())
419+
}()
420+
421+
res, err := tx.Exec(personExecQ, p2.ID, p2.CreatedAt, p2.UpdatedAt, nil, p2.Name, p2.Email)
422+
assert.NoError(t, err)
423+
n, err := res.RowsAffected()
424+
assert.NoError(t, err)
425+
assert.Equal(t, int64(1), n)
426+
assert.NoError(t, tx.Commit())
427+
})
428+
}

0 commit comments

Comments
 (0)