# HG changeset patch # User Sascha L. Teichmann # Date 1591691087 -7200 # Node ID 569aaba23e203ec83c98b5459f3a104a0ea1f6a1 # Parent 41a67619c170dadf73185f6c3887bc8a6f5eb73a Simplified FD multi geometry code and don't give up if one part failed. diff -r 41a67619c170 -r 569aaba23e20 pkg/imports/fd.go --- a/pkg/imports/fd.go Mon Jun 08 19:29:40 2020 +0200 +++ b/pkg/imports/fd.go Tue Jun 09 10:24:47 2020 +0200 @@ -17,7 +17,6 @@ "context" "database/sql" "encoding/json" - "errors" "fmt" "io" "strings" @@ -48,8 +47,6 @@ Password string `json:"password,omitempty"` } -var errContinue = errors.New("continue") - // Description gives a short info about relevant facts of this import. func (fd *FairwayDimension) Description() (string, error) { return strings.Join([]string{ @@ -368,13 +365,32 @@ dateInfo = (*props.HydroSorDat).Time } - // Store a feature in the database. - storeFeature := func(p polygonSlice) error { + var polys multiPolygonSlice + + switch feature.Geometry.Type { + case "Polygon": + var p polygonSlice + if err := json.Unmarshal(*feature.Geometry.Coordinates, &p); err != nil { + return err + } + polys = multiPolygonSlice{p} + case "MultiPolygon": + if err := json.Unmarshal(*feature.Geometry.Coordinates, &polys); err != nil { + return err + } + default: + unsupported[feature.Geometry.Type]++ + continue features + } + + // Store the features. + storePolygons: + for _, p := range polys { var fdid int64 var lat, lon float64 - err = savepoint(func() error { - err := insertStmt.QueryRowContext( + switch err := savepoint(func() error { + return insertStmt.QueryRowContext( ctx, p.asWKB(), epsg, @@ -385,19 +401,17 @@ dateInfo, fd.SourceOrganization, ).Scan(&fdid, &lat, &lon) - return err - }) - switch { + }); { case err == sql.ErrNoRows: outside++ // ignore -> filtered by responsibility area (stretches) - return errContinue + continue storePolygons case err != nil: feedback.Error(pgxutils.ReadableError{Err: err}.Error()) - return errContinue + continue storePolygons } // Store for potential later removal. - if err = track( + if err := track( ctx, tx, importID, "waterway.fairway_dimensions", fdid, ); err != nil { return err @@ -405,38 +419,6 @@ fds = append(fds, fdSummary{ID: fdid, Lat: lat, Lon: lon}) features++ - - return nil - } - - switch feature.Geometry.Type { - case "Polygon": - var p polygonSlice - if err := json.Unmarshal(*feature.Geometry.Coordinates, &p); err != nil { - return err - } - switch err := storeFeature(p); { - case err == errContinue: - continue features - case err != nil: - return err - } - - case "MultiPolygon": - var mp multiPolygonSlice - if err := json.Unmarshal(*feature.Geometry.Coordinates, &mp); err != nil { - return err - } - for i := range mp { - switch err := storeFeature(mp[i]); { - case err == errContinue: - continue features - case err != nil: - return err - } - } - default: - unsupported[feature.Geometry.Type]++ } } return nil