Mercurial > gemma
changeset 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 | c5c7cc24fe72 |
children | b6dd09044951 |
files | pkg/imports/agm.go |
diffstat | 1 files changed, 45 insertions(+), 35 deletions(-) [+] |
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,