package database import ( "context" "database/sql" "fmt" _ "github.com/lib/pq" "github.com/sirupsen/logrus" "shiny-pancake/internal/model" "shiny-pancake/logger" ) const datetime = `2006-01-02T15:04:05Z` const date = `2006-01-02` type Database struct { conn *sql.DB log *logrus.Logger ctx context.Context } func New(c *model.HostDetails) *Database { var db Database var h string var u string var pw string var dbn string var psqlInfo string var log *logrus.Logger h = c.Hostname u = c.Username pw = c.Secret dbn = c.DatabaseName db.ctx = context.Background() db.log = log psqlInfo = fmt.Sprintf("host=%s port=%d user=%s "+ "password=%s dbname=%s sslmode=disable", h, 5432, u, pw, dbn) dbC, err := sql.Open("postgres", psqlInfo) if err != nil { log.Fatalf("database.new: Cannot establish connection to %s: %v", h, err) } db.conn = dbC return &db } func (db *Database) UserSessions() ([]*model.Session, error) { query := `select usename, count(usename) from pg_stat_activity where usename is not null group by usename` rows, err := db.conn.Query(query) if err != nil { // handle this error better than this panic(err) } sessions := make([]*model.Session, 0) defer rows.Close() for rows.Next() { var sessCount model.Session var l logger.Log err = rows.Scan(&sessCount.Username, &sessCount.Count) l = logger.Log{"info", logrus.Fields{"session" : sessCount.Count, "users" : sessCount.Username}, " count " + sessCount.Username + " users on host"} logger.Lgr(&l) if err != nil { // handle this error panic(err) } sessions = append(sessions, &sessCount) } // get any error encountered during iteration err = rows.Err() if err != nil { panic(err) } return sessions, err } func (db *Database) ConnUse() (*model.Guage, error) { var i int var i1 int var m model.Guage query := `SELECT sum(numbackends) FROM pg_stat_database;` q2 := `show max_connections` err := db.conn.QueryRow(query).Scan(&i) if err != nil { // handle this error better than this panic(err) } err2 := db.conn.QueryRow(q2).Scan(&i1) if err2 != nil { // handle this error better than this panic(err) } m = model.Guage{i, i1} return &m, nil }