# HG changeset patch # User Sascha L. Teichmann # Date 1553179382 -3600 # Node ID a996f2ca9fa5da83a53e72f5e5fbd0d1ce8ebac3 # Parent 74afcd266249b7be5afa887301d06a602e1adbfe Simplified savepoint handling. diff -r 74afcd266249 -r a996f2ca9fa5 pkg/imports/misc.go --- a/pkg/imports/misc.go Thu Mar 21 14:29:47 2019 +0100 +++ b/pkg/imports/misc.go Thu Mar 21 15:43:02 2019 +0100 @@ -34,25 +34,33 @@ ctx context.Context, tx *sql.Tx, name string, -) error { - _, err := tx.ExecContext(ctx, "SAVEPOINT "+name) - return err -} +) func(func() error) error { + + var ( + savepoint = "SAVEPOINT " + name + rollback = "ROLLBACK TO SAVEPOINT " + name + release = "RELEASE SAVEPOINT " + name + ) -func RollbackToSavepoint( - ctx context.Context, - tx *sql.Tx, - name string, -) error { - _, err := tx.ExecContext(ctx, "ROLLBACK TO SAVEPOINT "+name) - return err -} + return func(fn func() error) (err error) { + if _, err = tx.ExecContext(ctx, savepoint); err != nil { + return + } + var done bool + defer func() { + if !done { + _, err2 := tx.ExecContext(ctx, rollback) + if err == nil { + err = err2 + } + } + }() + err = fn() -func ReleaseSavepoint( - ctx context.Context, - tx *sql.Tx, - name string, -) error { - _, err := tx.ExecContext(ctx, "RELEASE SAVEPOINT "+name) - return err + if err == nil { + done = true + _, err = tx.ExecContext(ctx, release) + } + return + } } diff -r 74afcd266249 -r a996f2ca9fa5 pkg/imports/wa.go --- a/pkg/imports/wa.go Thu Mar 21 14:29:47 2019 +0100 +++ b/pkg/imports/wa.go Thu Mar 21 15:43:02 2019 +0100 @@ -200,7 +200,7 @@ feedback.Info("Using EPSG: %d", epsg) - const featureSavepoint = "feature" + savepoint := Savepoint(ctx, tx, "feature") for _, feature := range rfc.Features { if feature.Properties == nil || feature.Geometry.Coordinates == nil { @@ -234,24 +234,18 @@ if err := json.Unmarshal(*feature.Geometry.Coordinates, &p); err != nil { return err } - if err := Savepoint(ctx, tx, featureSavepoint); err != nil { + if err := savepoint(func() error { + _, err := insertStmt.ExecContext( + ctx, + p.asWKB(), + epsg, + catccl, + dirimp, + ) return err - } - if _, err := insertStmt.ExecContext( - ctx, - p.asWKB(), - epsg, - catccl, - dirimp, - ); err != nil { + }); err != nil { feedback.Warn(handleError(err).Error()) - if err = RollbackToSavepoint(ctx, tx, featureSavepoint); err != nil { - return err - } } else { - if err = ReleaseSavepoint(ctx, tx, featureSavepoint); err != nil { - return err - } features++ } default: