diff pkg/imports/agm.go @ 3502:45483dd0d801

AGM import: Don't pile up defer calls for every line in CSV file.
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Tue, 28 May 2019 11:33:57 +0200
parents 45a629a3a8b8
children 6e748f31777a
line wrap: on
line diff
--- a/pkg/imports/agm.go	Tue May 28 11:28:38 2019 +0200
+++ b/pkg/imports/agm.go	Tue May 28 11:33:57 2019 +0200
@@ -20,6 +20,7 @@
 	"database/sql"
 	"encoding/csv"
 	"encoding/json"
+	"errors"
 	"fmt"
 	"io"
 	"math"
@@ -205,6 +206,8 @@
 `
 )
 
+var errContinue = errors.New("continue")
+
 // Do executes the actual approved gauge measurements import.
 func (agm *ApprovedGaugeMeasurements) Do(
 	ctx context.Context,
@@ -412,46 +415,53 @@
 
 		newSourceOrganization := newSender
 
-		tx, err := conn.BeginTx(ctx, nil)
-		if err != nil {
-			return nil, err
-		}
-		defer tx.Rollback()
+		switch err := func() error {
+			tx, err := conn.BeginTx(ctx, nil)
+			if err != nil {
+				return err
+			}
+			defer tx.Rollback()
 
-		var newID int64
+			var newID int64
 
-		if err := tx.StmtContext(ctx, insertStmt).QueryRowContext(
-			ctx,
-			gid.CountryCode,
-			gid.LoCode,
-			gid.FairwaySection,
-			gid.Orc,
-			gid.Hectometre,
-			md,
-			newCountryCode,
-			newSender,
-			newLanguageCode,
-			newDateIssue,
-			newReferenceCode,
-			newValue,
-			newDateInfo,
-			newSourceOrganization,
-		).Scan(&newID); err != nil {
-			feedback.Warn(handleError(err).Error())
-			if err := tx.Rollback(); err != nil {
-				return nil, err
+			if err := tx.StmtContext(ctx, insertStmt).QueryRowContext(
+				ctx,
+				gid.CountryCode,
+				gid.LoCode,
+				gid.FairwaySection,
+				gid.Orc,
+				gid.Hectometre,
+				md,
+				newCountryCode,
+				newSender,
+				newLanguageCode,
+				newDateIssue,
+				newReferenceCode,
+				newValue,
+				newDateInfo,
+				newSourceOrganization,
+			).Scan(&newID); err != nil {
+				feedback.Warn(handleError(err).Error())
+				ignored++
+				return errContinue
 			}
-			ignored++
-			continue
-		}
-		if _, err := tx.StmtContext(ctx, trackStmt).ExecContext(
-			ctx, importID, "waterway.gauge_measurements", newID,
-		); err != nil {
+
+			if _, err := tx.StmtContext(ctx, trackStmt).ExecContext(
+				ctx, importID, "waterway.gauge_measurements", newID,
+			); err != nil {
+				return err
+			}
+
+			if err = tx.Commit(); err != nil {
+				err = fmt.Errorf("Commit failed: %v", err)
+			}
+			return err
+		}(); {
+		case err == errContinue:
+			continue lines
+		case err != nil:
 			return nil, err
 		}
-		if err := tx.Commit(); err != nil {
-			return nil, fmt.Errorf("Commit failed: %v", err)
-		}
 
 		n := newAGMLine(
 			newCountryCode,