diff --git a/internal/cli/inspect.go b/internal/cli/inspect.go index 7e1c382..255fc51 100644 --- a/internal/cli/inspect.go +++ b/internal/cli/inspect.go @@ -6,7 +6,7 @@ import ( func registerInspect(p *ArgParser) { c := &commands.InspectCmd{} - cmd := p.addCommand(c, "inspect", "Scan a datbase and output its configuration") + cmd := p.addCommand(c, "inspect", "Scan a database and output its configuration") cmd.Flag("host", "server hostname or socket directory").Short('h').StringVar(&c.Host) cmd.Flag("port", "server port number").Short('p').Uint16Var(&c.Port) diff --git a/internal/ddl/structs.go b/internal/ddl/structs.go index 91df63d..fbbb863 100644 --- a/internal/ddl/structs.go +++ b/internal/ddl/structs.go @@ -19,6 +19,7 @@ type Database struct { // Parameters describes database-level configuration options type Parameters struct { SearchPath []string `hcl:"search_path,optional"` + Timezone string `hcl:"timezone,optional"` } // A Schema is a database namespace diff --git a/internal/ddl/testdata/expected.hcl b/internal/ddl/testdata/expected.hcl index 554aca4..91c643c 100644 --- a/internal/ddl/testdata/expected.hcl +++ b/internal/ddl/testdata/expected.hcl @@ -1,6 +1,7 @@ parameters { search_path = ["$user", "public"] + timezone = "" } schema "public" { diff --git a/internal/pg/inspect.go b/internal/pg/inspect.go index f1ffff0..3790a34 100644 --- a/internal/pg/inspect.go +++ b/internal/pg/inspect.go @@ -19,6 +19,11 @@ func (c *Conn) InspectDatabase(o *InspectOptions) (db *ddl.Database, err error) o = &InspectOptions{} } + db.Parameters, err = c.ListParameters() + if err != nil { + return nil, err + } + db.Schemas, err = c.ListSchemas() if err != nil { return nil, err @@ -29,14 +34,22 @@ func (c *Conn) InspectDatabase(o *InspectOptions) (db *ddl.Database, err error) return nil, err } + if err := c.inspectTables(o, db); err != nil { + return nil, err + } + + return db, nil +} + +func (c *Conn) inspectTables(o *InspectOptions, db *ddl.Database) (err error) { db.Tables, err = c.ListTables() if err != nil { - return nil, err + return err } for _, table := range db.Tables { if err := c.inspectTable(o, db, table); err != nil { - return nil, err + return err } } @@ -50,7 +63,7 @@ func (c *Conn) InspectDatabase(o *InspectOptions) (db *ddl.Database, err error) }) } - return db, nil + return } func (c *Conn) inspectTable(o *InspectOptions, db *ddl.Database, table *ddl.Table) (err error) { diff --git a/internal/pg/parameters.go b/internal/pg/parameters.go new file mode 100644 index 0000000..054e910 --- /dev/null +++ b/internal/pg/parameters.go @@ -0,0 +1,32 @@ +package pg + +import ( + "strings" + + "github.com/sjansen/pgutil/internal/ddl" +) + +// ListParameters describes database configuration parameters +func (c *Conn) ListParameters() (*ddl.Parameters, error) { + c.log.Infow("listing parameters") + + params := &ddl.Parameters{} + + var tmp string + c.log.Debugw("SHOW search_path") + row := c.conn.QueryRow("SHOW search_path") + err := row.Scan(&tmp) + if err != nil { + return nil, err + } + params.SearchPath = strings.Split(tmp, ",") + + c.log.Debugw("SHOW timezone") + row = c.conn.QueryRow("SHOW timezone") + err = row.Scan(¶ms.Timezone) + if err != nil { + return nil, err + } + + return params, nil +} diff --git a/testdata/expected.hcl b/testdata/expected.hcl index cdc84f5..96cb21e 100644 --- a/testdata/expected.hcl +++ b/testdata/expected.hcl @@ -1,4 +1,9 @@ +parameters { + search_path = ["\"$user\"", " public"] + timezone = "UTC" +} + schema "public" { comment = "standard public schema" owner = "docker"