Move to i_s / p_s and add user info (not quite complete)
[pstop.git] / i_s / processlist_row.go
1 // This file contains the library routines for managing the
2 // table_io_waits_by_table table.
3 package i_s
4
5 import (
6         "database/sql"
7         "fmt"
8         "log"
9 )
10
11 /*
12 root@localhost [i_s]> show create table i_s\G
13 *************************** 1. row ***************************
14 CREATE TEMPORARY TABLE `PROCESSLIST` (
15         `ID` bigint(21) unsigned NOT NULL DEFAULT '0',
16         `USER` varchar(16) NOT NULL DEFAULT '',
17         `HOST` varchar(64) NOT NULL DEFAULT '',
18         `DB` varchar(64) DEFAULT NULL, `COMMAND` varchar(16) NOT NULL DEFAULT '', `TIME` int(7) NOT NULL DEFAULT '0', `STATE` varchar(64) DEFAULT NULL,
19         `INFO` longtext
20 ) ENGINE=MyISAM DEFAULT CHARSET=utf8
21 1 row in set (0.02 sec)
22 */
23
24 // a row from information_schema.processlist
25 type processlist_row struct {
26         ID      uint64
27         USER    string
28         HOST    string
29         DB      string
30         COMMAND string
31         TIME    uint64
32         STATE   string
33         INFO    string
34 }
35 type processlist_rows []processlist_row
36
37 // get the output of I_S.PROCESSLIST
38 func select_processlist(dbh *sql.DB) processlist_rows {
39         var t processlist_rows
40         var id sql.NullInt64
41         var user sql.NullString
42         var host sql.NullString
43         var db sql.NullString
44         var command sql.NullString
45         var time sql.NullInt64
46         var state sql.NullString
47         var info sql.NullString
48
49         // we collect all information even if it's mainly empty as we may reference it later
50
51         sql := "SELECT ID, USER, HOST, DB, COMMAND, TIME, STATE, INFO FROM INFORMATION_SCHEMA.PROCESSLIST"
52
53         rows, err := dbh.Query(sql)
54         if err != nil {
55                 log.Fatal(err)
56         }
57         defer rows.Close()
58
59         for rows.Next() {
60                 var r processlist_row
61                 if err := rows.Scan(
62                         &id,
63                         &user,
64                         &host,
65                         &db,
66                         &command,
67                         &time,
68                         &state,
69                         &info); err != nil {
70                         log.Fatal(err)
71                 }
72                 r.ID = uint64(id.Int64)
73                 r.USER = user.String
74                 r.HOST = host.String
75                 if db.Valid {
76                         r.DB = db.String
77                 }
78                 r.COMMAND = command.String
79                 r.TIME = uint64(time.Int64 * 1000000000000)
80                 if state.Valid {
81                         r.STATE = state.String
82                 }
83                 r.INFO = info.String
84                 t = append(t, r)
85         }
86         if err := rows.Err(); err != nil {
87                 log.Fatal(err)
88         }
89
90         return t
91 }
92
93 // describe a whole row
94 func (r processlist_row) String() string {
95         return fmt.Sprintf("FIXME otuput of i_s")
96 }
97
98 // describe a whole table
99 func (t processlist_rows) String() string {
100         return fmt.Sprintf("FIXME otuput of i_s")
101 }