comparison pkg/imports/misc.go @ 2758:a996f2ca9fa5

Simplified savepoint handling.
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Thu, 21 Mar 2019 15:43:02 +0100
parents 542d3441c2d8
children f464cbcdf2f2
comparison
equal deleted inserted replaced
2757:74afcd266249 2758:a996f2ca9fa5
32 32
33 func Savepoint( 33 func Savepoint(
34 ctx context.Context, 34 ctx context.Context,
35 tx *sql.Tx, 35 tx *sql.Tx,
36 name string, 36 name string,
37 ) error { 37 ) func(func() error) error {
38 _, err := tx.ExecContext(ctx, "SAVEPOINT "+name) 38
39 return err 39 var (
40 savepoint = "SAVEPOINT " + name
41 rollback = "ROLLBACK TO SAVEPOINT " + name
42 release = "RELEASE SAVEPOINT " + name
43 )
44
45 return func(fn func() error) (err error) {
46 if _, err = tx.ExecContext(ctx, savepoint); err != nil {
47 return
48 }
49 var done bool
50 defer func() {
51 if !done {
52 _, err2 := tx.ExecContext(ctx, rollback)
53 if err == nil {
54 err = err2
55 }
56 }
57 }()
58 err = fn()
59
60 if err == nil {
61 done = true
62 _, err = tx.ExecContext(ctx, release)
63 }
64 return
65 }
40 } 66 }
41
42 func RollbackToSavepoint(
43 ctx context.Context,
44 tx *sql.Tx,
45 name string,
46 ) error {
47 _, err := tx.ExecContext(ctx, "ROLLBACK TO SAVEPOINT "+name)
48 return err
49 }
50
51 func ReleaseSavepoint(
52 ctx context.Context,
53 tx *sql.Tx,
54 name string,
55 ) error {
56 _, err := tx.ExecContext(ctx, "RELEASE SAVEPOINT "+name)
57 return err
58 }