# HG changeset patch # User Sascha L. Teichmann # Date 1582910676 -3600 # Node ID 5890e62e6d52eb8b1eca6fc9516f59df8437e633 # Parent 5621586e7a54781bfc8fcbc656c899c54ba6f858 Simplified storing of fm types to database. diff -r 5621586e7a54 -r 5890e62e6d52 go.mod --- a/go.mod Fri Feb 28 17:55:55 2020 +0100 +++ b/go.mod Fri Feb 28 18:24:36 2020 +0100 @@ -5,6 +5,7 @@ require ( github.com/cockroachdb/apd v1.1.0 // indirect github.com/etcd-io/bbolt v1.3.3 + github.com/fatih/structs v1.1.0 github.com/fogleman/contourmap v0.0.0-20190814184649-9f61d36c4199 github.com/gofrs/uuid v3.2.0+incompatible // indirect github.com/gorilla/mux v1.7.3 diff -r 5621586e7a54 -r 5890e62e6d52 go.sum --- a/go.sum Fri Feb 28 17:55:55 2020 +0100 +++ b/go.sum Fri Feb 28 18:24:36 2020 +0100 @@ -26,6 +26,8 @@ github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/etcd-io/bbolt v1.3.3 h1:gSJmxrs37LgTqR/oyJBWok6k6SvXEUerFTbltIhXkBM= github.com/etcd-io/bbolt v1.3.3/go.mod h1:ZF2nL25h33cCyBtcyWeZ2/I3HQOfTP+0PIEvHjkjCrw= +github.com/fatih/structs v1.1.0 h1:Q7juDM0QtcnhCpeyLGQKyg4TOIghuNXrkL32pHAUMxo= +github.com/fatih/structs v1.1.0/go.mod h1:9NiDSp5zOcgEDl+j00MP/WkGVPOlPRLejGD8Ga6PJ7M= github.com/fogleman/contourmap v0.0.0-20190814184649-9f61d36c4199 h1:kufr0u0RIG5ACpjFsPRbbuHa0FhMWsS3tnSFZ2hf07s= github.com/fogleman/contourmap v0.0.0-20190814184649-9f61d36c4199/go.mod h1:mqaaaP4j7nTF8T/hx5OCljA7BYWHmrH2uh+Q023OchE= github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= diff -r 5621586e7a54 -r 5890e62e6d52 pkg/imports/fm.go --- a/pkg/imports/fm.go Fri Feb 28 17:55:55 2020 +0100 +++ b/pkg/imports/fm.go Fri Feb 28 18:24:36 2020 +0100 @@ -20,6 +20,7 @@ "strings" "gemma.intevation.de/gemma/pkg/pgxutils" + "github.com/fatih/structs" ) type ( @@ -174,6 +175,18 @@ } ) +func (props *bcnlatIencProperties) attrib() *string { + return props.Dirimp +} + +func (props *daymarIencProperties) attrib() *string { + return props.Dirimp +} + +func (props *notmrkProperties) attrib() *string { + return props.Dirimp +} + const ( BCNLATHYDROJobKind JobKind = "fm_bcnlat_hydro" BCNLATIENCJobKind JobKind = "fm_bcnlat_ienc" @@ -200,7 +213,7 @@ createInsertFMSQL("bcnlat_hydro", "colour", "colpat", "condtn", "bcnshp", "catlam"), ), - consumeBCNLATHydro, + consume, createInvalidation("bcnlat_hydro"), func() interface{} { return new(bcnlatHydroProperties) }, ), @@ -216,7 +229,7 @@ "colour", "colpat", "condtn", "bcnshp", "catlam"), insertBcnlatDirimpSQL, ), - consumeBCNLATIenc, + consume, createInvalidation("bcnlat_ienc"), func() interface{} { return new(bcnlatIencProperties) }, ), @@ -232,7 +245,7 @@ "colour", "colpat", "conrad", "marsys", "boyshp", "catlam"), ), - consumeBOYLATHydro, + consume, createInvalidation("boylat_hydro"), func() interface{} { return new(boylatHydroProperties) }, ), @@ -248,7 +261,7 @@ "colour", "colpat", "conrad", "marsys", "boyshp", "catlam"), ), - consumeBOYLATIenc, + consume, createInvalidation("boylat_ienc"), func() interface{} { return new(boylatIencProperties) }, ), @@ -264,7 +277,7 @@ "colour", "colpat", "conrad", "marsys", "boyshp", "catcam"), ), - consumeBOYCAR, + consume, createInvalidation("boycar"), func() interface{} { return new(boycarProperties) }, ), @@ -279,7 +292,7 @@ createInsertFMSQL("boysaw", "colour", "colpat", "conrad", "marsys", "boyshp"), ), - consumeBOYSAW, + consume, createInvalidation("boysaw"), func() interface{} { return new(boysawProperties) }, ), @@ -295,7 +308,7 @@ "colour", "colpat", "conrad", "marsys", "boyshp", "catspm"), ), - consumeBOYSPP, + consume, createInvalidation("boyspp"), func() interface{} { return new(boysppProperties) }, ), @@ -310,7 +323,7 @@ createInsertFMSQL("daymar_hydro", "colour", "colpat", "condtn", "topshp"), ), - consumeDAYMARHydro, + consume, createInvalidation("daymar_hydro"), func() interface{} { return new(daymarHydroProperties) }, ), @@ -326,7 +339,7 @@ "colour", "colpat", "condtn", "topshp", "orient"), insertDaymarDirimpSQL, ), - consumeDAYMARIenc, + consume, createInvalidation("daymar_ienc"), func() interface{} { return new(daymarIencProperties) }, ), @@ -345,7 +358,7 @@ "sectr2", "siggrp", "sigper", "sigseq", "status"), ), - consumeLIGHTS, + consume, createInvalidation("lights"), func() interface{} { return new(lightsProperties) }, ), @@ -364,7 +377,7 @@ "disbk2", "fnctnm", "bnkwtw"), insertNotmrkDirimpSQL, ), - consumeNOTMRK, + consume, createInvalidation("notmark"), func() interface{} { return new(notmrkProperties) }, ), @@ -379,7 +392,7 @@ createInsertFMSQL("rtpbcn", "condtn", "siggrp", "catrtb", "radwal"), ), - consumeRTPBCN, + consume, createInvalidation("rtpbcn"), func() interface{} { return new(rtpbcnProperties) }, ), @@ -394,7 +407,7 @@ createInsertFMSQL("topmar", "colour", "colpat", "condtn", "topshp"), ), - consumeTOPMAR, + consume, createInvalidation("topmar"), func() interface{} { return new(topmarProperties) }, ), @@ -548,38 +561,22 @@ } } -func consumeBCNLATHydro( +func consume( spc *SQLPointConsumer, points pointSlice, properties interface{}, epsg int, ) error { - props := properties.(*bcnlatHydroProperties) - var fmid int64 err := spc.savepoint(func() error { return spc.stmts[0].QueryRowContext( spc.ctx, - points.asWKB(), - epsg, - props.Datsta, - props.Datend, - props.Persta, - props.Perend, - props.Objnam, - props.Nobjnm, - props.Inform, - props.Ninfom, - props.Scamin, - props.Picrep, - props.Txtdsc, - props.Sordat, - props.Sorind, - props.Colour, - props.Colpat, - props.Condtn, - props.Bcnshp, - props.Catlam, + append( + []interface{}{ + points.asWKB(), + epsg, + }, + structs.Values(properties)...)..., ).Scan(&fmid) }) switch { @@ -589,566 +586,10 @@ case err != nil: spc.feedback.Error(pgxutils.ReadableError{Err: err}.Error()) return ErrFeatureIgnored - } - return nil -} - -func consumeBCNLATIenc( - spc *SQLPointConsumer, - points pointSlice, - properties interface{}, - epsg int, -) error { - props := properties.(*bcnlatIencProperties) - - var fmid int64 - err := spc.savepoint(func() error { - return spc.stmts[0].QueryRowContext( - spc.ctx, - points.asWKB(), - epsg, - props.Datsta, - props.Datend, - props.Persta, - props.Perend, - props.Objnam, - props.Nobjnm, - props.Inform, - props.Ninfom, - props.Scamin, - props.Picrep, - props.Txtdsc, - props.Sordat, - props.Sorind, - props.Colour, - props.Colpat, - props.Condtn, - props.Bcnshp, - props.Catlam, - ).Scan(&fmid) - }) - switch { - case err == sql.ErrNoRows: - return ErrFeatureDuplicated - // ignore -> filtered by responsibility area or a duplicate - // TODO: handle eventual changes to dirimp - case err != nil: - spc.feedback.Error(pgxutils.ReadableError{Err: err}.Error()) - return ErrFeatureIgnored default: - storeAttribs(spc, fmid, props.Dirimp) - } - return nil -} - -func consumeBOYLATHydro( - spc *SQLPointConsumer, - points pointSlice, - properties interface{}, - epsg int, -) error { - props := properties.(*boylatHydroProperties) - - var fmid int64 - err := spc.savepoint(func() error { - return spc.stmts[0].QueryRowContext( - spc.ctx, - points.asWKB(), - epsg, - props.Datsta, - props.Datend, - props.Persta, - props.Perend, - props.Objnam, - props.Nobjnm, - props.Inform, - props.Ninfom, - props.Scamin, - props.Picrep, - props.Txtdsc, - props.Sordat, - props.Sorind, - props.Colour, - props.Colpat, - props.Conrad, - props.Marsys, - props.Boyshp, - props.Catlam, - ).Scan(&fmid) - }) - switch { - case err == sql.ErrNoRows: - return ErrFeatureDuplicated - // ignore -> filtered by responsibility_areas - case err != nil: - spc.feedback.Error(pgxutils.ReadableError{Err: err}.Error()) - return ErrFeatureIgnored - } - return nil -} - -func consumeBOYLATIenc( - spc *SQLPointConsumer, - points pointSlice, - properties interface{}, - epsg int, -) error { - props := properties.(*boylatIencProperties) - - var fmid int64 - err := spc.savepoint(func() error { - return spc.stmts[0].QueryRowContext( - spc.ctx, - points.asWKB(), - epsg, - props.Datsta, - props.Datend, - props.Persta, - props.Perend, - props.Objnam, - props.Nobjnm, - props.Inform, - props.Ninfom, - props.Scamin, - props.Picrep, - props.Txtdsc, - props.Sordat, - props.Sorind, - props.Colour, - props.Colpat, - props.Conrad, - props.Marsys, - props.Boyshp, - props.Catlam, - ).Scan(&fmid) - }) - switch { - case err == sql.ErrNoRows: - return ErrFeatureDuplicated - // ignore -> filtered by responsibility_areas - case err != nil: - spc.feedback.Error(pgxutils.ReadableError{Err: err}.Error()) - return ErrFeatureIgnored - } - return nil -} - -func consumeBOYCAR( - spc *SQLPointConsumer, - points pointSlice, - properties interface{}, - epsg int, -) error { - props := properties.(*boycarProperties) - var fmid int64 - err := spc.savepoint(func() error { - return spc.stmts[0].QueryRowContext( - spc.ctx, - points.asWKB(), - epsg, - props.Datsta, - props.Datend, - props.Persta, - props.Perend, - props.Objnam, - props.Nobjnm, - props.Inform, - props.Ninfom, - props.Scamin, - props.Picrep, - props.Txtdsc, - props.Sordat, - props.Sorind, - props.Colour, - props.Colpat, - props.Conrad, - props.Marsys, - props.Boyshp, - props.Catcam, - ).Scan(&fmid) - }) - switch { - case err == sql.ErrNoRows: - return ErrFeatureDuplicated - // ignore -> filtered by responsibility_areas - case err != nil: - spc.feedback.Error(pgxutils.ReadableError{Err: err}.Error()) - return ErrFeatureIgnored - } - return nil -} - -func consumeBOYSAW( - spc *SQLPointConsumer, - points pointSlice, - properties interface{}, - epsg int, -) error { - props := properties.(*boysawProperties) - var fmid int64 - err := spc.savepoint(func() error { - return spc.stmts[0].QueryRowContext( - spc.ctx, - points.asWKB(), - epsg, - props.Datsta, - props.Datend, - props.Persta, - props.Perend, - props.Objnam, - props.Nobjnm, - props.Inform, - props.Ninfom, - props.Scamin, - props.Picrep, - props.Txtdsc, - props.Sordat, - props.Sorind, - props.Colour, - props.Colpat, - props.Conrad, - props.Marsys, - props.Boyshp, - ).Scan(&fmid) - }) - switch { - case err == sql.ErrNoRows: - return ErrFeatureDuplicated - // ignore -> filtered by responsibility_areas - case err != nil: - spc.feedback.Error(pgxutils.ReadableError{Err: err}.Error()) - return ErrFeatureIgnored - } - return nil -} - -func consumeBOYSPP( - spc *SQLPointConsumer, - points pointSlice, - properties interface{}, - epsg int, -) error { - props := properties.(*boysppProperties) - var fmid int64 - err := spc.savepoint(func() error { - return spc.stmts[0].QueryRowContext( - spc.ctx, - points.asWKB(), - epsg, - props.Datsta, - props.Datend, - props.Persta, - props.Perend, - props.Objnam, - props.Nobjnm, - props.Inform, - props.Ninfom, - props.Scamin, - props.Picrep, - props.Txtdsc, - props.Sordat, - props.Sorind, - props.Colour, - props.Colpat, - props.Conrad, - props.Marsys, - props.Boyshp, - props.Catspm, - ).Scan(&fmid) - }) - switch { - case err == sql.ErrNoRows: - return ErrFeatureDuplicated - // ignore -> filtered by responsibility_areas - case err != nil: - spc.feedback.Error(pgxutils.ReadableError{Err: err}.Error()) - return ErrFeatureIgnored + if attr, ok := properties.(interface{ attrib() *string }); ok { + storeAttribs(spc, fmid, attr.attrib()) + } } return nil } - -func consumeDAYMARHydro( - spc *SQLPointConsumer, - points pointSlice, - properties interface{}, - epsg int, -) error { - props := properties.(*daymarHydroProperties) - - var fmid int64 - err := spc.savepoint(func() error { - return spc.stmts[0].QueryRowContext( - spc.ctx, - points.asWKB(), - epsg, - props.Datsta, - props.Datend, - props.Persta, - props.Perend, - props.Objnam, - props.Nobjnm, - props.Inform, - props.Ninfom, - props.Scamin, - props.Picrep, - props.Txtdsc, - props.Sordat, - props.Sorind, - props.Colour, - props.Colpat, - props.Condtn, - props.Topshp, - ).Scan(&fmid) - }) - switch { - case err == sql.ErrNoRows: - return ErrFeatureDuplicated - // ignore -> filtered by responsibility area or a duplicate - case err != nil: - spc.feedback.Error(pgxutils.ReadableError{Err: err}.Error()) - return ErrFeatureIgnored - } - return nil -} - -func consumeDAYMARIenc( - spc *SQLPointConsumer, - points pointSlice, - properties interface{}, - epsg int, -) error { - props := properties.(*daymarIencProperties) - - var fmid int64 - err := spc.savepoint(func() error { - return spc.stmts[0].QueryRowContext( - spc.ctx, - points.asWKB(), - epsg, - props.Datsta, - props.Datend, - props.Persta, - props.Perend, - props.Objnam, - props.Nobjnm, - props.Inform, - props.Ninfom, - props.Scamin, - props.Picrep, - props.Txtdsc, - props.Sordat, - props.Sorind, - props.Colour, - props.Colpat, - props.Condtn, - props.Topshp, - props.Orient, - ).Scan(&fmid) - }) - switch { - case err == sql.ErrNoRows: - return ErrFeatureDuplicated - // ignore -> filtered by responsibility area or a duplicate - // TODO: handle eventual changes to dirimp - case err != nil: - spc.feedback.Error(pgxutils.ReadableError{Err: err}.Error()) - return ErrFeatureIgnored - default: - storeAttribs(spc, fmid, props.Dirimp) - } - return nil -} - -func consumeLIGHTS( - spc *SQLPointConsumer, - points pointSlice, - properties interface{}, - epsg int, -) error { - props := properties.(*lightsProperties) - - var fmid int64 - err := spc.savepoint(func() error { - return spc.stmts[0].QueryRowContext( - spc.ctx, - points.asWKB(), - epsg, - props.Datsta, - props.Datend, - props.Persta, - props.Perend, - props.Objnam, - props.Nobjnm, - props.Inform, - props.Ninfom, - props.Scamin, - props.Picrep, - props.Txtdsc, - props.Sordat, - props.Sorind, - props.Colour, - props.Condtn, - props.Orient, - props.Catlit, - props.Exclit, - props.Litchr, - props.Litvis, - props.Mltylt, - props.Sectr1, - props.Sectr2, - props.Siggrp, - props.Sigper, - props.Sigseq, - props.Status, - ).Scan(&fmid) - }) - switch { - case err == sql.ErrNoRows: - return ErrFeatureDuplicated - // ignore -> filtered by responsibility area or a duplicate - case err != nil: - spc.feedback.Error(pgxutils.ReadableError{Err: err}.Error()) - return ErrFeatureIgnored - } - return nil -} - -func consumeNOTMRK( - spc *SQLPointConsumer, - points pointSlice, - properties interface{}, - epsg int, -) error { - props := properties.(*notmrkProperties) - var fmid int64 - err := spc.savepoint(func() error { - return spc.stmts[0].QueryRowContext( - spc.ctx, - points.asWKB(), - epsg, - props.Datsta, - props.Datend, - props.Persta, - props.Perend, - props.Objnam, - props.Nobjnm, - props.Inform, - props.Ninfom, - props.Scamin, - props.Picrep, - props.Txtdsc, - props.Sordat, - props.Sorind, - props.Condtn, - props.Marsys, - props.Orient, - props.Status, - props.Addmrk, - props.Catnmk, - props.Disipd, - props.Disipu, - props.Disbk1, - props.Disbk2, - props.Fnctnm, - props.Bnkwtw, - ).Scan(&fmid) - }) - switch { - case err == sql.ErrNoRows: - return ErrFeatureDuplicated - // ignore -> filtered by responsibility area or a duplicate - // TODO: handle eventual changes to dirimp - case err != nil: - spc.feedback.Error(pgxutils.ReadableError{Err: err}.Error()) - return ErrFeatureIgnored - default: - storeAttribs(spc, fmid, props.Dirimp) - } - return nil -} - -func consumeRTPBCN( - spc *SQLPointConsumer, - points pointSlice, - properties interface{}, - epsg int, -) error { - props := properties.(*rtpbcnProperties) - var fmid int64 - err := spc.savepoint(func() error { - return spc.stmts[0].QueryRowContext( - spc.ctx, - points.asWKB(), - epsg, - props.Datsta, - props.Datend, - props.Persta, - props.Perend, - props.Objnam, - props.Nobjnm, - props.Inform, - props.Ninfom, - props.Scamin, - props.Picrep, - props.Txtdsc, - props.Sordat, - props.Sorind, - props.Condtn, - props.Siggrp, - props.Catrtb, - props.Radwal, - ).Scan(&fmid) - }) - switch { - case err == sql.ErrNoRows: - return ErrFeatureDuplicated - // ignore -> filtered by responsibility area or a duplicate - case err != nil: - spc.feedback.Error(pgxutils.ReadableError{Err: err}.Error()) - return ErrFeatureIgnored - } - return nil -} - -func consumeTOPMAR( - spc *SQLPointConsumer, - points pointSlice, - properties interface{}, - epsg int, -) error { - props := properties.(*topmarProperties) - var fmid int64 - err := spc.savepoint(func() error { - return spc.stmts[0].QueryRowContext( - spc.ctx, - points.asWKB(), - epsg, - props.Datsta, - props.Datend, - props.Persta, - props.Perend, - props.Objnam, - props.Nobjnm, - props.Inform, - props.Ninfom, - props.Scamin, - props.Picrep, - props.Txtdsc, - props.Sordat, - props.Sorind, - props.Colour, - props.Colpat, - props.Condtn, - props.Topshp, - ).Scan(&fmid) - }) - switch { - case err == sql.ErrNoRows: - return ErrFeatureDuplicated - // ignore -> filtered by responsibility area or a duplicate - case err != nil: - spc.feedback.Error(pgxutils.ReadableError{Err: err}.Error()) - return ErrFeatureIgnored - } - return nil -}