Платформа ЦРНП "Мирокод" для разработки проектов
https://git.mirocod.ru
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
93 lines
1.7 KiB
93 lines
1.7 KiB
// +build ignore |
|
|
|
// Generate the table of OID values |
|
// Run with 'go run gen.go'. |
|
package main |
|
|
|
import ( |
|
"database/sql" |
|
"fmt" |
|
"log" |
|
"os" |
|
"os/exec" |
|
"strings" |
|
|
|
_ "github.com/lib/pq" |
|
) |
|
|
|
// OID represent a postgres Object Identifier Type. |
|
type OID struct { |
|
ID int |
|
Type string |
|
} |
|
|
|
// Name returns an upper case version of the oid type. |
|
func (o OID) Name() string { |
|
return strings.ToUpper(o.Type) |
|
} |
|
|
|
func main() { |
|
datname := os.Getenv("PGDATABASE") |
|
sslmode := os.Getenv("PGSSLMODE") |
|
|
|
if datname == "" { |
|
os.Setenv("PGDATABASE", "pqgotest") |
|
} |
|
|
|
if sslmode == "" { |
|
os.Setenv("PGSSLMODE", "disable") |
|
} |
|
|
|
db, err := sql.Open("postgres", "") |
|
if err != nil { |
|
log.Fatal(err) |
|
} |
|
rows, err := db.Query(` |
|
SELECT typname, oid |
|
FROM pg_type WHERE oid < 10000 |
|
ORDER BY oid; |
|
`) |
|
if err != nil { |
|
log.Fatal(err) |
|
} |
|
oids := make([]*OID, 0) |
|
for rows.Next() { |
|
var oid OID |
|
if err = rows.Scan(&oid.Type, &oid.ID); err != nil { |
|
log.Fatal(err) |
|
} |
|
oids = append(oids, &oid) |
|
} |
|
if err = rows.Err(); err != nil { |
|
log.Fatal(err) |
|
} |
|
cmd := exec.Command("gofmt") |
|
cmd.Stderr = os.Stderr |
|
w, err := cmd.StdinPipe() |
|
if err != nil { |
|
log.Fatal(err) |
|
} |
|
f, err := os.Create("types.go") |
|
if err != nil { |
|
log.Fatal(err) |
|
} |
|
cmd.Stdout = f |
|
err = cmd.Start() |
|
if err != nil { |
|
log.Fatal(err) |
|
} |
|
fmt.Fprintln(w, "// Code generated by gen.go. DO NOT EDIT.") |
|
fmt.Fprintln(w, "\npackage oid") |
|
fmt.Fprintln(w, "const (") |
|
for _, oid := range oids { |
|
fmt.Fprintf(w, "T_%s Oid = %d\n", oid.Type, oid.ID) |
|
} |
|
fmt.Fprintln(w, ")") |
|
fmt.Fprintln(w, "var TypeName = map[Oid]string{") |
|
for _, oid := range oids { |
|
fmt.Fprintf(w, "T_%s: \"%s\",\n", oid.Type, oid.Name()) |
|
} |
|
fmt.Fprintln(w, "}") |
|
w.Close() |
|
cmd.Wait() |
|
}
|
|
|