Mercurial > gemma
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 } |