From e177977c30dd89cb69106305380b01cba43637de Mon Sep 17 00:00:00 2001 From: Simon Ser Date: Tue, 5 Oct 2021 19:31:06 +0200 Subject: [PATCH] Add DB stats --- db.go | 7 +++++++ db_sqlite.go | 16 ++++++++++++++++ service.go | 8 ++++++-- 3 files changed, 29 insertions(+), 2 deletions(-) diff --git a/db.go b/db.go index b28827a..160645e 100644 --- a/db.go +++ b/db.go @@ -9,6 +9,7 @@ import ( type Database interface { Close() error + Stats() (*DatabaseStats, error) ListUsers() ([]User, error) GetUser(username string) (*User, error) @@ -26,6 +27,12 @@ type Database interface { StoreClientDeliveryReceipts(networkID int64, client string, receipts []DeliveryReceipt) error } +type DatabaseStats struct { + Users int64 + Networks int64 + Channels int64 +} + type User struct { ID int64 Username string diff --git a/db_sqlite.go b/db_sqlite.go index 21c8382..8b71102 100644 --- a/db_sqlite.go +++ b/db_sqlite.go @@ -205,6 +205,22 @@ func (db *SqliteDB) upgrade() error { return tx.Commit() } +func (db *SqliteDB) Stats() (*DatabaseStats, error) { + db.lock.RLock() + defer db.lock.RUnlock() + + var stats DatabaseStats + row := db.db.QueryRow(`SELECT + (SELECT COUNT(*) FROM User) AS users, + (SELECT COUNT(*) FROM Network) AS networks, + (SELECT COUNT(*) FROM Channel) AS channels`) + if err := row.Scan(&stats.Users, &stats.Networks, &stats.Channels); err != nil { + return nil, err + } + + return &stats, nil +} + func toNullString(s string) sql.NullString { return sql.NullString{ String: s, diff --git a/service.go b/service.go index 11dadda..02a4b3c 100644 --- a/service.go +++ b/service.go @@ -1026,7 +1026,11 @@ func handleServiceChannelUpdate(dc *downstreamConn, params []string) error { } func handleServiceServerStatus(dc *downstreamConn, params []string) error { - stats := dc.user.srv.Stats() - sendServicePRIVMSG(dc, fmt.Sprintf("%v users, %v downstreams", stats.Users, stats.Downstreams)) + dbStats, err := dc.user.srv.db.Stats() + if err != nil { + return err + } + serverStats := dc.user.srv.Stats() + sendServicePRIVMSG(dc, fmt.Sprintf("%v/%v users, %v downstreams, %v networks, %v channels", serverStats.Users, dbStats.Users, serverStats.Downstreams, dbStats.Networks, dbStats.Channels)) return nil }