From 4b8d025e395122f4ba068229495198cdcbf4841e Mon Sep 17 00:00:00 2001 From: mackee Date: Sat, 24 Jun 2023 20:06:59 +0900 Subject: [PATCH] add feature: sqlla supports tinygo. for the edge worker services --- expr.go | 48 ----------------------------- exprmysql.go | 53 ++++++++++++++++++++++++++++++++ generator.go | 69 +++++++++++++++++++++++++++++++++++++++--- generator_go116.go | 75 ---------------------------------------------- main.go | 2 ++ table.go | 2 ++ 6 files changed, 122 insertions(+), 127 deletions(-) create mode 100644 exprmysql.go delete mode 100644 generator_go116.go diff --git a/expr.go b/expr.go index 449dd0a..fe8666d 100644 --- a/expr.go +++ b/expr.go @@ -5,8 +5,6 @@ import ( "database/sql" "strconv" "time" - - "github.com/go-sql-driver/mysql" ) type Expr interface { @@ -347,52 +345,6 @@ func (e ExprMultiNullTime) ToSql() (string, []interface{}, error) { return e.Column + " " + ops, vs, nil } -type ExprMysqlNullTime struct { - Column string - Value mysql.NullTime - Op Operator -} - -func (e ExprMysqlNullTime) ToSql() (string, []interface{}, error) { - var ops, placeholder string - var err error - vs := []interface{}{} - if !e.Value.Valid { - if e.Op == OpNot { - ops, err = opIsNotNull.ToSql() - } else { - ops, err = opIsNull.ToSql() - } - } else { - ops, err = e.Op.ToSql() - placeholder = " ?" - vs = append(vs, e.Value) - } - if err != nil { - return "", nil, err - } - - return e.Column + " " + ops + placeholder, vs, nil -} - -type ExprMultiMysqlNullTime struct { - Column string - Values []mysql.NullTime - Op Operator -} - -func (e ExprMultiMysqlNullTime) ToSql() (string, []interface{}, error) { - ops, err := e.Op.ToSql() - if err != nil { - return "", nil, err - } - vs := make([]interface{}, 0, len(e.Values)) - for _, v := range e.Values { - vs = append(vs, interface{}(v)) - } - return e.Column + " " + ops, vs, nil -} - type ExprNullFloat64 struct { Column string Value sql.NullFloat64 diff --git a/exprmysql.go b/exprmysql.go new file mode 100644 index 0000000..cfdc2e9 --- /dev/null +++ b/exprmysql.go @@ -0,0 +1,53 @@ +//go:build !tinygo.wasm + +package sqlla + +import ( + "github.com/go-sql-driver/mysql" +) + +type ExprMysqlNullTime struct { + Column string + Value mysql.NullTime + Op Operator +} + +func (e ExprMysqlNullTime) ToSql() (string, []interface{}, error) { + var ops, placeholder string + var err error + vs := []interface{}{} + if !e.Value.Valid { + if e.Op == OpNot { + ops, err = opIsNotNull.ToSql() + } else { + ops, err = opIsNull.ToSql() + } + } else { + ops, err = e.Op.ToSql() + placeholder = " ?" + vs = append(vs, e.Value) + } + if err != nil { + return "", nil, err + } + + return e.Column + " " + ops + placeholder, vs, nil +} + +type ExprMultiMysqlNullTime struct { + Column string + Values []mysql.NullTime + Op Operator +} + +func (e ExprMultiMysqlNullTime) ToSql() (string, []interface{}, error) { + ops, err := e.Op.ToSql() + if err != nil { + return "", nil, err + } + vs := make([]interface{}, 0, len(e.Values)) + for _, v := range e.Values { + vs = append(vs, interface{}(v)) + } + return e.Column + " " + ops, vs, nil +} diff --git a/generator.go b/generator.go index 202f61e..c5880da 100644 --- a/generator.go +++ b/generator.go @@ -1,13 +1,74 @@ -// +build !go1.16 +//go:build !tinygo.wasm package sqlla import ( - "fmt" + "bytes" + "embed" + "go/format" "io" - "runtime" + "log" + "strings" + "text/template" + "unicode" + + "github.com/pkg/errors" + "github.com/serenize/snaker" ) +//go:embed template/* +var templates embed.FS + +//go:embed template/table.tmpl +var tableTmpl []byte + +var tmpl = template.New("table") + +func init() { + tmpl = tmpl.Funcs( + template.FuncMap{ + "Title": strings.Title, + "Exprize": func(s string) string { + s = strings.TrimPrefix(s, "sql.") + s = strings.TrimPrefix(s, "time.") + s = strings.TrimPrefix(s, "mysql.") + + return s + }, + "Untitle": func(s string) string { + s0 := rune(s[0]) + if !unicode.IsUpper(s0) { + return s + } + s0l := unicode.ToLower(rune(s[0])) + return string(s0l) + s[1:] + }, + "toLower": strings.ToLower, + "toSnake": snaker.CamelToSnake, + "toCamel": snaker.SnakeToCamel, + }, + ) + var err error + tmpl, err = tmpl.ParseFS(templates, "template/*.tmpl") + if err != nil { + log.Fatal(err) + } + tmpl, err = tmpl.Parse(string(tableTmpl)) + if err != nil { + log.Fatal(err) + } +} + func WriteCode(w io.Writer, table *Table) error { - return fmt.Errorf("must build by go version of 1.16 or higher. this built by %s", runtime.Version()) + buf := new(bytes.Buffer) + err := tmpl.Execute(buf, table) + if err != nil { + return errors.Wrapf(err, "fail to render") + } + bs, err := format.Source(buf.Bytes()) + if err != nil { + return errors.Wrapf(err, "fail to format: table=%s", table.Name) + } + _, err = w.Write(bs) + return err } diff --git a/generator_go116.go b/generator_go116.go deleted file mode 100644 index 11a5912..0000000 --- a/generator_go116.go +++ /dev/null @@ -1,75 +0,0 @@ -//go:build go1.16 -// +build go1.16 - -package sqlla - -import ( - "bytes" - "embed" - "go/format" - "io" - "log" - "strings" - "text/template" - "unicode" - - "github.com/pkg/errors" - "github.com/serenize/snaker" -) - -//go:embed template/* -var templates embed.FS - -//go:embed template/table.tmpl -var tableTmpl []byte - -var tmpl = template.New("table") - -func init() { - tmpl = tmpl.Funcs( - template.FuncMap{ - "Title": strings.Title, - "Exprize": func(s string) string { - s = strings.TrimPrefix(s, "sql.") - s = strings.TrimPrefix(s, "time.") - s = strings.TrimPrefix(s, "mysql.") - - return s - }, - "Untitle": func(s string) string { - s0 := rune(s[0]) - if !unicode.IsUpper(s0) { - return s - } - s0l := unicode.ToLower(rune(s[0])) - return string(s0l) + s[1:] - }, - "toLower": strings.ToLower, - "toSnake": snaker.CamelToSnake, - "toCamel": snaker.SnakeToCamel, - }, - ) - var err error - tmpl, err = tmpl.ParseFS(templates, "template/*.tmpl") - if err != nil { - log.Fatal(err) - } - tmpl, err = tmpl.Parse(string(tableTmpl)) - if err != nil { - log.Fatal(err) - } -} - -func WriteCode(w io.Writer, table *Table) error { - buf := new(bytes.Buffer) - err := tmpl.Execute(buf, table) - if err != nil { - return errors.Wrapf(err, "fail to render") - } - bs, err := format.Source(buf.Bytes()) - if err != nil { - return errors.Wrapf(err, "fail to format: table=%s", table.Name) - } - _, err = w.Write(bs) - return err -} diff --git a/main.go b/main.go index 204416f..2af21c2 100644 --- a/main.go +++ b/main.go @@ -1,3 +1,5 @@ +//go:build !tinygo.wasm + package sqlla import ( diff --git a/table.go b/table.go index cfee6af..d009648 100644 --- a/table.go +++ b/table.go @@ -1,3 +1,5 @@ +//go:build !tinygo.wasm + package sqlla import (