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 }