/
databases.go
72 lines (59 loc) · 1.79 KB
/
databases.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
package postgres
import (
"context"
"database/sql"
"fmt"
"github.com/pganalyze/collector/state"
"github.com/pganalyze/collector/util"
)
// See also https://www.postgresql.org/docs/current/static/catalog-pg-database.html
const databasesSQL string = `
SELECT
d.oid,
d.datname,
d.datdba,
pg_catalog.pg_encoding_to_char(d.encoding),
d.datcollate,
d.datctype,
d.datistemplate,
d.datallowconn,
d.datconnlimit,
d.datfrozenxid,
d.datminmxid,
CASE WHEN d.datfrozenxid <> '0' THEN pg_catalog.age(d.datfrozenxid) ELSE 0 END,
CASE WHEN d.datminmxid <> '0' THEN pg_catalog.mxid_age(d.datminmxid) ELSE 0 END,
sd.xact_commit,
sd.xact_rollback
FROM pg_catalog.pg_database d
LEFT JOIN pg_catalog.pg_stat_database sd
ON d.oid = sd.datid`
func GetDatabases(ctx context.Context, logger *util.Logger, db *sql.DB, postgresVersion state.PostgresVersion) ([]state.PostgresDatabase, state.PostgresDatabaseStatsMap, error) {
stmt, err := db.PrepareContext(ctx, QueryMarkerSQL+fmt.Sprintf(databasesSQL))
if err != nil {
return nil, nil, err
}
defer stmt.Close()
rows, err := stmt.QueryContext(ctx)
if err != nil {
return nil, nil, err
}
defer rows.Close()
var databases []state.PostgresDatabase
var databaseStats = make(state.PostgresDatabaseStatsMap)
for rows.Next() {
var d state.PostgresDatabase
var ds state.PostgresDatabaseStats
err := rows.Scan(&d.Oid, &d.Name, &d.OwnerRoleOid, &d.Encoding, &d.Collate, &d.CType,
&d.IsTemplate, &d.AllowConnections, &d.ConnectionLimit, &d.FrozenXID, &d.MinimumMultixactXID,
&ds.FrozenXIDAge, &ds.MinMXIDAge, &ds.XactCommit, &ds.XactRollback)
if err != nil {
return nil, nil, err
}
databases = append(databases, d)
databaseStats[d.Oid] = ds
}
if err = rows.Err(); err != nil {
return nil, nil, err
}
return databases, databaseStats, nil
}