103 lines
2.2 KiB
Go
103 lines
2.2 KiB
Go
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
|
|
|
|
|
|
|
|
} |