# HG changeset patch # User Sascha L. Teichmann # Date 1549979709 -3600 # Node ID 4db1fa4f049c13a0ff7968fa7a5c53dd432128a1 # Parent 3203c53a8d29ba65d3ad12b89040e614a511d524 Fairway availabilty import: Fixed row query leak. diff -r 3203c53a8d29 -r 4db1fa4f049c pkg/imports/fa.go --- a/pkg/imports/fa.go Tue Feb 12 14:29:16 2019 +0100 +++ b/pkg/imports/fa.go Tue Feb 12 14:55:09 2019 +0100 @@ -184,24 +184,16 @@ ResponsibleCountry string } -// Do executes the actual fairway availability import. -func (fa *FairwayAvailability) Do( - ctx context.Context, - importID int64, - conn *sql.Conn, - feedback Feedback, -) (interface{}, error) { +func loadBottleneckCountries(ctx context.Context, conn *sql.Conn) ([]bottleneckCountry, error) { // Get available bottlenecks from database for use as filter in SOAP request - var rows *sql.Rows - rows, err := conn.QueryContext(ctx, listBottlenecksSQL) if err != nil { return nil, err } defer rows.Close() - bottlenecks := []bottleneckCountry{} + var bottlenecks []bottleneckCountry for rows.Next() { var bn bottleneckCountry @@ -216,18 +208,21 @@ if err = rows.Err(); err != nil { return nil, err } + return bottlenecks, nil +} - var faRows *sql.Rows - faRows, err = conn.QueryContext(ctx, listFairwayAvailabilitySQL) +func loadFairwayAvailabilities(ctx context.Context, conn *sql.Conn) (map[uniqueFairwayAvailability]int64, error) { + rows, err := conn.QueryContext(ctx, listFairwayAvailabilitySQL) if err != nil { return nil, err } + defer rows.Close() fairwayAvailabilities := map[uniqueFairwayAvailability]int64{} - for faRows.Next() { + for rows.Next() { var id int64 var bnId string var sd time.Time - if err = faRows.Scan( + if err = rows.Scan( &id, &bnId, &sd, @@ -240,23 +235,51 @@ } fairwayAvailabilities[key] = id } - if err = faRows.Err(); err != nil { + if err = rows.Err(); err != nil { return nil, err } + return fairwayAvailabilities, nil +} - var latestDate pgtype.Timestamp - err = conn.QueryRowContext(ctx, latestMeasureDateSQL).Scan(&latestDate) +func latestDate(ctx context.Context, conn *sql.Conn) (pgtype.Timestamp, error) { + var date pgtype.Timestamp + err := conn.QueryRowContext(ctx, latestMeasureDateSQL).Scan(&date) switch { case err == sql.ErrNoRows: - latestDate = pgtype.Timestamp{ + date = pgtype.Timestamp{ // Fill Database with data of the last 5 days. Change this to a more useful value. Time: time.Now().AddDate(0, 0, -5), } case err != nil: + return pgtype.Timestamp{}, err + } + return date, nil +} + +// Do executes the actual fairway availability import. +func (fa *FairwayAvailability) Do( + ctx context.Context, + importID int64, + conn *sql.Conn, + feedback Feedback, +) (interface{}, error) { + + bottlenecks, err := loadBottleneckCountries(ctx, conn) + if err != nil { return nil, err } - faids, err := fa.doForFAs(ctx, bottlenecks, fairwayAvailabilities, latestDate, conn, feedback) + fairwayAvailabilities, err := loadFairwayAvailabilities(ctx, conn) + if err != nil { + return nil, err + } + + latest, err := latestDate(ctx, conn) + if err != nil { + return nil, err + } + + faids, err := fa.doForFAs(ctx, bottlenecks, fairwayAvailabilities, latest, conn, feedback) if err != nil { feedback.Error("Error processing data: %s", err) } @@ -305,13 +328,11 @@ } resp, err := client.Get_bottleneck_fa(req) if err != nil { - feedback.Error("%v", err) return nil, err } if resp.Get_bottleneck_faResult == nil { - err := errors.New("no fairway availabilities found") - return nil, err + return nil, errors.New("no fairway availabilities found") } result := resp.Get_bottleneck_faResult