view pkg/imports/erdms.go @ 5490:5f47eeea988d logging

Use own logging package.
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Mon, 20 Sep 2021 17:45:39 +0200
parents a5448426e4e2
children e1936db6db8e
line wrap: on
line source

// This is Free Software under GNU Affero General Public License v >= 3.0
// without warranty, see README.md and license for details.
//
// SPDX-License-Identifier: AGPL-3.0-or-later
// License-Filename: LICENSES/AGPL-3.0.txt
//
// Copyright (C) 2018, 2019 by via donau
//   – Österreichische Wasserstraßen-Gesellschaft mbH
// Software engineering by Intevation GmbH
//
// Author(s):
//  * Sascha L. Teichmann <sascha.teichmann@intevation.de>
//  * Tom Gottfried <tom.gottfried@intevation.de>

package imports

import (
	"context"
	"database/sql"
	"fmt"
	"strings"

	"gemma.intevation.de/gemma/pkg/log"
	"gemma.intevation.de/gemma/pkg/soap"
	"gemma.intevation.de/gemma/pkg/soap/erdms"
)

const (
	selectUserCountriesSQL = `
SELECT DISTINCT country FROM users.list_users
WHERE country <> '--'
`
)

func userCountries(ctx context.Context, conn *sql.Conn) ([]string, error) {
	rows, err := conn.QueryContext(ctx, selectUserCountriesSQL)
	if err != nil {
		return nil, err
	}
	defer rows.Close()

	var countries []string

	for rows.Next() {
		var country string
		if err = rows.Scan(&country); err != nil {
			return nil, err
		}
		countries = append(countries, country)
	}

	if err := rows.Err(); err != nil {
		return nil, err
	}

	return countries, nil
}

func getRisData(
	ctx context.Context,
	conn *sql.Conn,
	feedback Feedback,
	username string,
	password string,
	URL string,
	insecure bool,
	funcode string,
) ([]*erdms.GetRisDataXMLResponse, []string, error) {

	countries, err := userCountries(ctx, conn)
	if err != nil {
		return nil, nil, err
	}

	var auth *soap.BasicAuth
	if username != "" {
		auth = &soap.BasicAuth{
			Login:    username,
			Password: password,
		}
	}

	client := erdms.NewRefService(URL, insecure, auth)

	var responseData []*erdms.GetRisDataXMLResponse
	for _, country := range countries {

		feedback.Info("Request RIS index for country %s", country)

		request := &erdms.GetRisDataXML{
			GetRisDataXMLType: &erdms.GetRisDataXMLType{
				Subcode: erdms.NoNS{Text: country + "%"},
				Funcode: erdms.NoNS{Text: funcode},
			},
		}

		const maxTries = 3

		tries := 0

	again:
		data, err := client.GetRisDataXML(request)
		if err != nil {
			if t, ok := err.(interface{ Timeout() bool }); ok && t.Timeout() && tries < maxTries {
				log.Warnln("warn: ERDMS SOAP request timed out. Trying again.")
				tries++
				goto again
			}
			return nil, nil, fmt.Errorf(
				"Error requesting ERDMS service: %v", err)
		}
		responseData = append(responseData, data)
	}

	feedback.Info("Import data for countries: %s.",
		strings.Join(countries, ", "))

	return responseData, countries, nil
}