Skip to content

Commit bdfa3de

Browse files
committed
More fixing in #542
1 parent 6e1d4bd commit bdfa3de

File tree

1 file changed

+41
-16
lines changed

1 file changed

+41
-16
lines changed

utils/dbhelper/dbhelper.go

+41-16
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,7 @@ type Processlist struct {
142142
Db sql.NullString `json:"db" db:"db"`
143143
Command string `json:"command" db:"Command"`
144144
Time sql.NullFloat64 `json:"time" db:"Time"`
145+
TimeMs sql.NullFloat64 `json:"timeMs" db:"Time_ms"`
145146
State sql.NullString `json:"state" db:"State"`
146147
Info sql.NullString `json:"info" db:"Info"`
147148
Progress sql.NullFloat64 `json:"progress" db:"Progress"`
@@ -388,6 +389,26 @@ func GetBinaryLogs(db *sqlx.DB, version *MySQLVersion) (map[string]uint, string,
388389
return vars, query, nil
389390
}
390391

392+
func AnalyzeQuery(db *sqlx.DB, version *MySQLVersion, schema string, query string) (string, string, error) {
393+
var res string
394+
if schema != "" {
395+
db.Exec("USE " + schema)
396+
}
397+
stmt := "ANALYZE FORMAT=JSON " + query
398+
rows, err := db.Query(stmt)
399+
if err != nil {
400+
return "", stmt, err
401+
}
402+
defer rows.Close()
403+
404+
if rows.Next() {
405+
if err := rows.Scan(&res); err != nil {
406+
return res, stmt, err
407+
}
408+
}
409+
return res, stmt, err
410+
}
411+
391412
func GetProcesslistTable(db *sqlx.DB, version *MySQLVersion) ([]Processlist, string, error) {
392413
pl := []Processlist{}
393414
var err error
@@ -412,24 +433,28 @@ func GetProcesslistTable(db *sqlx.DB, version *MySQLVersion) ([]Processlist, str
412433
return pl, stmt, nil
413434
}
414435

415-
func AnalyzeQuery(db *sqlx.DB, version *MySQLVersion, schema string, query string) (string, string, error) {
416-
var res string
417-
if schema != "" {
418-
db.Exec("USE " + schema)
436+
func GetProcesslistTableFromUser(db *sqlx.DB, version *MySQLVersion, user string) ([]Processlist, string, error) {
437+
pl := []Processlist{}
438+
var err error
439+
stmt := ""
440+
if version.IsMariaDB() {
441+
//MariaDB
442+
stmt = "SELECT Id, User, Host, `Db` AS `db`, Command, Time_ms as Time, State, SUBSTRING(COALESCE(INFO_BINARY,''),1,1000) as Info, CASE WHEN Max_Stage < 2 THEN Progress ELSE (Stage-1)/Max_Stage*100+Progress/Max_Stage END AS Progress FROM INFORMATION_SCHEMA.PROCESSLIST WHERE User='+ user +'"
443+
} else if version.IsMySQLOrPercona() {
444+
//MySQL
445+
stmt = "SELECT Id, User, Host, `Db` AS `db`, Command, Time as Time, State, SUBSTRING(COALESCE(INFO,''),1,1000) as Info ,0 as Progress FROM INFORMATION_SCHEMA.PROCESSLIST WHERE User='+ user +'"
446+
if version.GreaterEqual("8.0") {
447+
stmt = "SELECT Id, User, Host, `Db` AS `db`, Command, Time_ms as Time, State, SUBSTRING(COALESCE(INFO,''),1,1000) as Info ,0 as Progress FROM INFORMATION_SCHEMA.PROCESSLIST WHERE User='+ user +'"
448+
}
449+
} else if version.IsPPostgreSQL() {
450+
// WHERE state <> 'idle' AND pid<>pg_backend_pid()
451+
stmt = `SELECT pid as "Id", coalesce(usename,'') as "User",coalesce(client_hostname || client_port,'') as "Host" , coalesce(datname,'') as db , coalesce(query,'') as "Command", extract(epoch from NOW()) - extract(epoch from query_start) as "Time", coalesce(state,'') as "State",COALESCE(application_name,'') as "Info" ,0 as "Progress" FROM pg_stat_activity`
419452
}
420-
stmt := "ANALYZE FORMAT=JSON " + query
421-
rows, err := db.Query(stmt)
453+
err = db.Select(&pl, stmt)
422454
if err != nil {
423-
return "", stmt, err
424-
}
425-
defer rows.Close()
426-
427-
if rows.Next() {
428-
if err := rows.Scan(&res); err != nil {
429-
return res, stmt, err
430-
}
455+
return nil, stmt, fmt.Errorf("ERROR: Could not get processlist: %s", err)
431456
}
432-
return res, stmt, err
457+
return pl, stmt, nil
433458
}
434459

435460
func GetProcesslist(db *sqlx.DB, version *MySQLVersion) ([]Processlist, string, error) {
@@ -751,7 +776,7 @@ func GetHostFromProcessList(db *sqlx.DB, user string, version *MySQLVersion) (st
751776
pl := []Processlist{}
752777
var err error
753778
logs := ""
754-
pl, logs, err = GetProcesslist(db, version)
779+
pl, logs, err = GetProcesslistTableFromUser(db, version, user)
755780
if err != nil {
756781
return "N/A", logs, err
757782
}

0 commit comments

Comments
 (0)