aboutsummaryrefslogtreecommitdiff
path: root/sql/gen.go
diff options
context:
space:
mode:
authorFelix Hanley <felix@userspace.com.au>2020-02-09 12:17:30 +0000
committerFelix Hanley <felix@userspace.com.au>2020-02-09 12:17:30 +0000
commitd7cd138025572c59bfc4964e464d899f396b7e41 (patch)
tree02f20073402b7035b19fb343452460d763f1b293 /sql/gen.go
parentd60cef9865eb1455ce6448e7fe46226e71a5e2f7 (diff)
downloadsws-d7cd138025572c59bfc4964e464d899f396b7e41.tar.gz
sws-d7cd138025572c59bfc4964e464d899f396b7e41.tar.bz2
Capture current staging state
Diffstat (limited to 'sql/gen.go')
-rw-r--r--sql/gen.go117
1 files changed, 117 insertions, 0 deletions
diff --git a/sql/gen.go b/sql/gen.go
new file mode 100644
index 0000000..ca3d962
--- /dev/null
+++ b/sql/gen.go
@@ -0,0 +1,117 @@
+package main
+
+//go:generate go run gen.go
+
+import (
+ "bytes"
+ "compress/zlib"
+ "encoding/base64"
+ "fmt"
+ "io"
+ "os"
+ "path/filepath"
+ "strings"
+ "text/template"
+)
+
+func main() {
+ tmpls := make(map[string][]string)
+
+ err := filepath.Walk(".", func(path string, info os.FileInfo, err error) error {
+ if err != nil {
+ fmt.Fprintf(os.Stderr, "Failed to access path %q: %v\n", path, err)
+ return err
+ }
+ details := strings.SplitN(path, ".", 2)
+ if len(details) != 2 || details[1] != "sql" {
+ //fmt.Fprintf(os.Stderr, "Skipping non-template: %+v \n", info.Name())
+ return nil
+ }
+ pathDetails := strings.SplitN(details[0], "/", 2)
+ driver := pathDetails[0]
+ //name := pathDetails[1]
+
+ fmt.Fprintf(os.Stderr, "Processing file: %s\n", path)
+ input, err := os.Open(path)
+ if err != nil {
+ return err
+ }
+ var out bytes.Buffer
+
+ encoder := base64.NewEncoder(base64.StdEncoding, &out)
+ compressor := zlib.NewWriter(encoder)
+ _, err = io.Copy(compressor, input)
+
+ input.Close()
+ compressor.Close()
+ encoder.Close()
+
+ if err != nil {
+ return err
+ }
+ tmpls[driver] = append(tmpls[driver], out.String())
+ return nil
+ })
+
+ if err != nil {
+ fmt.Fprintf(os.Stderr, "Failed to load templates: %s\n", err)
+ }
+
+ // Now generate our encoded template file
+ metaTmpl, err := template.New("meta").Parse(tmplData)
+ if err != nil {
+ fmt.Printf("Failed to parse template: %s", err)
+ } else {
+ metaTmpl.Execute(os.Stdout, tmpls)
+ }
+}
+
+var tmplData = `package main
+
+// Automatically generated, don't bother editing.
+
+import (
+ "bytes"
+ "strings"
+ "compress/zlib"
+ "encoding/base64"
+ "fmt"
+ "io"
+)
+
+// migrations holds a set of base64 encoded SQL scripts.
+var migrations = map[string][]string{
+{{- range $driver, $schema := . }}
+ "{{$driver}}": []string{
+{{- range $b := $schema }}
+ "{{ $b }}",
+{{ end }}
+ },
+{{ end }}
+}
+
+func decodeMigrations(driver string) ([]string, error) {
+ data, ok := migrations[driver]
+ if !ok {
+ return nil, fmt.Errorf("no migrations for driver %q", driver)
+ }
+
+ out := make([]string, len(data))
+
+ for i, b := range data {
+ decoder := base64.NewDecoder(base64.StdEncoding, strings.NewReader(b))
+ decompressor, err := zlib.NewReader(decoder)
+ if err != nil {
+ return nil, fmt.Errorf("unable to decode migration: %w", err)
+ }
+ var buf bytes.Buffer
+ _, err = io.Copy(&buf, decompressor)
+ if err != nil {
+ return nil, fmt.Errorf("failed to decompress migration: %w", err)
+ }
+ out[i] = buf.String()
+ }
+
+ return out, nil
+}
+`