Mercurial > gemma
view pkg/imports/erdms.go @ 5679:03dfbe675842 sr-v2
Simplified version handling.
author | Sascha L. Teichmann <sascha.teichmann@intevation.de> |
---|---|
date | Sun, 11 Feb 2024 12:37:09 +0100 |
parents | 57c655b93ba8 |
children |
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/config" "gemma.intevation.de/gemma/pkg/log" "gemma.intevation.de/gemma/pkg/soap" erdms "gemma.intevation.de/gemma/pkg/soap/erdms2" ) 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.Auth if tokenURL := config.TokenURL(); tokenURL != "" && username != "" { token, err := soap.FetchToken(tokenURL, username, password) if err != nil { return nil, nil, fmt.Errorf( "error requesting token for ERDMS service: %w", err) } auth = token } client := erdms.NewRefService(URL, insecure, auth) var responseData []*erdms.GetRisDataXMLResponse fcode := erdms.NoNS{Text: funcode} for _, country := range countries { feedback.Info("Request RIS index for country %s", country) subcode := erdms.NoNS{Text: country + "%"} request := &erdms.GetRisDataXML{ GetRisDataXMLType: &erdms.GetRisDataXMLType{ Subcode: &subcode, Funcode: &fcode, }, } 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 }