comparison pkg/imports/bn.go @ 2999:b3c3c5b5b7c1

Bottleneck import: Import riverbed materials, too.
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Wed, 10 Apr 2019 16:44:30 +0200
parents 41f5ac76d642
children 1de0764f6af4
comparison
equal deleted inserted replaced
2998:adc8e9ccf706 2999:b3c3c5b5b7c1
79 $11, 79 $11,
80 $12, 80 $12,
81 $13 81 $13
82 ) 82 )
83 RETURNING id` 83 RETURNING id`
84
85 insertBottleneckMaterialSQL = `
86 INSERT INTO waterway.bottlenecks_riverbed_materials (
87 bottleneck_id,
88 riverbed
89 ) VALUES (
90 $1,
91 $2
92 )`
84 ) 93 )
85 94
86 type bnJobCreator struct{} 95 type bnJobCreator struct{}
87 96
88 func init() { 97 func init() {
185 return nil, err 194 return nil, err
186 } 195 }
187 196
188 feedback.Info("Found %d bottlenecks for import", len(bns)) 197 feedback.Info("Found %d bottlenecks for import", len(bns))
189 198
190 var hasStmt, insertStmt, trackStmt *sql.Stmt 199 var hasStmt, insertStmt, insertMaterialStmt, trackStmt *sql.Stmt
191 200
192 for _, x := range []struct { 201 for _, x := range []struct {
193 sql string 202 sql string
194 stmt **sql.Stmt 203 stmt **sql.Stmt
195 }{ 204 }{
196 {hasBottleneckSQL, &hasStmt}, 205 {hasBottleneckSQL, &hasStmt},
197 {insertBottleneckSQL, &insertStmt}, 206 {insertBottleneckSQL, &insertStmt},
207 {insertBottleneckMaterialSQL, &insertMaterialStmt},
198 {trackImportSQL, &trackStmt}, 208 {trackImportSQL, &trackStmt},
199 } { 209 } {
200 var err error 210 var err error
201 if *x.stmt, err = conn.PrepareContext(ctx, x.sql); err != nil { 211 if *x.stmt, err = conn.PrepareContext(ctx, x.sql); err != nil {
202 return nil, err 212 return nil, err
209 feedback.Info("Tolerance used to snap waterway axis: %g", tolerance) 219 feedback.Info("Tolerance used to snap waterway axis: %g", tolerance)
210 220
211 for _, bn := range bns { 221 for _, bn := range bns {
212 if err := storeBottleneck( 222 if err := storeBottleneck(
213 ctx, importID, conn, feedback, bn, &nids, tolerance, 223 ctx, importID, conn, feedback, bn, &nids, tolerance,
214 hasStmt, insertStmt, trackStmt); err != nil { 224 hasStmt, insertStmt, insertMaterialStmt, trackStmt); err != nil {
215 return nil, err 225 return nil, err
216 } 226 }
217 } 227 }
218 if len(nids) == 0 { 228 if len(nids) == 0 {
219 return nil, UnchangedError("No new bottlenecks inserted") 229 return nil, UnchangedError("No new bottlenecks inserted")
235 conn *sql.Conn, 245 conn *sql.Conn,
236 feedback Feedback, 246 feedback Feedback,
237 bn *ifbn.BottleNeckType, 247 bn *ifbn.BottleNeckType,
238 nids *[]string, 248 nids *[]string,
239 tolerance float64, 249 tolerance float64,
240 hasStmt, insertStmt, trackStmt *sql.Stmt, 250 hasStmt, insertStmt, insertMaterialStmt, trackStmt *sql.Stmt,
241 ) error { 251 ) error {
242 252
243 tx, err := conn.BeginTx(ctx, nil) 253 tx, err := conn.BeginTx(ctx, nil)
244 if err != nil { 254 if err != nil {
245 return err 255 return err
293 feedback.Warn("Failed to insert '%s' into database", bn.OBJNAM) 303 feedback.Warn("Failed to insert '%s' into database", bn.OBJNAM)
294 feedback.Warn(handleError(err).Error()) 304 feedback.Warn(handleError(err).Error())
295 return nil 305 return nil
296 } 306 }
297 307
308 if bn.Riverbed != nil {
309 for _, material := range bn.Riverbed.Material {
310 if material != nil {
311 mat := string(*material)
312 if _, err := tx.Stmt(insertMaterialStmt).ExecContext(
313 ctx, nid, material); err != nil {
314 feedback.Warn(
315 "Failed to insert riverbed material '%s' for bottleneck '%s'.",
316 mat, bn.OBJNAM)
317 feedback.Warn(handleError(err).Error())
318 }
319 }
320 }
321 }
322
298 if _, err := tx.Stmt(trackStmt).ExecContext( 323 if _, err := tx.Stmt(trackStmt).ExecContext(
299 ctx, importID, "waterway.bottlenecks", nid, 324 ctx, importID, "waterway.bottlenecks", nid,
300 ); err != nil { 325 ); err != nil {
301 return err 326 return err
302 } 327 }