changeset 2758:a996f2ca9fa5

Simplified savepoint handling.
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Thu, 21 Mar 2019 15:43:02 +0100
parents 74afcd266249
children 7badd99c9315
files pkg/imports/misc.go pkg/imports/wa.go
diffstat 2 files changed, 37 insertions(+), 35 deletions(-) [+]
line wrap: on
line diff
--- 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
+	}
 }
--- 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: