changeset 2659:00b0a7b2225a

Waterway area import: do not fail if INSERT of one item fails
author Tom Gottfried <tom@intevation.de>
date Thu, 14 Mar 2019 18:09:35 +0100
parents 74031fbd3d50
children 2b4b9fa9812c
files pkg/imports/misc.go pkg/imports/wa.go
diffstat 2 files changed, 49 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/pkg/imports/misc.go	Thu Mar 14 16:59:14 2019 +0100
+++ b/pkg/imports/misc.go	Thu Mar 14 18:09:35 2019 +0100
@@ -11,6 +11,8 @@
 package imports
 
 import (
+	"context"
+	"database/sql"
 	"fmt"
 	"strings"
 )
@@ -27,3 +29,36 @@
 	}
 	return b.String()
 }
+
+func Savepoint(
+	tx *sql.Tx,
+	ctx context.Context,
+	name string,
+) error {
+	if _, err := tx.ExecContext(ctx, "SAVEPOINT "+name); err != nil {
+		return err
+	}
+	return nil
+}
+
+func RollbackToSavepoint(
+	tx *sql.Tx,
+	ctx context.Context,
+	name string,
+) error {
+	if _, err := tx.ExecContext(ctx, "ROLLBACK TO SAVEPOINT "+name); err != nil {
+		return err
+	}
+	return nil
+}
+
+func ReleaseSavepoint(
+	tx *sql.Tx,
+	ctx context.Context,
+	name string,
+) error {
+	if _, err := tx.ExecContext(ctx, "RELEASE SAVEPOINT "+name); err != nil {
+		return err
+	}
+	return nil
+}
--- a/pkg/imports/wa.go	Thu Mar 14 16:59:14 2019 +0100
+++ b/pkg/imports/wa.go	Thu Mar 14 18:09:35 2019 +0100
@@ -197,6 +197,8 @@
 
 		feedback.Info("Using EPSG: %d", epsg)
 
+		const featureSavepoint = "feature"
+
 		for _, feature := range rfc.Features {
 			if feature.Properties == nil || feature.Geometry.Coordinates == nil {
 				missingProperties++
@@ -229,6 +231,9 @@
 				if err := json.Unmarshal(*feature.Geometry.Coordinates, &p); err != nil {
 					return err
 				}
+				if err := Savepoint(tx, ctx, featureSavepoint); err != nil {
+					return err
+				}
 				if _, err := insertStmt.ExecContext(
 					ctx,
 					p.asWKB(),
@@ -236,9 +241,16 @@
 					catccl,
 					dirimp,
 				); err != nil {
-					return err
+					feedback.Warn(handleError(err).Error())
+					if err = RollbackToSavepoint(tx, ctx, featureSavepoint); err != nil {
+						return err
+					}
+				} else {
+					if err = ReleaseSavepoint(tx, ctx, featureSavepoint); err != nil {
+						return err
+					}
+					features++
 				}
-				features++
 			default:
 				unsupported[feature.Geometry.Type]++
 			}