Mercurial > gemma
comparison cmd/tin2octree/main.go @ 720:aeaa2adf5a8b octree
octree: write SQL insert statements for octree indices.
author | Sascha L. Teichmann <sascha.teichmann@intevation.de> |
---|---|
date | Fri, 21 Sep 2018 17:36:00 +0200 |
parents | 5fa2eaffac84 |
children | a4fe07a21ba7 |
comparison
equal
deleted
inserted
replaced
719:d1b60ad2f50d | 720:aeaa2adf5a8b |
---|---|
1 package main | 1 package main |
2 | 2 |
3 import ( | 3 import ( |
4 "bytes" | |
5 "crypto/sha1" | |
4 "database/sql" | 6 "database/sql" |
7 "encoding/base64" | |
5 "flag" | 8 "flag" |
9 "fmt" | |
10 "io" | |
6 "log" | 11 "log" |
7 "math" | 12 "math" |
8 "os" | 13 "os" |
9 "time" | 14 "time" |
10 | 15 |
15 | 20 |
16 var ( | 21 var ( |
17 bottleneck = flag.String("bottleneck", "", "bottleneck id") | 22 bottleneck = flag.String("bottleneck", "", "bottleneck id") |
18 date = flag.String("date", "", "date info") | 23 date = flag.String("date", "", "date info") |
19 file = flag.String("file", "", "save to file") | 24 file = flag.String("file", "", "save to file") |
20 | 25 insert = flag.Bool("insert", false, "write as SQL insert statement") |
21 utm = flag.Bool("utm", false, "fetch in matchin UTM zone") | 26 utm = flag.Bool("utm", true, "fetch in matchin UTM zone") |
22 | 27 |
23 dbhost = flag.String("dbhost", "localhost", "database host") | 28 dbhost = flag.String("dbhost", "localhost", "database host") |
24 dbport = flag.Uint("dbport", 5432, "database port") | 29 dbport = flag.Uint("dbport", 5432, "database port") |
25 dbname = flag.String("dbname", "gemma", "database user") | 30 dbname = flag.String("dbname", "gemma", "database user") |
26 dbuser = flag.String("dbuser", "scott", "database user") | 31 dbuser = flag.String("dbuser", "scott", "database user") |
136 } | 141 } |
137 | 142 |
138 tb := &treeBuilder{t: &t} | 143 tb := &treeBuilder{t: &t} |
139 tb.build() | 144 tb.build() |
140 | 145 |
146 if *insert { | |
147 var w io.Writer | |
148 var f *os.File | |
149 | |
150 if *file != "" { | |
151 if f, err = os.Create(*file); err != nil { | |
152 log.Fatalf("error: %v\n", err) | |
153 } | |
154 w = f | |
155 } else { | |
156 w = os.Stdout | |
157 } | |
158 | |
159 var buf bytes.Buffer | |
160 if err := write(&buf, tb); err != nil { | |
161 log.Fatalf("error: %v\n", err) | |
162 } | |
163 data := buf.String() | |
164 h := sha1.New() | |
165 buf.WriteTo(h) | |
166 fmt.Fprintln(w, "BEGIN;") | |
167 fmt.Fprintln(w, "INSERT INTO waterway.octrees") | |
168 fmt.Fprintf(w, "SELECT sr.id, '%x',\n", h.Sum(nil)) | |
169 fmt.Fprint(w, "decode('") | |
170 fmt.Fprintf(w, "%s", base64.StdEncoding.EncodeToString([]byte(data))) | |
171 fmt.Fprintln(w, "', 'base64')") | |
172 fmt.Fprintln(w, "FROM waterway.sounding_results sr") | |
173 fmt.Fprintf(w, | |
174 "WHERE sr.bottleneck_id = '%s' AND sr.date_info = '%s'::date;\n", | |
175 *bottleneck, *date) | |
176 fmt.Fprintln(w, "END;") | |
177 | |
178 if f != nil { | |
179 if err := f.Close(); err != nil { | |
180 log.Fatalf("error: %v\n", err) | |
181 } | |
182 } | |
183 return | |
184 } | |
185 | |
141 if *file != "" { | 186 if *file != "" { |
142 f, err := os.Create(*file) | 187 f, err := os.Create(*file) |
143 if err != nil { | 188 if err != nil { |
144 log.Printf("error: %v\n", err) | 189 log.Printf("error: %v\n", err) |
145 } | 190 } |
146 out := snappy.NewBufferedWriter(f) | 191 err = write(f, tb) |
147 if err := t.Serialize(out); err != nil { | 192 if err2 := f.Close(); err == nil { |
148 f.Close() | 193 if err != nil { |
194 err = err2 | |
195 } | |
196 } | |
197 if err != nil { | |
149 log.Fatalf("error: %v\n", err) | 198 log.Fatalf("error: %v\n", err) |
150 } | 199 } |
151 if err := tb.Serialize(out); err != nil { | 200 } |
152 f.Close() | 201 } |
153 log.Fatalf("error: %v\n", err) | 202 |
154 } | 203 func write(w io.Writer, tb *treeBuilder) error { |
155 if err := out.Flush(); err != nil { | 204 out := snappy.NewBufferedWriter(w) |
156 f.Close() | 205 if err := tb.t.Serialize(out); err != nil { |
157 log.Fatalf("error: %v\n", err) | 206 return err |
158 } | 207 } |
159 if err := f.Close(); err != nil { | 208 if err := tb.Serialize(out); err != nil { |
160 log.Fatalf("error: %v\n", err) | 209 return err |
161 } | 210 } |
162 } | 211 return out.Flush() |
163 } | 212 } |