Mercurial > gemma
diff pkg/imports/wg.go @ 2633:eb1d119f253f
Fetch data from ERDMS for all allowed countries
This will enable a sys_admin to import data for all countries while
a waterway_admin still can only import data for his own country.
author | Tom Gottfried <tom@intevation.de> |
---|---|
date | Wed, 13 Mar 2019 18:19:44 +0100 |
parents | e199655809c1 |
children | d9903cb34842 |
line wrap: on
line diff
--- a/pkg/imports/wg.go Wed Mar 13 17:13:15 2019 +0100 +++ b/pkg/imports/wg.go Wed Mar 13 18:19:44 2019 +0100 @@ -18,14 +18,11 @@ "context" "database/sql" "errors" - "fmt" - "strings" "time" "github.com/jackc/pgx/pgtype" "gemma.intevation.de/gemma/pkg/models" - "gemma.intevation.de/gemma/pkg/soap" "gemma.intevation.de/gemma/pkg/soap/erdms" ) @@ -69,8 +66,6 @@ func (*WaterwayGauge) CleanUp() error { return nil } const ( - selectCurrentUserCountrySQL = `SELECT users.current_user_country()` - hasGaugeSQL = ` SELECT true FROM waterway.gauges @@ -145,41 +140,19 @@ } defer tx.Rollback() - var country string - err = tx.QueryRowContext(ctx, selectCurrentUserCountrySQL).Scan(&country) - switch { - case err == sql.ErrNoRows: - return nil, errors.New("Cannot figure out user country") - case err != nil: + responseData, err := getRisData( + tx, + ctx, + feedback, + wg.Username, + wg.Password, + wg.URL, + wg.Insecure, + "wtwgag") + if err != nil { return nil, err } - country = strings.ToUpper(country) - feedback.Info("Using country '%s'.", country) - - var auth *soap.BasicAuth - if wg.Username != "" { - auth = &soap.BasicAuth{ - Login: wg.Username, - Password: wg.Password, - } - } - - client := erdms.NewRefService(wg.URL, wg.Insecure, auth) - - request := &erdms.GetRisDataXML{ - GetRisDataXMLType: &erdms.GetRisDataXMLType{ - Subcode: erdms.NoNS{Text: country + "%"}, - Funcode: erdms.NoNS{Text: "wtwgag"}, - }, - } - - data, err := client.GetRisDataXML(request) - - if err != nil { - return nil, fmt.Errorf("Error requesting ERDMS service: %v", err) - } - hasGaugeStmt, err := tx.PrepareContext(ctx, hasGaugeSQL) if err != nil { return nil, err @@ -189,59 +162,62 @@ var ignored int type idxCode struct { + jdx int idx int code *models.Isrs } var news, olds []idxCode - for i, dr := range data.RisdataReturn { - if dr.RisidxCode == nil { - ignored++ - continue - } - code, err := models.IsrsFromString(string(*dr.RisidxCode)) - if err != nil { - feedback.Warn("invalid ISRS code %v", err) - ignored++ - continue - } + for j, data := range responseData { + for i, dr := range data.RisdataReturn { + if dr.RisidxCode == nil { + ignored++ + continue + } + code, err := models.IsrsFromString(string(*dr.RisidxCode)) + if err != nil { + feedback.Warn("invalid ISRS code %v", err) + ignored++ + continue + } - if dr.Objname.Loc == nil { - feedback.Warn("missing objname: %s", code) - ignored++ - continue - } + if dr.Objname.Loc == nil { + feedback.Warn("missing objname: %s", code) + ignored++ + continue + } - if dr.Lat == nil || dr.Lon == nil { - feedback.Warn("missing lat/lon: %s", code) - ignored++ - continue - } + if dr.Lat == nil || dr.Lon == nil { + feedback.Warn("missing lat/lon: %s", code) + ignored++ + continue + } - if dr.Zeropoint == nil { - feedback.Warn("missing zeropoint: %s", code) - ignored++ - continue - } + if dr.Zeropoint == nil { + feedback.Warn("missing zeropoint: %s", code) + ignored++ + continue + } - var dummy bool - err = hasGaugeStmt.QueryRowContext(ctx, - code.CountryCode, - code.LoCode, - code.FairwaySection, - code.Orc, - code.Hectometre, - ).Scan(&dummy) - switch { - case err == sql.ErrNoRows: - news = append(news, idxCode{idx: i, code: code}) - case err != nil: - return nil, err - case !dummy: - return nil, errors.New("Unexpected result") - default: - olds = append(olds, idxCode{idx: i, code: code}) + var dummy bool + err = hasGaugeStmt.QueryRowContext(ctx, + code.CountryCode, + code.LoCode, + code.FairwaySection, + code.Orc, + code.Hectometre, + ).Scan(&dummy) + switch { + case err == sql.ErrNoRows: + news = append(news, idxCode{jdx: j, idx: i, code: code}) + case err != nil: + return nil, err + case !dummy: + return nil, errors.New("Unexpected result") + default: + olds = append(olds, idxCode{jdx: j, idx: i, code: code}) + } } } feedback.Info("ignored gauges: %d", ignored) @@ -298,7 +274,7 @@ // insert/update the gauges for i := range news { ic := &news[i] - dr := data.RisdataReturn[ic.idx] + dr := responseData[ic.jdx].RisdataReturn[ic.idx] feedback.Info("insert/update %s", ic.code)