# HG changeset patch # User Sascha L. Teichmann # Date 1547221694 -3600 # Node ID 48791416bea5cfa8959550205b1aed45c423b81f # Parent ad1c12e999dfb238b2c7b15e3d25777d35590079 (Approved) gauge measurement import: Fixed row level security. diff -r ad1c12e999df -r 48791416bea5 pkg/imports/agm.go --- a/pkg/imports/agm.go Fri Jan 11 15:40:50 2019 +0100 +++ b/pkg/imports/agm.go Fri Jan 11 16:48:14 2019 +0100 @@ -65,14 +65,29 @@ } const ( - // TODO: re-add staging_done field in table and fix RLS policy - // issue for raw import. + // delete the old and keep the new measures. + agmStageDoneDeleteSQL = ` +WITH staged AS ( + SELECT key + FROM waterway.track_imports + WHERE import_id = $1 AND + relation = 'waterway.gauge_measurements'::regclass +), +to_delete AS ( + SELECT o.id AS id + FROM waterway.gauge_measurements oJOIN waterway.gauge_measurements n + ON n.fk_gauge_id = o.fk_gauge_id AND n.measure_date = o.measure_date + WHERE n.id IN (SELECT key FROM staged) + AND o.id NOT IN (SELECT key FROM staged) +) +DELETE FROM waterway.gauge_measurements WHERE id IN (SELECT id from to_delete)` + agmStageDoneSQL = ` UPDATE waterway.gauge_measurements SET staging_done = true -WHERE id = ( - SELECT key from waterway.track_imports +WHERE id IN ( + SELECT key FROM waterway.track_imports WHERE import_id = $1 AND - relation = 'waterway.gauge_measurements'::regclass)` + relation = 'waterway.gauge_measurements'::regclass)` ) func (agmJobCreator) StageDone( @@ -80,7 +95,10 @@ tx *sql.Tx, id int64, ) error { - _, err := tx.ExecContext(ctx, agmStageDoneSQL, id) + _, err := tx.ExecContext(ctx, agmStageDoneDeleteSQL, id) + if err == nil { + _, err = tx.ExecContext(ctx, agmStageDoneSQL, id) + } return err } @@ -197,7 +215,9 @@ ids := []int64{} - args := make([]interface{}, 18) + args := make([]interface{}, 19) + + args[18] = false // staging_done lines: for line := 1; ; line++ { @@ -275,6 +295,8 @@ args[17] = row[headerIndices["originator"]] + // args[18] (staging_done) is set to true outside the loop. + var id int64 if err := insertStmt.QueryRowContext(ctx, args...).Scan(&id); err != nil { return nil, fmt.Errorf("Failed to insert line %d: %v", line, err) diff -r ad1c12e999df -r 48791416bea5 pkg/imports/gm.go --- a/pkg/imports/gm.go Fri Jan 11 15:40:50 2019 +0100 +++ b/pkg/imports/gm.go Fri Jan 11 16:48:14 2019 +0100 @@ -65,7 +65,8 @@ value_min, value_max, date_info, - source_organization + source_organization, + staging_done ) VALUES( ($1, $2, $3, $4, $5), $6, @@ -80,7 +81,8 @@ $15, $16, $17, - $18 + $18, + $19 ) RETURNING id` ) @@ -304,6 +306,7 @@ convert(measure.Value_max), msg.Identification.Date_issue, msg.Identification.Originator, + true, // staging_done ).Scan(&gid) if err != nil { return nil, err diff -r ad1c12e999df -r 48791416bea5 schema/auth.sql --- a/schema/auth.sql Fri Jan 11 15:40:50 2019 +0100 +++ b/schema/auth.sql Fri Jan 11 16:48:14 2019 +0100 @@ -77,8 +77,7 @@ DECLARE the_table varchar; BEGIN FOREACH the_table IN ARRAY ARRAY[ - -- 'gauge_measurements', XXX Removed since this table has currently no - -- staging + 'gauge_measurements', 'sections_stretches', 'waterway_profiles', 'fairway_dimensions', @@ -143,6 +142,10 @@ -- Staging area -- TODO: add all relevant tables here +CREATE POLICY same_country ON waterway.gauge_measurements + FOR ALL TO waterway_admin + USING (country_code = users.current_user_country()); + CREATE POLICY responsibility_area ON waterway.bottlenecks FOR ALL TO waterway_admin USING (utm_covers(area)); diff -r ad1c12e999df -r 48791416bea5 schema/gemma.sql --- a/schema/gemma.sql Fri Jan 11 15:40:50 2019 +0100 +++ b/schema/gemma.sql Fri Jan 11 16:48:14 2019 +0100 @@ -284,11 +284,8 @@ value_max double precision, -- XXX: NOT NULL if predicted? --- TODO: Add a double range type for checking? date_info timestamp with time zone NOT NULL DEFAULT CURRENT_TIMESTAMP, - source_organization varchar NOT NULL -- "originator" - -- XXX removed staging done temporarily. Currently imported raw data is - -- not staged. When importing approved gauge measurements uncomment this - -- and add policy to allow select on this table for waterway_admin - -- staging_done boolean NOT NULL DEFAULT false + source_organization varchar NOT NULL, -- "originator" + staging_done boolean NOT NULL DEFAULT false ) CREATE TRIGGER gauge_measurements_date_info BEFORE UPDATE ON gauge_measurements