+// This file contains the library routines for managing the
+// table_io_waits_by_table table.
+package i_s
+
+import (
+ "database/sql"
+ "fmt"
+ "log"
+)
+
+/*
+root@localhost [i_s]> show create table i_s\G
+*************************** 1. row ***************************
+CREATE TEMPORARY TABLE `PROCESSLIST` (
+ `ID` bigint(21) unsigned NOT NULL DEFAULT '0',
+ `USER` varchar(16) NOT NULL DEFAULT '',
+ `HOST` varchar(64) NOT NULL DEFAULT '',
+ `DB` varchar(64) DEFAULT NULL, `COMMAND` varchar(16) NOT NULL DEFAULT '', `TIME` int(7) NOT NULL DEFAULT '0', `STATE` varchar(64) DEFAULT NULL,
+ `INFO` longtext
+) ENGINE=MyISAM DEFAULT CHARSET=utf8
+1 row in set (0.02 sec)
+*/
+
+// a row from information_schema.processlist
+type processlist_row struct {
+ ID uint64
+ USER string
+ HOST string
+ DB string
+ COMMAND string
+ TIME uint64
+ STATE string
+ INFO string
+}
+type processlist_rows []processlist_row
+
+// get the output of I_S.PROCESSLIST
+func select_processlist(dbh *sql.DB) processlist_rows {
+ var t processlist_rows
+ var id sql.NullInt64
+ var user sql.NullString
+ var host sql.NullString
+ var db sql.NullString
+ var command sql.NullString
+ var time sql.NullInt64
+ var state sql.NullString
+ var info sql.NullString
+
+ // we collect all information even if it's mainly empty as we may reference it later
+
+ sql := "SELECT ID, USER, HOST, DB, COMMAND, TIME, STATE, INFO FROM INFORMATION_SCHEMA.PROCESSLIST"
+
+ rows, err := dbh.Query(sql)
+ if err != nil {
+ log.Fatal(err)
+ }
+ defer rows.Close()
+
+ for rows.Next() {
+ var r processlist_row
+ if err := rows.Scan(
+ &id,
+ &user,
+ &host,
+ &db,
+ &command,
+ &time,
+ &state,
+ &info); err != nil {
+ log.Fatal(err)
+ }
+ r.ID = uint64(id.Int64)
+ r.USER = user.String
+ r.HOST = host.String
+ if db.Valid {
+ r.DB = db.String
+ }
+ r.COMMAND = command.String
+ r.TIME = uint64(time.Int64 * 1000000000000)
+ if state.Valid {
+ r.STATE = state.String
+ }
+ r.INFO = info.String
+ t = append(t, r)
+ }
+ if err := rows.Err(); err != nil {
+ log.Fatal(err)
+ }
+
+ return t
+}
+
+// describe a whole row
+func (r processlist_row) String() string {
+ return fmt.Sprintf("FIXME otuput of i_s")
+}
+
+// describe a whole table
+func (t processlist_rows) String() string {
+ return fmt.Sprintf("FIXME otuput of i_s")
+}