From a8e06fc9c8f596475f688408b232da5ada007449 Mon Sep 17 00:00:00 2001 From: Gufran Date: Mon, 4 Jan 2021 17:21:38 +0530 Subject: [PATCH 1/3] Add support for custom generation template --- internal/codegen/golang/gen.go | 18 +++++++++++++++++- internal/config/config.go | 1 + internal/config/v_one.go | 2 ++ 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/internal/codegen/golang/gen.go b/internal/codegen/golang/gen.go index 138a9f41cd..c8c9679f8d 100644 --- a/internal/codegen/golang/gen.go +++ b/internal/codegen/golang/gen.go @@ -5,6 +5,7 @@ import ( "bytes" "fmt" "go/format" + "io/ioutil" "strings" "text/template" @@ -394,7 +395,22 @@ func generate(settings config.CombinedSettings, enums []Enum, structs []Struct, "imports": i.Imports, } - tmpl := template.Must(template.New("table").Funcs(funcMap).Parse(templateSet)) + var tplTxt string + + if settings.Go.Template != "" { + b, err := ioutil.ReadFile(settings.Go.Template) + if err != nil { + return nil, err + } + + tplTxt = string(b) + } + + if tplTxt == "" { + tplTxt = templateSet + } + + tmpl := template.Must(template.New("table").Funcs(funcMap).Parse(tplTxt)) golang := settings.Go tctx := tmplCtx{ diff --git a/internal/config/config.go b/internal/config/config.go index e4eeff91ca..f03c978756 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -119,6 +119,7 @@ type SQLGo struct { Out string `json:"out" yaml:"out"` Overrides []Override `json:"overrides,omitempty" yaml:"overrides"` Rename map[string]string `json:"rename,omitempty" yaml:"rename"` + Template string `json:"template" yaml:"template"` } type SQLKotlin struct { diff --git a/internal/config/v_one.go b/internal/config/v_one.go index 55d6b3ae32..14590c4ff8 100644 --- a/internal/config/v_one.go +++ b/internal/config/v_one.go @@ -27,6 +27,7 @@ type v1PackageSettings struct { EmitPreparedQueries bool `json:"emit_prepared_queries" yaml:"emit_prepared_queries"` EmitExactTableNames bool `json:"emit_exact_table_names,omitempty" yaml:"emit_exact_table_names"` EmitEmptySlices bool `json:"emit_empty_slices,omitempty" yaml:"emit_empty_slices"` + Template string `json:"template,omitempty" yaml:"template,omitempty"` Overrides []Override `json:"overrides" yaml:"overrides"` } @@ -112,6 +113,7 @@ func (c *V1GenerateSettings) Translate() Config { Package: pkg.Name, Out: pkg.Path, Overrides: pkg.Overrides, + Template: pkg.Template, }, }, }) From 57cea915d724711f9d7c3745f32b7ebc6b95305c Mon Sep 17 00:00:00 2001 From: Gufran Date: Mon, 15 Feb 2021 12:14:43 +0530 Subject: [PATCH 2/3] Add support for custom templeate file --- build-custom.sh | 9 +++++++++ custom.Dockerfile | 10 ++++++++++ 2 files changed, 19 insertions(+) create mode 100755 build-custom.sh create mode 100644 custom.Dockerfile diff --git a/build-custom.sh b/build-custom.sh new file mode 100755 index 0000000000..875be43494 --- /dev/null +++ b/build-custom.sh @@ -0,0 +1,9 @@ +set -eou pipefail + +GIT_SHA=$(git rev-parse --short HEAD) +LD_FLAGS_VERSION="-X github.com/kyleconroy/sqlc/internal/cmd.version=custom-${GIT_SHA}" + +export CGO_ENABLED=1 + +set -x +go build -v -o pkg/sqlc -ldflags "-extldflags \"-static\" ${LD_FLAGS_VERSION}" ./cmd/sqlc \ No newline at end of file diff --git a/custom.Dockerfile b/custom.Dockerfile new file mode 100644 index 0000000000..c14a7e66fa --- /dev/null +++ b/custom.Dockerfile @@ -0,0 +1,10 @@ +FROM golang:1.15 as builder + +COPY . /workspace +WORKDIR /workspace + +RUN /bin/bash build-custom.sh + +FROM scratch +COPY --from=builder /workspace/pkg/sqlc /sqlc +ENTRYPOINT ["/sqlc"] From 020d5bf76b37ebce1f3abd821e4bd529d91d0a05 Mon Sep 17 00:00:00 2001 From: Gufran Date: Sat, 6 Mar 2021 19:28:52 +0530 Subject: [PATCH 3/3] Custom changes for trimmed code generation --- internal/codegen/golang/gen.go | 77 +++++++++++++++++++++++++++---- internal/codegen/golang/result.go | 16 +------ internal/codegen/golang/struct.go | 14 ++++-- 3 files changed, 81 insertions(+), 26 deletions(-) diff --git a/internal/codegen/golang/gen.go b/internal/codegen/golang/gen.go index c8c9679f8d..e2c40d9544 100644 --- a/internal/codegen/golang/gen.go +++ b/internal/codegen/golang/gen.go @@ -377,9 +377,78 @@ func Generate(r *compiler.Result, settings config.CombinedSettings) (map[string] enums := buildEnums(r, settings) structs := buildStructs(r, settings) queries := buildQueries(r, settings, structs) + structs = groupStructQueries(r, structs, queries, settings) return generate(settings, enums, structs, queries) } +func groupStructQueries(r *compiler.Result, structs []Struct, queries []Query, settings config.CombinedSettings) []Struct { + var result []Struct + + for _, s := range structs { + for _, query := range r.Queries { + if len(s.Fields) != len(query.Columns) { + continue + } + + if !sameFields(r, s, query, settings) { + continue + } + + for _, tq := range queries { + if tq.SQL != query.SQL { + continue + } + + if !allFieldsInStruct(tq, s) { + continue + } + + s.QueryParams = append(s.QueryParams, StructQueryParams{ + QueryName: tq.MethodName, + Params: tq.Arg, + }) + } + } + + result = append(result, s) + } + + return result +} + +func allFieldsInStruct(tq Query, s Struct) bool { + if tq.Arg.Struct == nil { + return true + } + + structFields := map[string]struct{}{} + for _, f := range s.Fields { + structFields[f.Name] = struct{}{} + } + + for _, af := range tq.Arg.Struct.Fields { + if _, ok := structFields[af.Name]; !ok { + return false + } + } + + return true +} + +func sameFields(r *compiler.Result, s Struct, query *compiler.Query, settings config.CombinedSettings) bool { + for i, f := range s.Fields { + c := query.Columns[i] + sameName := f.Name == StructName(columnName(c, i), settings) + sameType := f.Type == goType(r, c, settings) + sameTable := sameTableName(c.Table, s.Table, r.Catalog.DefaultSchema) + if !sameName || !sameType || !sameTable { + return false + } + } + + return true +} + func generate(settings config.CombinedSettings, enums []Enum, structs []Struct, queries []Query) (map[string]string, error) { i := &importer{ Settings: settings, @@ -450,17 +519,9 @@ func generate(settings config.CombinedSettings, enums []Enum, structs []Struct, return nil } - if err := execute("db.go", "dbFile"); err != nil { - return nil, err - } if err := execute("models.go", "modelsFile"); err != nil { return nil, err } - if golang.EmitInterface { - if err := execute("querier.go", "interfaceFile"); err != nil { - return nil, err - } - } files := map[string]struct{}{} for _, gq := range queries { diff --git a/internal/codegen/golang/result.go b/internal/codegen/golang/result.go index 3c534b19f7..d45317f287 100644 --- a/internal/codegen/golang/result.go +++ b/internal/codegen/golang/result.go @@ -149,13 +149,7 @@ func buildQueries(r *compiler.Result, settings config.CombinedSettings, structs Comments: query.Comments, } - if len(query.Params) == 1 { - p := query.Params[0] - gq.Arg = QueryValue{ - Name: paramName(p), - Typ: goType(r, p.Column, settings), - } - } else if len(query.Params) > 1 { + if len(query.Params) > 0 { var cols []goColumn for _, p := range query.Params { cols = append(cols, goColumn{ @@ -170,13 +164,7 @@ func buildQueries(r *compiler.Result, settings config.CombinedSettings, structs } } - if len(query.Columns) == 1 { - c := query.Columns[0] - gq.Ret = QueryValue{ - Name: columnName(c, 0), - Typ: goType(r, c, settings), - } - } else if len(query.Columns) > 1 { + if len(query.Columns) > 0 { var gs *Struct var emit bool diff --git a/internal/codegen/golang/struct.go b/internal/codegen/golang/struct.go index 74be48e3f3..0ce3256933 100644 --- a/internal/codegen/golang/struct.go +++ b/internal/codegen/golang/struct.go @@ -7,11 +7,17 @@ import ( "github.com/kyleconroy/sqlc/internal/core" ) +type StructQueryParams struct { + QueryName string + Params QueryValue +} + type Struct struct { - Table core.FQN - Name string - Fields []Field - Comment string + Table core.FQN + Name string + Fields []Field + Comment string + QueryParams []StructQueryParams } func StructName(name string, settings config.CombinedSettings) string {