changeset 1812:4910bcfab319

Waterway gauge import: Work around the expected (but nonetheless silly) namespace issues with the SOAP interface.
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Wed, 16 Jan 2019 00:51:51 +0100
parents c21f72775f6b
children 423a18913d0e
files pkg/imports/wg.go pkg/soap/erdms/service.go pkg/soap/ifaf/service.go
diffstat 3 files changed, 52 insertions(+), 21 deletions(-) [+]
line wrap: on
line diff
--- a/pkg/imports/wg.go	Tue Jan 15 19:46:41 2019 +0100
+++ b/pkg/imports/wg.go	Wed Jan 16 00:51:51 2019 +0100
@@ -18,6 +18,7 @@
 	"database/sql"
 	"errors"
 	"log"
+	"strings"
 
 	"gemma.intevation.de/gemma/pkg/common"
 	"gemma.intevation.de/gemma/pkg/soap"
@@ -73,6 +74,10 @@
 
 func (*WaterwayGauge) CleanUp() error { return nil }
 
+const (
+	selectCurrentUserCountrySQL = `SELECT users.current_user_country()`
+)
+
 func (wg *WaterwayGauge) Do(
 	ctx context.Context,
 	importID int64,
@@ -80,6 +85,24 @@
 	feedback Feedback,
 ) (interface{}, error) {
 
+	tx, err := conn.BeginTx(ctx, nil)
+	if err != nil {
+		return nil, err
+	}
+	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:
+		return nil, err
+	}
+
+	country = strings.ToUpper(country)
+	feedback.Info("Using country '%s'.", country)
+
 	var auth *soap.BasicAuth
 	if wg.Username != "" {
 		auth = &soap.BasicAuth{
@@ -92,13 +115,11 @@
 
 	request := &erdms.GetRisDataXML{
 		GetRisDataXMLType: &erdms.GetRisDataXMLType{
-			Subcode: "AT%",
-			Funcode: "wtwgag",
+			Subcode: erdms.NoNS{Text: country + "%"},
+			Funcode: erdms.NoNS{Text: "wtwgag"},
 		},
 	}
 
-	log.Printf("user: %s password: %s\n", wg.Username, wg.Password)
-
 	data, err := client.GetRisDataXML(request)
 
 	if err != nil {
@@ -106,7 +127,18 @@
 		return nil, err
 	}
 
-	_ = data
+	for _, dr := range data.RisdataReturn {
+		if dr.RisidxCode == nil {
+			log.Printf("warn: RisidxCode == nil")
+			continue
+		}
+		if dr.Objname.Loc == nil {
+			log.Printf("warn: Objname == nil")
+			continue
+		}
+		log.Printf("RisidxCode: %s\n", *dr.RisidxCode)
+		log.Printf("\tObjname: %s\n", *dr.Objname.Loc)
+	}
 
 	// TODO: Implement me!
 	return nil, errors.New("Not implemented, yet!")
--- a/pkg/soap/erdms/service.go	Tue Jan 15 19:46:41 2019 +0100
+++ b/pkg/soap/erdms/service.go	Wed Jan 16 00:51:51 2019 +0100
@@ -20,10 +20,6 @@
 	"gemma.intevation.de/gemma/pkg/soap"
 )
 
-// against "unused imports"
-var _ time.Time
-var _ xml.Name
-
 // adn (dgs goods) internal adn code (unnr + seqnr: to make each adn good unique)
 type AdnCodeType string
 
@@ -564,14 +560,21 @@
 	RefdataReturn []*RefdataReturnType `xml:"refdataReturn,omitempty"`
 }
 
+// NoNS is a helper type to allow string tags without a namespace.
+type NoNS struct {
+	NS   string `xml:"xmlns,attr"`
+	Text string `xml:",chardata"`
+}
+
 type GetRisDataXMLType struct {
-	XMLName xml.Name `xml:"http://rwsreftool/ getRisDataXMLType"`
-
-	Subcode string `xml:"subcode,omitempty"`
-
-	Funcode string `xml:"funcode,omitempty"`
-
-	Version *RefrecVersionType `xml:"version,omitempty"`
+	// XMLName xml.Name `xml:"http://rwsreftool/ getRisDataXMLType"`
+
+	//Subcode string `xml:"subcode,omitempty"`
+	Subcode NoNS `xml:"subcode,omitempty"`
+
+	Funcode NoNS `xml:"funcode,omitempty"`
+
+	Version *RefrecVersionType `xml:"http://rwsreftool/ version,omitempty"`
 }
 
 type GetRisDataXMLResponseType struct {
@@ -695,7 +698,7 @@
 }
 
 type Ris_idxType struct {
-	XMLName xml.Name `xml:"http://rwsreftool/ ris_idxType"`
+	//XMLName xml.Name `xml:"http://rwsreftool/ ris_idxType"`
 
 	// Be sure to edit, change the basic Simpletypes, dont edit any of the (sub)elements from here!!!
 	RisidxCode *RisCodeType `xml:"risidxCode,omitempty"`
--- a/pkg/soap/ifaf/service.go	Tue Jan 15 19:46:41 2019 +0100
+++ b/pkg/soap/ifaf/service.go	Wed Jan 16 00:51:51 2019 +0100
@@ -23,10 +23,6 @@
 	"gemma.intevation.de/gemma/pkg/soap"
 )
 
-// against "unused imports"
-var _ time.Time
-var _ xml.Name
-
 type Get_bottleneck_fa struct {
 	XMLName xml.Name `xml:"http://www.ris.eu/fairwayavailability/3.0 get_bottleneck_fa"`