diff --git a/core.go b/core.go index 07d397e..8b90916 100644 --- a/core.go +++ b/core.go @@ -179,25 +179,25 @@ type Generator interface { Generate(dstPath string, pkgName string, query SQLQuery, opts ...option) error } -type OptionFunc func(opt *generateOption) +type OptFn func(opt *generateOption) -func (f OptionFunc) apply(opt *generateOption) { +func (f OptFn) apply(opt *generateOption) { f(opt) } -func DefaultStructNameOpt(name string) OptionFunc { +func DefaultStructNameOpt(name string) OptFn { return func(opt *generateOption) { opt.defaultStructName = name } } -func GoFileNameOpt(name string) OptionFunc { +func GoFileNameOpt(name string) OptFn { return func(opt *generateOption) { opt.goFileName = name } } -func SqlxPkgName(name string) OptionFunc { +func SqlxPkgName(name string) OptFn { return func(opt *generateOption) { opt.sqlxPkgName = name } diff --git a/examples/auto/yesql.go b/examples/auto/ac/yesql.go similarity index 99% rename from examples/auto/yesql.go rename to examples/auto/ac/yesql.go index f430273..ec537c2 100644 --- a/examples/auto/yesql.go +++ b/examples/auto/ac/yesql.go @@ -1,8 +1,8 @@ // Code generated by Yesql. DO NOT EDIT. // versions: -// - Yesql v1.8.0 +// - Yesql v1.8.1 -package yesql +package ac import ( "context" diff --git a/examples/auto/cc/yesql.go b/examples/auto/cc/yesql.go new file mode 100644 index 0000000..18d6523 --- /dev/null +++ b/examples/auto/cc/yesql.go @@ -0,0 +1,86 @@ +// Code generated by Yesql. DO NOT EDIT. +// versions: +// - Yesql v1.8.1 + +package cc + +import ( + "context" + + "github.com/bitbus/sqlx" +) + +const ( + _LoginInfoA = `SELECT * FROM @user WHERE username=?` + _LoginInfoB = `SELECT * FROM @user WHERE username=?` + _LoginInfoD = `SELECT * FROM @user WHERE username=?` + _LoginInfoE = `SELECT * FROM @user WHERE username=?` + _LogoutInfoC = `SELECT * FROM @user WHERE username=?` + _UserInfoA = `SELECT ` + "`" + `username` + "`" + ` FROM @user WHERE username=?` + _UserInfoB = `SELECT ` + "`" + `username` + "`" + `, ` + "`" + `nickname` + "`" + ` FROM @user WHERE username=?` + _UserInfoC = `SELECT "username" FROM @user WHERE username=?` + _UserInfoD = `SELECT "username", "nickname" FROM @user WHERE username=?` +) + +// PreparexContext enhances the Conn interface with context. +type PreparexContext interface { + // PrepareContext prepares a statement. + // The provided context is used for the preparation of the statement, not for + // the execution of the statement. + PreparexContext(ctx context.Context, query string) (*sqlx.Stmt, error) + + // PrepareNamedContext returns an sqlx.NamedStmt + PrepareNamedContext(ctx context.Context, query string) (*sqlx.NamedStmt, error) + + // Rebind rebind query to adapte SQL Driver + Rebind(query string) string +} + +// PreparexBuilder preparex builder interface for sqlx +type PreparexBuilder interface { + PreparexContext + QueryHook(query string) string +} + +type Yesql struct { + LoginInfoD string `yesql:"login_info_d"` + LogoutInfoC string `yesql:"logout_info_c"` + UserInfoC string `yesql:"user_info_c"` + UserInfoD string `yesql:"user_info_d"` + LoginInfoB *sqlx.Stmt `yesql:"login_info_b"` + UserInfoA *sqlx.Stmt `yesql:"user_info_a"` + UserInfoB *sqlx.Stmt `yesql:"user_info_b"` + LoginInfoA *sqlx.NamedStmt `yesql:"login_info_a"` + LoginInfoE *sqlx.NamedStmt `yesql:"login_info_e"` +} + +func BuildYesql(p PreparexBuilder, ctx ...context.Context) (obj *Yesql, err error) { + var c context.Context + if len(ctx) > 0 && ctx[0] != nil { + c = ctx[0] + } else { + c = context.Background() + } + obj = &Yesql{ + LoginInfoD: p.QueryHook(_LoginInfoD), + LogoutInfoC: p.QueryHook(_LogoutInfoC), + UserInfoC: p.QueryHook(_UserInfoC), + UserInfoD: p.QueryHook(_UserInfoD), + } + if obj.LoginInfoB, err = p.PreparexContext(c, p.Rebind(p.QueryHook(_LoginInfoB))); err != nil { + return + } + if obj.UserInfoA, err = p.PreparexContext(c, p.Rebind(p.QueryHook(_UserInfoA))); err != nil { + return + } + if obj.UserInfoB, err = p.PreparexContext(c, p.Rebind(p.QueryHook(_UserInfoB))); err != nil { + return + } + if obj.LoginInfoA, err = p.PrepareNamedContext(c, p.Rebind(p.QueryHook(_LoginInfoA))); err != nil { + return + } + if obj.LoginInfoE, err = p.PrepareNamedContext(c, p.Rebind(p.QueryHook(_LoginInfoE))); err != nil { + return + } + return +} diff --git a/examples/gen.go b/examples/gen.go index d436b9b..83c874c 100644 --- a/examples/gen.go +++ b/examples/gen.go @@ -14,8 +14,12 @@ func main() { query.Query = strings.TrimRight(query.Query, ";") return query, nil }) - if err := yesql.Generate("yesql.sql", "auto", "yesql", yesql.SqlxPkgName("github.com/bitbus/sqlx")); err != nil { - log.Fatalf("generate code occurs error: %s", err) + opt := yesql.SqlxPkgName("github.com/bitbus/sqlx") + if err := yesql.Generate("yesql_ac.sql", "auto/ac", "ac", opt); err != nil { + log.Fatalf("generate ac code occurs error: %s", err) + } + if err := yesql.Generate("yesql_cc.sql", "auto/cc", "cc", opt); err != nil { + log.Fatalf("generate cc code occurs error: %s", err) } log.Println("[Yesql] generate code finish") } diff --git a/examples/go.mod b/examples/go.mod index 58dd891..cb886bb 100644 --- a/examples/go.mod +++ b/examples/go.mod @@ -3,7 +3,7 @@ module github.com/alimy/yesql/examples go 1.18 require ( - github.com/alimy/yesql v1.8.0 + github.com/alimy/yesql v1.8.1 github.com/bitbus/sqlx v1.6.0 ) diff --git a/examples/yesql.sql b/examples/yesql_ac.sql similarity index 100% rename from examples/yesql.sql rename to examples/yesql_ac.sql diff --git a/examples/yesql_cc.sql b/examples/yesql_cc.sql new file mode 100644 index 0000000..6128edc --- /dev/null +++ b/examples/yesql_cc.sql @@ -0,0 +1,37 @@ +---------------------- +-- default sql ddl -- +---------------------- + +-- name: user_info_a +-- prepare: stmt +SELECT `username` FROM @user WHERE username=? + +-- name: user_info_b +SELECT `username`, `nickname` FROM @user WHERE username=? + +-- name: user_info_c +-- prepare: raw +SELECT "username" FROM @user WHERE username=? + +-- name: user_info_d +-- prepare: string +SELECT "username", "nickname" FROM @user WHERE username=? + +-- name: login_info_a +-- prepare: named_stmt +SELECT * FROM @user WHERE username=? + +-- name: login_info_b +SELECT * FROM @user WHERE username=? + +-- name: logout_info_c +-- prepare: raw +SELECT * FROM @user WHERE username=? + +-- name: login_info_d +-- prepare: string +SELECT * FROM @user WHERE username=? + +-- name: login_info_e +-- prepare: named_stmt +SELECT * FROM @user WHERE username=? diff --git a/generator.go b/generator.go index 556e16c..4e56b9f 100644 --- a/generator.go +++ b/generator.go @@ -77,6 +77,10 @@ func (t *tmplCtx) DefaultQueryMapNotEmpty() bool { return len(t.DefaultQueryMap) != 0 } +func (t *tmplCtx) ScopeQueryNotEmpty() bool { + return len(t.ScopeQuery) != 0 +} + func (s *sqlGenerator) Generate(dstPath string, pkgName string, query SQLQuery, opts ...option) (err error) { opt := &generateOption{ goFileName: "yesql.go", diff --git a/template/sql.tmpl b/template/sql.tmpl index c5b8f28..122f99b 100644 --- a/template/sql.tmpl +++ b/template/sql.tmpl @@ -8,7 +8,7 @@ import ( "context" "database/sql" - "github.com/alimy/yesql" + {{if .ScopeQueryNotEmpty}}"github.com/alimy/yesql"{{end}} ) const ( diff --git a/template/sqlx.tmpl b/template/sqlx.tmpl index 3d28b93..8c1431a 100644 --- a/template/sqlx.tmpl +++ b/template/sqlx.tmpl @@ -7,8 +7,8 @@ package {{ .PkgName }} import ( "context" - "github.com/alimy/yesql" "{{ .SqlxPkgName }}" + {{if .ScopeQueryNotEmpty}}"github.com/alimy/yesql"{{end}} ) const ( diff --git a/version.go b/version.go index 820ace5..caa65e0 100644 --- a/version.go +++ b/version.go @@ -1,3 +1,3 @@ package yesql -var Version = "v1.8.0" +var Version = "v1.8.1"