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 | |
| parent | d60cef9865eb1455ce6448e7fe46226e71a5e2f7 (diff) | |
| download | sws-d7cd138025572c59bfc4964e464d899f396b7e41.tar.gz sws-d7cd138025572c59bfc4964e464d899f396b7e41.tar.bz2 | |
Capture current staging state
Diffstat (limited to 'sql')
| -rw-r--r-- | sql/gen.go | 117 | ||||
| -rw-r--r-- | sql/sqlite3/01_domains.sql | 8 | ||||
| -rw-r--r-- | sql/sqlite3/02_hits.sql | 14 |
3 files changed, 139 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 +} +` diff --git a/sql/sqlite3/01_domains.sql b/sql/sqlite3/01_domains.sql new file mode 100644 index 0000000..feb40bb --- /dev/null +++ b/sql/sqlite3/01_domains.sql @@ -0,0 +1,8 @@ +create table domains ( + id integer primary key autoincrement, + name varchar not null check(length(name) >= 4 and length(name) <= 255), + description varchar null, + enabled integer not null default 0, + created_at timestamp not null check(created_at = strftime('%Y-%m-%d %H:%M:%S', created_at)), + updated_at timestamp not null check(updated_at = strftime('%Y-%m-%d %H:%M:%S', updated_at)) +); diff --git a/sql/sqlite3/02_hits.sql b/sql/sqlite3/02_hits.sql new file mode 100644 index 0000000..34f54cf --- /dev/null +++ b/sql/sqlite3/02_hits.sql @@ -0,0 +1,14 @@ +create table hits ( + domain_id integer check(domain_id >0), + addr varchar not null, + scheme varchar not null, + host varchar not null, + path varchar not null, + query varchar null, + title varchar null, + referrer varchar null, + user_agent varchar null, + view_port varchar null, + created_at timestamp not null check(created_at = strftime('%Y-%m-%d %H:%M:%S', created_at)) +); +create index "hits#domain_id#created" on hits(domain_id, created_at); |
