@@ -59,14 +59,16 @@ ORDER BY 1;
59
59
`
60
60
61
61
const catalogTmpl = `
62
- package postgresql
62
+ // Code generated by sqlc-pg-gen. DO NOT EDIT.
63
+
64
+ package {{.Pkg}}
63
65
64
66
import (
65
67
"github.com/kyleconroy/sqlc/internal/sql/ast"
66
68
"github.com/kyleconroy/sqlc/internal/sql/catalog"
67
69
)
68
70
69
- func gen {{.Name}}() *catalog.Schema {
71
+ func {{.Name}}() *catalog.Schema {
70
72
s := &catalog.Schema{Name: "pg_catalog"}
71
73
s.Funcs = []*catalog.Function{
72
74
{{- range .Funcs}}
@@ -92,7 +94,29 @@ func gen{{.Name}}() *catalog.Schema {
92
94
}
93
95
`
94
96
97
+ const loaderFuncTmpl = `
98
+ // Code generated by sqlc-pg-gen. DO NOT EDIT.
99
+
100
+ package postgresql
101
+
102
+ import (
103
+ "github.com/kyleconroy/sqlc/internal/engine/postgresql/contrib"
104
+ "github.com/kyleconroy/sqlc/internal/sql/catalog"
105
+ )
106
+
107
+ func loadExtension(name string) *catalog.Schema {
108
+ switch name {
109
+ {{- range .}}
110
+ case "{{.Name}}":
111
+ return contrib.{{.Func}}()
112
+ {{- end}}
113
+ }
114
+ return nil
115
+ }
116
+ `
117
+
95
118
type tmplCtx struct {
119
+ Pkg string
96
120
Name string
97
121
Funcs []catalog.Function
98
122
}
@@ -220,48 +244,134 @@ func run(ctx context.Context) error {
220
244
return err
221
245
}
222
246
out := bytes .NewBuffer ([]byte {})
223
- if err := tmpl .Execute (out , tmplCtx {Name : "PGCatalog " , Funcs : funcs }); err != nil {
247
+ if err := tmpl .Execute (out , tmplCtx {Pkg : "postgresql" , Name : "genPGCatalog " , Funcs : funcs }); err != nil {
224
248
return err
225
249
}
226
250
code , err := format .Source (out .Bytes ())
227
251
if err != nil {
228
252
return err
229
253
}
230
- err = ioutil .WriteFile (filepath .Join ("internal" , "engine" , "postgresql" , "pg_catalog.gen. go" ), code , 0644 )
254
+ err = ioutil .WriteFile (filepath .Join ("internal" , "engine" , "postgresql" , "pg_catalog.go" ), code , 0644 )
231
255
if err != nil {
232
256
return err
233
257
}
234
258
235
- // https://www.postgresql.org/docs/current/contrib.html
236
- extensions := map [string ]string {
237
- "citext" : "CIText" ,
238
- "pg_trgm" : "PGTrigram" ,
239
- "pgcrypto" : "PGCrypto" ,
240
- "uuid-ossp" : "UUIDOSSP" ,
241
- }
259
+ loaded := []extensionPair {}
260
+
261
+ for _ , extension := range extensions {
262
+ name := strings .Replace (extension , "-" , "_" , - 1 )
263
+
264
+ var funcName string
265
+ for _ , part := range strings .Split (name , "_" ) {
266
+ funcName += strings .Title (part )
267
+ }
242
268
243
- for extension , name := range extensions {
244
269
_ , err := conn .Exec (ctx , fmt .Sprintf ("CREATE EXTENSION IF NOT EXISTS \" %s\" " , extension ))
245
270
if err != nil {
246
- return err
271
+ log .Printf ("error creating %s: %s" , extension , err )
272
+ continue
247
273
}
274
+
248
275
rows , err := conn .Query (ctx , extensionFuncs , extension )
276
+ if err != nil {
277
+ return err
278
+ }
249
279
funcs , err := scanFuncs (rows )
250
280
if err != nil {
251
281
return err
252
282
}
283
+ if len (funcs ) == 0 {
284
+ log .Printf ("no functions in %s, skipping" , extension )
285
+ continue
286
+ }
253
287
out := bytes .NewBuffer ([]byte {})
254
- if err := tmpl .Execute (out , tmplCtx {Name : name , Funcs : funcs }); err != nil {
288
+ if err := tmpl .Execute (out , tmplCtx {Pkg : "contrib" , Name : funcName , Funcs : funcs }); err != nil {
255
289
return err
256
290
}
257
291
code , err := format .Source (out .Bytes ())
258
292
if err != nil {
259
293
return err
260
294
}
261
- err = ioutil .WriteFile (filepath .Join ("internal" , "engine" , "postgresql" , "extension_" + strings . Replace ( extension , "-" , "_" , - 1 ) + ".gen .go" ), code , 0644 )
295
+ err = ioutil .WriteFile (filepath .Join ("internal" , "engine" , "postgresql" , "contrib" , name + " .go" ), code , 0644 )
262
296
if err != nil {
263
297
return err
264
298
}
299
+
300
+ loaded = append (loaded , extensionPair {Name : extension , Func : funcName })
265
301
}
302
+
303
+ {
304
+ tmpl , err := template .New ("" ).Parse (loaderFuncTmpl )
305
+ if err != nil {
306
+ return err
307
+ }
308
+ out := bytes .NewBuffer ([]byte {})
309
+ if err := tmpl .Execute (out , loaded ); err != nil {
310
+ return err
311
+ }
312
+ code , err := format .Source (out .Bytes ())
313
+ if err != nil {
314
+ return err
315
+ }
316
+ err = ioutil .WriteFile (filepath .Join ("internal" , "engine" , "postgresql" , "extension.go" ), code , 0644 )
317
+ if err != nil {
318
+ return err
319
+ }
320
+ }
321
+
266
322
return nil
267
323
}
324
+
325
+ type extensionPair struct {
326
+ Name string
327
+ Func string
328
+ }
329
+
330
+ // https://www.postgresql.org/docs/current/contrib.html
331
+ var extensions = []string {
332
+ "adminpack" ,
333
+ "amcheck" ,
334
+ "auth_delay" ,
335
+ "auto_explain" ,
336
+ "bloom" ,
337
+ "btree_gin" ,
338
+ "btree_gist" ,
339
+ "citext" ,
340
+ "cube" ,
341
+ "dblink" ,
342
+ "dict_int" ,
343
+ "dict_xsyn" ,
344
+ "earthdistance" ,
345
+ "file_fdw" ,
346
+ "fuzzystrmatch" ,
347
+ "hstore" ,
348
+ "intagg" ,
349
+ "intarray" ,
350
+ "isn" ,
351
+ "lo" ,
352
+ "ltree" ,
353
+ "pageinspect" ,
354
+ "passwordcheck" ,
355
+ "pg_buffercache" ,
356
+ "pgcrypto" ,
357
+ "pg_freespacemap" ,
358
+ "pg_prewarm" ,
359
+ "pgrowlocks" ,
360
+ "pg_stat_statements" ,
361
+ "pgstattuple" ,
362
+ "pg_trgm" ,
363
+ "pg_visibility" ,
364
+ "postgres_fdw" ,
365
+ "seg" ,
366
+ "sepgsql" ,
367
+ "spi" ,
368
+ "sslinfo" ,
369
+ "tablefunc" ,
370
+ "tcn" ,
371
+ "test_decoding" ,
372
+ "tsm_system_rows" ,
373
+ "tsm_system_time" ,
374
+ "unaccent" ,
375
+ "uuid-ossp" ,
376
+ "xml2" ,
377
+ }
0 commit comments