@@ -17,13 +17,14 @@ import (
1717)
1818
1919type tmplCtx struct {
20- Q string
21- Package string
22- SQLDriver opts.SQLDriver
23- Enums []Enum
24- Structs []Struct
25- GoQueries []Query
26- SqlcVersion string
20+ Q string
21+ Package string
22+ SQLDriver opts.SQLDriver
23+ Enums []Enum
24+ Structs []Struct
25+ GoQueries []Query
26+ GoReadQueries []Query
27+ SqlcVersion string
2728
2829 // TODO: Race conditions
2930 SourceName string
@@ -37,6 +38,7 @@ type tmplCtx struct {
3738 EmitMethodsWithDBArgument bool
3839 EmitEnumValidMethod bool
3940 EmitAllEnumValues bool
41+ EmitReadOnlyPrepared bool
4042 UsesCopyFrom bool
4143 UsesBatch bool
4244 OmitSqlcVersion bool
@@ -177,6 +179,7 @@ func generate(req *plugin.GenerateRequest, options *opts.Options, enums []Enum,
177179 EmitMethodsWithDBArgument : options .EmitMethodsWithDbArgument ,
178180 EmitEnumValidMethod : options .EmitEnumValidMethod ,
179181 EmitAllEnumValues : options .EmitAllEnumValues ,
182+ EmitReadOnlyPrepared : options .EmitReadOnlyPrepared ,
180183 UsesCopyFrom : usesCopyFrom (queries ),
181184 UsesBatch : usesBatch (queries ),
182185 SQLDriver : parseDriver (options .SqlPackage ),
@@ -240,6 +243,7 @@ func generate(req *plugin.GenerateRequest, options *opts.Options, enums []Enum,
240243 w := bufio .NewWriter (& b )
241244 tctx .SourceName = name
242245 tctx .GoQueries = replacedQueries
246+ tctx .GoReadQueries = readOnly (replacedQueries )
243247 err := tmpl .ExecuteTemplate (w , templateName , & tctx )
244248 w .Flush ()
245249 if err != nil {
@@ -278,6 +282,7 @@ func generate(req *plugin.GenerateRequest, options *opts.Options, enums []Enum,
278282 if options .OutputCopyfromFileName != "" {
279283 copyfromFileName = options .OutputCopyfromFileName
280284 }
285+ readQueriesFileName := "read.go"
281286
282287 batchFileName := "batch.go"
283288 if options .OutputBatchFileName != "" {
@@ -305,6 +310,11 @@ func generate(req *plugin.GenerateRequest, options *opts.Options, enums []Enum,
305310 return nil , err
306311 }
307312 }
313+ if tctx .EmitReadOnlyPrepared {
314+ if err := execute (readQueriesFileName , "readQueriesFile" ); err != nil {
315+ return nil , err
316+ }
317+ }
308318
309319 files := map [string ]struct {}{}
310320 for _ , gq := range queries {
@@ -405,3 +415,23 @@ func filterUnusedStructs(enums []Enum, structs []Struct, queries []Query) ([]Enu
405415
406416 return keepEnums , keepStructs
407417}
418+
419+ func readOnly (queries []Query ) []Query {
420+ var rq []Query
421+ for _ , q := range queries {
422+ if ! q .hasRetType () {
423+ continue
424+ }
425+
426+ qsql := strings .ToUpper (q .SQL )
427+ if ! strings .Contains (qsql , "SELECT" ) {
428+ continue
429+ }
430+ if strings .Contains (qsql , "UPDATE" ) || strings .Contains (qsql , "INSERT" ) {
431+ continue
432+ }
433+
434+ rq = append (rq , q )
435+ }
436+ return rq
437+ }
0 commit comments