diff options
| author | Felix Hanley <felix@userspace.com.au> | 2020-02-09 12:17:30 +0000 |
|---|---|---|
| committer | Felix Hanley <felix@userspace.com.au> | 2020-02-09 12:17:30 +0000 |
| commit | d7cd138025572c59bfc4964e464d899f396b7e41 (patch) | |
| tree | 02f20073402b7035b19fb343452460d763f1b293 /sql/gen.go | |
| parent | d60cef9865eb1455ce6448e7fe46226e71a5e2f7 (diff) | |
| download | sws-d7cd138025572c59bfc4964e464d899f396b7e41.tar.gz sws-d7cd138025572c59bfc4964e464d899f396b7e41.tar.bz2 | |
Capture current staging state
Diffstat (limited to 'sql/gen.go')
| -rw-r--r-- | sql/gen.go | 117 |
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 +} +` |
