X-Git-Url: http://git.iain.cx/?a=blobdiff_plain;f=i_s%2Fprocesslist%2Fprivate.go;fp=i_s%2Fprocesslist%2Fprivate.go;h=fe1792ae1ede1621667768ce0471ef7254abafb3;hb=c5eb0ee3c462a88cd96a8095063aae6117fce992;hp=0000000000000000000000000000000000000000;hpb=4d5f13104def6d48d9c32d701e9e0fd574e37a46;p=pstop.git diff --git a/i_s/processlist/private.go b/i_s/processlist/private.go new file mode 100644 index 0000000..fe1792a --- /dev/null +++ b/i_s/processlist/private.go @@ -0,0 +1,101 @@ +// This file contains the library routines for managing the +// table_io_waits_by_table table. +package processlist + +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 table_row struct { + ID uint64 + USER string + HOST string + DB string + COMMAND string + TIME uint64 + STATE string + INFO string +} +type table_rows []table_row + +// get the output of I_S.PROCESSLIST +func select_processlist(dbh *sql.DB) table_rows { + var t table_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 table_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) + 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 table_row) String() string { + return fmt.Sprintf("FIXME otuput of i_s") +} + +// describe a whole table +func (t table_rows) String() string { + return fmt.Sprintf("FIXME otuput of i_s") +}