Skip to content

Commit 1019343

Browse files
committed
feat(codegen/golang): add an option to wrap query errors that includes query name
1 parent 6b2ed20 commit 1019343

File tree

11 files changed

+263
-13
lines changed

11 files changed

+263
-13
lines changed

internal/codegen/golang/gen.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ type tmplCtx struct {
4141
UsesBatch bool
4242
OmitSqlcVersion bool
4343
BuildTags string
44+
WrapErrors bool
4445
}
4546

4647
func (t *tmplCtx) OutputQuery(sourceName string) bool {
@@ -98,6 +99,9 @@ func (t *tmplCtx) codegenQueryRetval(q Query) (string, error) {
9899
case ":execrows", ":execlastid":
99100
return "result, err :=", nil
100101
case ":execresult":
102+
if t.WrapErrors {
103+
return "result, err :=", nil
104+
}
101105
return "return", nil
102106
default:
103107
return "", fmt.Errorf("unhandled q.Cmd case %q", q.Cmd)
@@ -187,6 +191,7 @@ func generate(req *plugin.GenerateRequest, options *opts.Options, enums []Enum,
187191
SqlcVersion: req.SqlcVersion,
188192
BuildTags: options.BuildTags,
189193
OmitSqlcVersion: options.OmitSqlcVersion,
194+
WrapErrors: options.WrapErrors,
190195
}
191196

192197
if tctx.UsesCopyFrom && !tctx.SQLDriver.IsPGX() && options.SqlDriver != opts.SQLDriverGoSQLDriverMySQL {

internal/codegen/golang/imports.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -402,6 +402,10 @@ func (i *importer) queryImports(filename string) fileImports {
402402
pkg[ImportSpec{Path: "github.com/lib/pq"}] = struct{}{}
403403
}
404404

405+
if i.Options.WrapErrors {
406+
std["fmt"] = struct{}{}
407+
}
408+
405409
return sortedImports(std, pkg)
406410
}
407411

internal/codegen/golang/opts/options.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ type Options struct {
3939
OutputCopyfromFileName string `json:"output_copyfrom_file_name,omitempty" yaml:"output_copyfrom_file_name"`
4040
OutputFilesSuffix string `json:"output_files_suffix,omitempty" yaml:"output_files_suffix"`
4141
InflectionExcludeTableNames []string `json:"inflection_exclude_table_names,omitempty" yaml:"inflection_exclude_table_names"`
42+
WrapErrors bool `json:"wrap_errors,omitempty" yaml:"wrap_errors"`
4243
QueryParameterLimit *int32 `json:"query_parameter_limit,omitempty" yaml:"query_parameter_limit"`
4344
OmitSqlcVersion bool `json:"omit_sqlc_version,omitempty" yaml:"omit_sqlc_version"`
4445
OmitUnusedStructs bool `json:"omit_unused_structs,omitempty" yaml:"omit_unused_structs"`

internal/codegen/golang/templates/pgx/queryCode.tmpl

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,11 @@ func (q *Queries) {{.MethodName}}(ctx context.Context, {{.Arg.Pair}}) ({{.Ret.De
3737
var {{.Ret.Name}} {{.Ret.Type}}
3838
{{- end}}
3939
err := row.Scan({{.Ret.Scan}})
40+
{{- if $.WrapErrors}}
41+
if err != nil {
42+
err = fmt.Errorf("error executing query {{.MethodName}}: %w", err)
43+
}
44+
{{- end}}
4045
return {{.Ret.ReturnName}}, err
4146
}
4247
{{end}}
@@ -52,7 +57,7 @@ func (q *Queries) {{.MethodName}}(ctx context.Context, {{.Arg.Pair}}) ([]{{.Ret.
5257
rows, err := q.db.Query(ctx, {{.ConstantName}}, {{.Arg.Params}})
5358
{{- end}}
5459
if err != nil {
55-
return nil, err
60+
return nil, {{if $.WrapErrors}}fmt.Errorf("error executing query {{.MethodName}}: %w", err){{else}}err{{end}}
5661
}
5762
defer rows.Close()
5863
{{- if $.EmitEmptySlices}}
@@ -63,12 +68,12 @@ func (q *Queries) {{.MethodName}}(ctx context.Context, {{.Arg.Pair}}) ([]{{.Ret.
6368
for rows.Next() {
6469
var {{.Ret.Name}} {{.Ret.Type}}
6570
if err := rows.Scan({{.Ret.Scan}}); err != nil {
66-
return nil, err
71+
return nil, {{if $.WrapErrors}}fmt.Errorf("error executing query {{.MethodName}}: %w", err){{else}}err{{end}}
6772
}
6873
items = append(items, {{.Ret.ReturnName}})
6974
}
7075
if err := rows.Err(); err != nil {
71-
return nil, err
76+
return nil, {{if $.WrapErrors}}fmt.Errorf("error executing query {{.MethodName}}: %w", err){{else}}err{{end}}
7277
}
7378
return items, nil
7479
}
@@ -84,7 +89,7 @@ func (q *Queries) {{.MethodName}}(ctx context.Context, db DBTX, {{.Arg.Pair}}) e
8489
func (q *Queries) {{.MethodName}}(ctx context.Context, {{.Arg.Pair}}) error {
8590
_, err := q.db.Exec(ctx, {{.ConstantName}}, {{.Arg.Params}})
8691
{{- end}}
87-
return err
92+
return {{if $.WrapErrors}}fmt.Errorf("error executing query {{.MethodName}}: %w", err){{else}}err{{end}}
8893
}
8994
{{end}}
9095

@@ -99,7 +104,7 @@ func (q *Queries) {{.MethodName}}(ctx context.Context, {{.Arg.Pair}}) (int64, er
99104
result, err := q.db.Exec(ctx, {{.ConstantName}}, {{.Arg.Params}})
100105
{{- end}}
101106
if err != nil {
102-
return 0, err
107+
return 0, {{if $.WrapErrors}}fmt.Errorf("error executing query {{.MethodName}}: %w", err){{else}}err{{end}}
103108
}
104109
return result.RowsAffected(), nil
105110
}
@@ -110,11 +115,17 @@ func (q *Queries) {{.MethodName}}(ctx context.Context, {{.Arg.Pair}}) (int64, er
110115
{{end -}}
111116
{{- if $.EmitMethodsWithDBArgument -}}
112117
func (q *Queries) {{.MethodName}}(ctx context.Context, db DBTX, {{.Arg.Pair}}) (pgconn.CommandTag, error) {
113-
return db.Exec(ctx, {{.ConstantName}}, {{.Arg.Params}})
118+
result, err := db.Exec(ctx, {{.ConstantName}}, {{.Arg.Params}})
114119
{{- else -}}
115120
func (q *Queries) {{.MethodName}}(ctx context.Context, {{.Arg.Pair}}) (pgconn.CommandTag, error) {
116-
return q.db.Exec(ctx, {{.ConstantName}}, {{.Arg.Params}})
121+
result, err := q.db.Exec(ctx, {{.ConstantName}}, {{.Arg.Params}})
117122
{{- end}}
123+
{{- if $.WrapErrors}}
124+
if err != nil {
125+
err = fmt.Errorf("error executing query {{.MethodName}}: %w", err)
126+
}
127+
{{- end}}
128+
return result, err
118129
}
119130
{{end}}
120131

internal/codegen/golang/templates/stdlib/queryCode.tmpl

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,11 @@ func (q *Queries) {{.MethodName}}(ctx context.Context, {{ dbarg }} {{.Arg.Pair}}
2828
var {{.Ret.Name}} {{.Ret.Type}}
2929
{{- end}}
3030
err := row.Scan({{.Ret.Scan}})
31+
{{- if $.WrapErrors}}
32+
if err != nil {
33+
err = fmt.Errorf("error executing query {{.MethodName}}: %w", err)
34+
}
35+
{{- end}}
3136
return {{.Ret.ReturnName}}, err
3237
}
3338
{{end}}
@@ -38,7 +43,7 @@ func (q *Queries) {{.MethodName}}(ctx context.Context, {{ dbarg }} {{.Arg.Pair}}
3843
func (q *Queries) {{.MethodName}}(ctx context.Context, {{ dbarg }} {{.Arg.Pair}}) ([]{{.Ret.DefineType}}, error) {
3944
{{- template "queryCodeStdExec" . }}
4045
if err != nil {
41-
return nil, err
46+
return nil, {{if $.WrapErrors}}fmt.Errorf("error executing query {{.MethodName}}: %w", err){{else}}err{{end}}
4247
}
4348
defer rows.Close()
4449
{{- if $.EmitEmptySlices}}
@@ -49,15 +54,15 @@ func (q *Queries) {{.MethodName}}(ctx context.Context, {{ dbarg }} {{.Arg.Pair}}
4954
for rows.Next() {
5055
var {{.Ret.Name}} {{.Ret.Type}}
5156
if err := rows.Scan({{.Ret.Scan}}); err != nil {
52-
return nil, err
57+
return nil, {{if $.WrapErrors}}fmt.Errorf("error executing query {{.MethodName}}: %w", err){{else}}err{{end}}
5358
}
5459
items = append(items, {{.Ret.ReturnName}})
5560
}
5661
if err := rows.Close(); err != nil {
57-
return nil, err
62+
return nil, {{if $.WrapErrors}}fmt.Errorf("error executing query {{.MethodName}}: %w", err){{else}}err{{end}}
5863
}
5964
if err := rows.Err(); err != nil {
60-
return nil, err
65+
return nil, {{if $.WrapErrors}}fmt.Errorf("error executing query {{.MethodName}}: %w", err){{else}}err{{end}}
6166
}
6267
return items, nil
6368
}
@@ -68,6 +73,11 @@ func (q *Queries) {{.MethodName}}(ctx context.Context, {{ dbarg }} {{.Arg.Pair}}
6873
{{end -}}
6974
func (q *Queries) {{.MethodName}}(ctx context.Context, {{ dbarg }} {{.Arg.Pair}}) error {
7075
{{- template "queryCodeStdExec" . }}
76+
{{- if $.WrapErrors}}
77+
if err != nil {
78+
err = fmt.Errorf("error executing query {{.MethodName}}: %w", err)
79+
}
80+
{{- end}}
7181
return err
7282
}
7383
{{end}}
@@ -78,7 +88,7 @@ func (q *Queries) {{.MethodName}}(ctx context.Context, {{ dbarg }} {{.Arg.Pair}}
7888
func (q *Queries) {{.MethodName}}(ctx context.Context, {{ dbarg }} {{.Arg.Pair}}) (int64, error) {
7989
{{- template "queryCodeStdExec" . }}
8090
if err != nil {
81-
return 0, err
91+
return 0, {{if $.WrapErrors}}fmt.Errorf("error executing query {{.MethodName}}: %w", err){{else}}err{{end}}
8292
}
8393
return result.RowsAffected()
8494
}
@@ -90,7 +100,7 @@ func (q *Queries) {{.MethodName}}(ctx context.Context, {{ dbarg }} {{.Arg.Pair}}
90100
func (q *Queries) {{.MethodName}}(ctx context.Context, {{ dbarg }} {{.Arg.Pair}}) (int64, error) {
91101
{{- template "queryCodeStdExec" . }}
92102
if err != nil {
93-
return 0, err
103+
return 0, {{if $.WrapErrors}}fmt.Errorf("error executing query {{.MethodName}}: %w", err){{else}}err{{end}}
94104
}
95105
return result.LastInsertId()
96106
}
@@ -101,6 +111,12 @@ func (q *Queries) {{.MethodName}}(ctx context.Context, {{ dbarg }} {{.Arg.Pair}}
101111
{{end -}}
102112
func (q *Queries) {{.MethodName}}(ctx context.Context, {{ dbarg }} {{.Arg.Pair}}) (sql.Result, error) {
103113
{{- template "queryCodeStdExec" . }}
114+
{{- if $.WrapErrors}}
115+
if err != nil {
116+
err = fmt.Errorf("error executing query {{.MethodName}}: %w", err)
117+
}
118+
return result, err
119+
{{- end}}
104120
}
105121
{{end}}
106122

internal/endtoend/testdata/wrap_errors/postgresql/pgx/db/db.go

Lines changed: 32 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/endtoend/testdata/wrap_errors/postgresql/pgx/db/models.go

Lines changed: 15 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

internal/endtoend/testdata/wrap_errors/postgresql/pgx/db/query.sql.go

Lines changed: 119 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)