7 "github.com/sjmudd/pstop/lib"
11 root@localhost [i_s]> show create table i_s\G
12 *************************** 1. row ***************************
13 CREATE TEMPORARY TABLE `PROCESSLIST` (
14 `ID` bigint(21) unsigned NOT NULL DEFAULT '0',
15 `USER` varchar(16) NOT NULL DEFAULT '',
16 `HOST` varchar(64) NOT NULL DEFAULT '',
17 `DB` varchar(64) DEFAULT NULL, `COMMAND` varchar(16) NOT NULL DEFAULT '', `TIME` int(7) NOT NULL DEFAULT '0', `STATE` varchar(64) DEFAULT NULL,
19 ) ENGINE=MyISAM DEFAULT CHARSET=utf8
20 1 row in set (0.02 sec)
23 // a summary row of information taken from information_schema.processlist
24 type pl_by_user_row struct {
37 type pl_by_user_rows []pl_by_user_row
40 username |Run Time %age|Conn Actv|Hosts DBs|Select Insert Update Delete Other|
41 xxxxxxxxxxxxxx|hh:mm:ss 100.0%|9999 9999|9999 999|100.0% 100.0% 100.0% 100.0% 100.0%|
44 func (r *pl_by_user_row) headings() string {
45 return fmt.Sprintf("%-14s|%10s %6s|%4s %4s|%5s %3s|%6s %6s %6s %6s %6s|",
46 "User", "Run Time", "%", "Conn", "Actv", "Hosts", "DBs", "Select", "Insert", "Update", "Delete", "Other")
49 // generate a printable result
50 func (r *pl_by_user_row) row_content(totals pl_by_user_row) string {
52 if len(r.username) == 0 {
54 } else if len(r.username) > 14 {
59 return fmt.Sprintf("%-14s|%10s %6s|%4s %4s|%5s %3s|%6s %6s %6s %6s %6s|",
61 lib.FormatTime(r.runtime),
62 lib.FormatPct(lib.MyDivide(r.runtime, totals.runtime)),
63 lib.FormatAmount(r.connections),
64 lib.FormatAmount(r.active),
65 lib.FormatAmount(r.hosts),
66 lib.FormatAmount(r.dbs),
67 lib.FormatAmount(r.selects),
68 lib.FormatAmount(r.inserts),
69 lib.FormatAmount(r.updates),
70 lib.FormatAmount(r.deletes),
71 lib.FormatAmount(r.other))
74 // generate a row of totals from a table
75 func (t pl_by_user_rows) totals() pl_by_user_row {
76 var totals pl_by_user_row
77 totals.username = "Totals"
80 totals.runtime += t[i].runtime
81 totals.connections += t[i].connections
82 totals.active += t[i].active
83 // totals.hosts += t[i].hosts This needs to be done differently to get the total number of distinct hosts
84 // totals.dbs += t[i].dbs This needs to be done differently to get the total number of distinct dbs
85 totals.selects += t[i].selects
86 totals.inserts += t[i].inserts
87 totals.updates += t[i].updates
88 totals.deletes += t[i].deletes
89 totals.other += t[i].other
95 func (t pl_by_user_rows) Headings() string {
100 // describe a whole row
101 func (r pl_by_user_row) String() string {
102 return fmt.Sprintf("%v %v %v %v %v %v %v %v %v", r.username, r.runtime, r.connections, r.active, r.hosts, r.dbs, r.selects, r.inserts, r.updates, r.deletes, r.other)
105 // describe a whole table
106 func (t pl_by_user_rows) String() string {
109 s = s + t[i].String() + "\n"
115 type ByRunTime pl_by_user_rows
117 func (t ByRunTime) Len() int { return len(t) }
118 func (t ByRunTime) Swap(i, j int) { t[i], t[j] = t[j], t[i] }
119 func (t ByRunTime) Less(i, j int) bool {
120 return (t[i].runtime > t[j].runtime) ||
121 ((t[i].runtime == t[j].runtime) && (t[i].connections > t[j].connections)) ||
122 ((t[i].runtime == t[j].runtime) && (t[i].connections == t[j].connections) && (t[i].username < t[j].username))
125 func (t pl_by_user_rows) Sort() {
126 sort.Sort(ByRunTime(t))
129 func (r pl_by_user_row) Description() string {
130 return "no description"
133 func (t pl_by_user_rows) emptyRowContent() string {
135 return r.row_content(r)