comparison pkg/imports/sr.go @ 1239:d842d9d10872

Sounding result import: Added the feature to override bottleneck, EPSG, depth reference and date in meta.json by POST arguments.
author Sascha L. Teichmann <sascha.teichmann@intevation.de>
date Tue, 20 Nov 2018 17:04:06 +0100
parents 4d7c44f7044e
children 5aeda02c51b9
comparison
equal deleted inserted replaced
1238:442399fc1b71 1239:d842d9d10872
18 "bufio" 18 "bufio"
19 "context" 19 "context"
20 "crypto/sha1" 20 "crypto/sha1"
21 "database/sql" 21 "database/sql"
22 "encoding/hex" 22 "encoding/hex"
23 "encoding/json"
23 "errors" 24 "errors"
24 "fmt" 25 "fmt"
25 "io" 26 "io"
26 "math" 27 "math"
27 "os" 28 "os"
36 "gemma.intevation.de/gemma/pkg/common" 37 "gemma.intevation.de/gemma/pkg/common"
37 "gemma.intevation.de/gemma/pkg/models" 38 "gemma.intevation.de/gemma/pkg/models"
38 "gemma.intevation.de/gemma/pkg/octree" 39 "gemma.intevation.de/gemma/pkg/octree"
39 ) 40 )
40 41
41 type SoundingResult string 42 type SoundingResult struct {
43 Dir string `json:"dir"`
44
45 // Override data
46 Date *models.SoundingResultDate `json:"date,omitempty"`
47 Bottleneck *string `json:"bottleneck,omitempty"`
48 EPSG *uint `json:"epsg,omitempty"`
49 DepthReference *string `json:"depth-reference,omitempty"`
50 }
42 51
43 const ( 52 const (
44 contourStepWidth = 0.1 53 contourStepWidth = 0.1
45 contourTolerance = 0.1 54 contourTolerance = 0.1
46 ) 55 )
52 func init() { 61 func init() {
53 RegisterJobCreator(SRJobKind, srJobCreator{}) 62 RegisterJobCreator(SRJobKind, srJobCreator{})
54 } 63 }
55 64
56 func (srJobCreator) Create(_ JobKind, data string) (Job, error) { 65 func (srJobCreator) Create(_ JobKind, data string) (Job, error) {
57 return SoundingResult(data), nil 66 sr := new(SoundingResult)
67 if err := sr.FromString(data); err != nil {
68 return nil, err
69 }
70 return sr, nil
58 } 71 }
59 72
60 func (srJobCreator) Depends() []string { 73 func (srJobCreator) Depends() []string {
61 return []string{ 74 return []string{
62 "waterway.sounding_results", 75 "waterway.sounding_results",
136 FROM waterway.sounding_results sr 149 FROM waterway.sounding_results sr
137 WHERE id = $1 150 WHERE id = $1
138 ` 151 `
139 ) 152 )
140 153
141 func (sr SoundingResult) Do( 154 func (sr *SoundingResult) FromString(data string) error {
155 return json.NewDecoder(strings.NewReader(data)).Decode(sr)
156 }
157
158 func (sr *SoundingResult) ToString() (string, error) {
159 var b strings.Builder
160 if err := json.NewEncoder(&b).Encode(sr); err != nil {
161 return "", err
162 }
163 return b.String(), nil
164 }
165
166 func (sr *SoundingResult) Do(
142 importID int64, 167 importID int64,
143 ctx context.Context, 168 ctx context.Context,
144 conn *sql.Conn, 169 conn *sql.Conn,
145 feedback Feedback, 170 feedback Feedback,
146 ) error { 171 ) error {
147 172
148 z, err := zip.OpenReader(filepath.Join(string(sr), "sr.zip")) 173 z, err := zip.OpenReader(filepath.Join(sr.Dir, "sr.zip"))
149 if err != nil { 174 if err != nil {
150 return err 175 return err
151 } 176 }
152 defer z.Close() 177 defer z.Close()
153 178
155 mf := common.FindInZIP(z, "meta.json") 180 mf := common.FindInZIP(z, "meta.json")
156 if mf == nil { 181 if mf == nil {
157 return errors.New("Cannot find 'meta.json'") 182 return errors.New("Cannot find 'meta.json'")
158 } 183 }
159 184
160 m, err := loadMeta(mf) 185 m, err := sr.loadMeta(mf)
161 if err != nil { 186 if err != nil {
162 return err 187 return err
163 } 188 }
164 189
165 if err := m.Validate(conn, ctx); err != nil { 190 if err := m.Validate(conn, ctx); err != nil {
267 feedback.Info("Storing sounding result was successful.") 292 feedback.Info("Storing sounding result was successful.")
268 } 293 }
269 return err 294 return err
270 } 295 }
271 296
272 func (sr SoundingResult) CleanUp() error { 297 func (sr *SoundingResult) CleanUp() error {
273 return os.RemoveAll(string(sr)) 298 return os.RemoveAll(sr.Dir)
274 } 299 }
275 300
276 func loadMeta(f *zip.File) (*models.SoundingResultMeta, error) { 301 func (sr *SoundingResult) loadMeta(f *zip.File) (*models.SoundingResultMeta, error) {
277 r, err := f.Open() 302 r, err := f.Open()
278 if err != nil { 303 if err != nil {
279 return nil, err 304 return nil, err
280 } 305 }
281 defer r.Close() 306 defer r.Close()
282 var m models.SoundingResultMeta 307 var m models.SoundingResultMeta
283 return &m, m.Decode(r) 308 if err := m.Decode(r); err != nil {
309 return nil, err
310 }
311
312 // Apply overrides
313 if sr.Date != nil {
314 m.Date = *sr.Date
315 }
316 if sr.Bottleneck != nil {
317 m.Bottleneck = *sr.Bottleneck
318 }
319 if sr.EPSG != nil {
320 m.EPSG = *sr.EPSG
321 }
322 if sr.DepthReference != nil {
323 m.DepthReference = *sr.DepthReference
324 }
325
326 return &m, nil
284 } 327 }
285 328
286 func loadXYZReader(r io.Reader, feedback Feedback) (octree.MultiPointZ, error) { 329 func loadXYZReader(r io.Reader, feedback Feedback) (octree.MultiPointZ, error) {
287 mpz := make(octree.MultiPointZ, 0, 250000) 330 mpz := make(octree.MultiPointZ, 0, 250000)
288 s := bufio.NewScanner(r) 331 s := bufio.NewScanner(r)