diff --git a/internal/gen.go b/internal/gen.go index a38b05824..5b9be19ce 100644 --- a/internal/gen.go +++ b/internal/gen.go @@ -10,10 +10,10 @@ import ( "strings" "text/template" - "github.com/sqlc-dev/sqlc-gen-go/internal/opts" - "github.com/sqlc-dev/plugin-sdk-go/sdk" "github.com/sqlc-dev/plugin-sdk-go/metadata" "github.com/sqlc-dev/plugin-sdk-go/plugin" + "github.com/sqlc-dev/plugin-sdk-go/sdk" + "github.com/sqlc-dev/sqlc-gen-go/internal/opts" ) type tmplCtx struct { @@ -34,6 +34,7 @@ type tmplCtx struct { EmitPreparedQueries bool EmitInterface bool EmitEmptySlices bool + EmitResultSlicePointer bool EmitMethodsWithDBArgument bool EmitEnumValidMethod bool EmitAllEnumValues bool @@ -178,6 +179,7 @@ func generate(req *plugin.GenerateRequest, options *opts.Options, enums []Enum, EmitDBTags: options.EmitDbTags, EmitPreparedQueries: options.EmitPreparedQueries, EmitEmptySlices: options.EmitEmptySlices, + EmitResultSlicePointer: options.EmitResultSlicePointer, EmitMethodsWithDBArgument: options.EmitMethodsWithDbArgument, EmitEnumValidMethod: options.EmitEnumValidMethod, EmitAllEnumValues: options.EmitAllEnumValues, diff --git a/internal/opts/options.go b/internal/opts/options.go index c2c65df2d..06c4e540b 100644 --- a/internal/opts/options.go +++ b/internal/opts/options.go @@ -19,6 +19,7 @@ type Options struct { EmitEmptySlices bool `json:"emit_empty_slices,omitempty" yaml:"emit_empty_slices"` EmitExportedQueries bool `json:"emit_exported_queries" yaml:"emit_exported_queries"` EmitResultStructPointers bool `json:"emit_result_struct_pointers" yaml:"emit_result_struct_pointers"` + EmitResultSlicePointer bool `json:"emit_result_slice_pointer" yaml:"emit_result_slice_pointer"` EmitParamsStructPointers bool `json:"emit_params_struct_pointers" yaml:"emit_params_struct_pointers"` EmitMethodsWithDbArgument bool `json:"emit_methods_with_db_argument,omitempty" yaml:"emit_methods_with_db_argument"` EmitPointersForNullTypes bool `json:"emit_pointers_for_null_types" yaml:"emit_pointers_for_null_types"` diff --git a/internal/templates/pgx/queryCode.tmpl b/internal/templates/pgx/queryCode.tmpl index 59a88c880..9307cd47a 100644 --- a/internal/templates/pgx/queryCode.tmpl +++ b/internal/templates/pgx/queryCode.tmpl @@ -49,6 +49,31 @@ func (q *Queries) {{.MethodName}}(ctx context.Context, {{.Arg.Pair}}) ({{.Ret.De {{if eq .Cmd ":many"}} {{range .Comments}}//{{.}} {{end -}} +{{- if $.EmitResultSlicePointer -}} +{{- if $.EmitMethodsWithDBArgument -}} +func (q *Queries) {{.MethodName}}(ctx context.Context, db DBTX, {{if .Arg.Pair}}{{.Arg.Pair}}, {{end}}dest *[]{{.Ret.DefineType}}) error { + rows, err := db.Query(ctx, {{.ConstantName}}{{if .Arg.Params}}, {{.Arg.Params}}{{end}}) +{{- else -}} +func (q *Queries) {{.MethodName}}(ctx context.Context, {{if .Arg.Pair}}{{.Arg.Pair}}, {{end}}dest *[]{{.Ret.DefineType}}) error { + rows, err := q.db.Query(ctx, {{.ConstantName}}{{if .Arg.Params}}, {{.Arg.Params}}{{end}}) +{{- end}} + if err != nil { + return {{if $.WrapErrors}}fmt.Errorf("query {{.MethodName}}: %w", err){{else}}err{{end}} + } + defer rows.Close() + for rows.Next() { + var {{.Ret.Name}} {{.Ret.Type}} + if err := rows.Scan({{.Ret.Scan}}); err != nil { + return {{if $.WrapErrors}}fmt.Errorf("query {{.MethodName}}: %w", err){{else}}err{{end}} + } + *dest = append(*dest, {{.Ret.ReturnName}}) + } + if err := rows.Err(); err != nil { + return {{if $.WrapErrors}}fmt.Errorf("query {{.MethodName}}: %w", err){{else}}err{{end}} + } + return nil +} +{{- else -}} {{- if $.EmitMethodsWithDBArgument -}} func (q *Queries) {{.MethodName}}(ctx context.Context, db DBTX, {{.Arg.Pair}}) ([]{{.Ret.DefineType}}, error) { rows, err := db.Query(ctx, {{.ConstantName}}, {{.Arg.Params}}) @@ -77,6 +102,7 @@ func (q *Queries) {{.MethodName}}(ctx context.Context, {{.Arg.Pair}}) ([]{{.Ret. } return items, nil } +{{- end}} {{end}} {{if eq .Cmd ":exec"}}