changeset 2198:4db1fa4f049c

Fairway availabilty import: Fixed row query leak.
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Tue, 12 Feb 2019 14:55:09 +0100
parents 3203c53a8d29
children b1735b09df6f
files pkg/imports/fa.go
diffstat 1 files changed, 43 insertions(+), 22 deletions(-) [+]
line wrap: on
line diff
--- 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