...
1
2
3
4
5
6 package main
7
8 import (
9 "database/sql"
10 "fmt"
11 "log"
12 "os"
13 "os/exec"
14 "strings"
15
16 _ "github.com/lib/pq"
17 )
18
19
20 type OID struct {
21 ID int
22 Type string
23 }
24
25
26 func (o OID) Name() string {
27 return strings.ToUpper(o.Type)
28 }
29
30 func main() {
31 datname := os.Getenv("PGDATABASE")
32 sslmode := os.Getenv("PGSSLMODE")
33
34 if datname == "" {
35 os.Setenv("PGDATABASE", "pqgotest")
36 }
37
38 if sslmode == "" {
39 os.Setenv("PGSSLMODE", "disable")
40 }
41
42 db, err := sql.Open("postgres", "")
43 if err != nil {
44 log.Fatal(err)
45 }
46 rows, err := db.Query(`
47 SELECT typname, oid
48 FROM pg_type WHERE oid < 10000
49 ORDER BY oid;
50 `)
51 if err != nil {
52 log.Fatal(err)
53 }
54 oids := make([]*OID, 0)
55 for rows.Next() {
56 var oid OID
57 if err = rows.Scan(&oid.Type, &oid.ID); err != nil {
58 log.Fatal(err)
59 }
60 oids = append(oids, &oid)
61 }
62 if err = rows.Err(); err != nil {
63 log.Fatal(err)
64 }
65 cmd := exec.Command("gofmt")
66 cmd.Stderr = os.Stderr
67 w, err := cmd.StdinPipe()
68 if err != nil {
69 log.Fatal(err)
70 }
71 f, err := os.Create("types.go")
72 if err != nil {
73 log.Fatal(err)
74 }
75 cmd.Stdout = f
76 err = cmd.Start()
77 if err != nil {
78 log.Fatal(err)
79 }
80 fmt.Fprintln(w, "// Code generated by gen.go. DO NOT EDIT.")
81 fmt.Fprintln(w, "\npackage oid")
82 fmt.Fprintln(w, "const (")
83 for _, oid := range oids {
84 fmt.Fprintf(w, "T_%s Oid = %d\n", oid.Type, oid.ID)
85 }
86 fmt.Fprintln(w, ")")
87 fmt.Fprintln(w, "var TypeName = map[Oid]string{")
88 for _, oid := range oids {
89 fmt.Fprintf(w, "T_%s: \"%s\",\n", oid.Type, oid.Name())
90 }
91 fmt.Fprintln(w, "}")
92 w.Close()
93 cmd.Wait()
94 }
95
View as plain text