@@ -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+ CompositeTypes []CompositeType
26+ GoQueries []Query
27+ SqlcVersion string
2728
2829 // TODO: Race conditions
2930 SourceName string
@@ -109,12 +110,17 @@ func Generate(ctx context.Context, req *plugin.GenerateRequest) (*plugin.Generat
109110 if err != nil {
110111 return nil , err
111112 }
113+ driver := parseDriver (options .SqlPackage )
112114
113115 if err := opts .ValidateOpts (options ); err != nil {
114116 return nil , err
115117 }
116118
117119 enums := buildEnums (req , options )
120+ compositeTypes := []CompositeType {}
121+ if driver .IsPGXV5 () {
122+ compositeTypes = buildCompositeTypes (req , options )
123+ }
118124 structs := buildStructs (req , options )
119125 queries , err := buildQueries (req , options , structs )
120126 if err != nil {
@@ -125,46 +131,49 @@ func Generate(ctx context.Context, req *plugin.GenerateRequest) (*plugin.Generat
125131 enums , structs = filterUnusedStructs (enums , structs , queries )
126132 }
127133
128- if err := validate (options , enums , structs , queries ); err != nil {
134+ if err := validate (options , enums , compositeTypes , structs , queries ); err != nil {
129135 return nil , err
130136 }
131137
132- return generate (req , options , enums , structs , queries )
138+ return generate (req , options , enums , compositeTypes , structs , queries )
133139}
134140
135- func validate (options * opts.Options , enums []Enum , structs []Struct , queries []Query ) error {
136- enumNames := make (map [string ]struct {} )
141+ func validate (options * opts.Options , enums []Enum , compositeTypes [] CompositeType , structs []Struct , queries []Query ) error {
142+ usedNames := make (map [string ]string )
137143 for _ , enum := range enums {
138- enumNames [enum .Name ] = struct {}{}
139- enumNames ["Null" + enum .Name ] = struct {}{}
144+ usedNames [enum .Name ] = "enum"
145+ usedNames ["Null" + enum .Name ] = "enum"
140146 }
141- structNames := make (map [string ]struct {})
142147 for _ , struckt := range structs {
143- if _ , ok := enumNames [struckt .Name ]; ok {
144- return fmt .Errorf ("struct name conflicts with enum name: %s" , struckt .Name )
148+ if usedType , ok := usedNames [struckt .Name ]; ok {
149+ return fmt .Errorf ("struct name conflicts with %s name: %s" , usedType , struckt .Name )
150+ }
151+ usedNames [struckt .Name ] = "struct"
152+ }
153+ for _ , ct := range compositeTypes {
154+ if usedType , ok := usedNames [ct .Name ]; ok {
155+ return fmt .Errorf ("composite type name conflicts with %s name: %s" , usedType , ct .Name )
145156 }
146- structNames [ struckt .Name ] = struct {}{}
157+ usedNames [ ct .Name ] = "composite type"
147158 }
148159 if ! options .EmitExportedQueries {
149160 return nil
150161 }
151162 for _ , query := range queries {
152- if _ , ok := enumNames [query .ConstantName ]; ok {
153- return fmt .Errorf ("query constant name conflicts with enum name: %s" , query .ConstantName )
154- }
155- if _ , ok := structNames [query .ConstantName ]; ok {
156- return fmt .Errorf ("query constant name conflicts with struct name: %s" , query .ConstantName )
163+ if usedType , ok := usedNames [query .ConstantName ]; ok {
164+ return fmt .Errorf ("query constant name conflicts with %s name: %s" , usedType , query .ConstantName )
157165 }
158166 }
159167 return nil
160168}
161169
162- func generate (req * plugin.GenerateRequest , options * opts.Options , enums []Enum , structs []Struct , queries []Query ) (* plugin.GenerateResponse , error ) {
170+ func generate (req * plugin.GenerateRequest , options * opts.Options , enums []Enum , compositeTypes [] CompositeType , structs []Struct , queries []Query ) (* plugin.GenerateResponse , error ) {
163171 i := & importer {
164- Options : options ,
165- Queries : queries ,
166- Enums : enums ,
167- Structs : structs ,
172+ Options : options ,
173+ Queries : queries ,
174+ Enums : enums ,
175+ CompositeTypes : compositeTypes ,
176+ Structs : structs ,
168177 }
169178
170179 tctx := tmplCtx {
@@ -183,6 +192,7 @@ func generate(req *plugin.GenerateRequest, options *opts.Options, enums []Enum,
183192 Q : "`" ,
184193 Package : options .Package ,
185194 Enums : enums ,
195+ CompositeTypes : compositeTypes ,
186196 Structs : structs ,
187197 SqlcVersion : req .SqlcVersion ,
188198 BuildTags : options .BuildTags ,
0 commit comments