comparison cmd/octree2contour/store.go @ 732:39b5cf9a6b8f

Store sounding results contour lines into right table.
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Sun, 23 Sep 2018 19:51:02 +0200
parents 41c8dc61f38f
children 83a9f04f1759
comparison
equal deleted inserted replaced
731:4d6329afc1ea 732:39b5cf9a6b8f
1 package main 1 package main
2 2
3 import ( 3 import (
4 "database/sql" 4 "database/sql"
5 "time"
5 6
6 "gemma.intevation.de/gemma/pkg/octree" 7 "gemma.intevation.de/gemma/pkg/octree"
7 ) 8 )
8 9
9 type result struct { 10 type result struct {
10 h float64 11 h float64
11 lines octree.MultiLineStringZ 12 lines octree.MultiLineStringZ
12 } 13 }
13 14
14 const insertSQL = ` 15 const (
15 INSERT INTO waterway.contour_lines (height, geom) 16 deleteSQL = `
16 VALUES ($1, ST_Transform( 17 DELETE FROM waterway.sounding_results_lines
17 ST_SetSRID(ST_GeomFromWKB($2), $3), 4326)::geography) 18 WHERE sounding_result_id IN (SELECT id
19 FROM waterway.sounding_results
20 WHERE bottleneck_id = $1 AND date_info = $2)
18 ` 21 `
22 insertSQL = `
23 INSERT INTO waterway.sounding_results_lines
24 SELECT
25 sounding_result_id,
26 $1,
27 ST_Transform(ST_SetSRID(ST_GeomFromWKB($2), $3), 4326)::geography
28 FROM waterway.sounding_results
29 WHERE bottleneck_id = $4 AND date_info = $5
30 `
31 )
19 32
20 func store(all []result, epsg uint32) error { 33 func store(
34 all []result, epsg uint32,
35 bottleneck string, date time.Time,
36 ) error {
21 37
22 return run(func(db *sql.DB) error { 38 return run(func(db *sql.DB) error {
23 39
24 tx, err := db.Begin() 40 tx, err := db.Begin()
25 if err != nil { 41 if err != nil {
26 return err 42 return err
27 } 43 }
28 defer tx.Rollback() 44 defer tx.Rollback()
29 45
46 if _, err := tx.Exec(deleteSQL, bottleneck, date); err != nil {
47 return err
48 }
49
30 stmt, err := tx.Prepare(insertSQL) 50 stmt, err := tx.Prepare(insertSQL)
31 if err != nil { 51 if err != nil {
32 return err 52 return err
33 } 53 }
34 54
35 for _, r := range all { 55 for _, r := range all {
36 if _, err := stmt.Exec(r.h, r.lines.AsWKB(), epsg); err != nil { 56 if _, err := stmt.Exec(
57 r.h, r.lines.AsWKB(), epsg,
58 bottleneck, date,
59 ); err != nil {
37 return err 60 return err
38 } 61 }
39 } 62 }
40 63
41 return tx.Commit() 64 return tx.Commit()