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