changeset 600:30eb8c823ff7

Started with importing the sounding results. WIP.
author Sascha L. Teichmann <teichmann@intevation.de>
date Fri, 07 Sep 2018 19:05:03 +0200
parents ac325d191009
children e3d8b732bc97
files cmd/soundingresults/main.go
diffstat 1 files changed, 148 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/cmd/soundingresults/main.go	Fri Sep 07 19:05:03 2018 +0200
@@ -0,0 +1,148 @@
+package main
+
+import (
+	"bufio"
+	"database/sql"
+	"flag"
+	"fmt"
+	"log"
+	"os"
+	"path/filepath"
+	"strings"
+	"time"
+
+	"github.com/jackc/pgx"
+	"github.com/jackc/pgx/stdlib"
+)
+
+var (
+	insecure   = flag.Bool("insecure", false, "skip SSL verification")
+	dbhost     = flag.String("dbhost", "localhost", "database host")
+	dbport     = flag.Uint("dbport", 5432, "database port")
+	dbname     = flag.String("dbname", "gemma", "database user")
+	dbuser     = flag.String("dbuser", "scott", "database user")
+	dbpassword = flag.String("dbpw", "tiger", "database password")
+	dbssl      = flag.String("dbssl", "prefer", "database SSL mode")
+)
+
+func run(fn func(*sql.DB) error) error {
+
+	// To ease SSL config ride a bit on parsing.
+	cc, err := pgx.ParseConnectionString("sslmode=" + *dbssl)
+	if err != nil {
+		return err
+	}
+
+	// Do the rest manually to allow whitespace in user/password.
+	cc.Host = *dbhost
+	cc.Port = uint16(*dbport)
+	cc.User = *dbuser
+	cc.Password = *dbpassword
+	cc.Database = *dbname
+
+	db := stdlib.OpenDB(cc)
+	defer db.Close()
+
+	return fn(db)
+}
+
+type meta struct {
+	date           time.Time
+	name           string
+	depthReference string
+}
+
+func substituteName(fname, name string) string {
+	dir := filepath.Dir(fname)
+	info := filepath.Join(dir, "INFO.txt")
+	f, err := os.Open(info)
+	if err != nil {
+		log.Printf("warn: %v\n", err)
+		return name
+	}
+	defer f.Close()
+
+	s := bufio.NewScanner(f)
+
+	for search := strings.ToLower(name); s.Scan(); {
+		line := strings.TrimSpace(s.Text())
+		if line == "" || strings.HasPrefix(line, "#") {
+			continue
+		}
+
+		if parts := strings.SplitN(line, "=", 2); len(parts) == 2 &&
+			strings.TrimSpace(strings.ToLower(parts[0])) == search {
+			return strings.TrimSpace(parts[1])
+		}
+	}
+
+	if err := s.Err(); err != nil {
+		log.Printf("error: %v\n", err)
+	}
+
+	return name
+}
+
+func parseFilename(fname string) (meta, error) {
+
+	base := filepath.Base(fname)
+
+	log.Printf("base: %s\n", base)
+
+	idx := strings.IndexRune(base, '_')
+	if idx == -1 {
+		return meta{}, fmt.Errorf("%s has no date", base)
+	}
+
+	datePart := base[:idx]
+
+	date, err := time.Parse("20060102", datePart)
+	if err != nil {
+		return meta{}, fmt.Errorf("error %s: %v\n", err)
+	}
+
+	rest := base[idx+1:]
+
+	rest = rest[:len(rest)-len(filepath.Ext(rest))]
+
+	if !strings.HasSuffix(strings.ToUpper(rest), "_WGS84") {
+		return meta{}, fmt.Errorf("%s is not in WGS84", base)
+	}
+
+	rest = rest[:len(rest)-len("_WGS84")]
+
+	if idx = strings.LastIndex(rest, "_"); idx == -1 {
+		return meta{}, fmt.Errorf("%s has no depth reference", base)
+	}
+
+	depthReference := rest[idx+1:]
+
+	rest = rest[:idx]
+
+	if !strings.HasSuffix(strings.ToUpper(rest), "_MB") {
+		return meta{}, fmt.Errorf("%s is not in WGS84", base)
+	}
+
+	name := rest[:len(rest)-len("_MB")]
+
+	name = substituteName(fname, name)
+
+	return meta{
+		name:           name,
+		depthReference: depthReference,
+		date:           date,
+	}, nil
+}
+
+func main() {
+	flag.Parse()
+
+	for _, fname := range flag.Args() {
+		m, err := parseFilename(fname)
+		if err != nil {
+			log.Printf("error: %s\n", err)
+			continue
+		}
+		fmt.Printf("%q\n", m)
+	}
+}