# HG changeset patch # User Tom Gottfried # Date 1552583375 -3600 # Node ID 00b0a7b2225ab4997331198d2d131403f4d265d9 # Parent 74031fbd3d50773e7b9055d953c0fd91a42f9e82 Waterway area import: do not fail if INSERT of one item fails diff -r 74031fbd3d50 -r 00b0a7b2225a pkg/imports/misc.go --- 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 +} diff -r 74031fbd3d50 -r 00b0a7b2225a pkg/imports/wa.go --- 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]++ }