sniffer-agent/vendor/github.com/zr-hebo/util-db/conn_info.go

94 lines
2.0 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package db
import (
"database/sql"
"fmt"
"reflect"
"regexp"
"runtime/debug"
"strings"
)
// GetMySQLConnInfoIgnoreErr 获取MySQL连接的字符串显示忽略错误信息
func GetMySQLConnInfoIgnoreErr(conn *sql.DB) (connInfo string) {
connInfo, _ = GetMySQLConnInfo(conn)
return
}
// GetMySQLConnInfo 获取MySQL连接的字符串显示
func GetMySQLConnInfo(conn *sql.DB) (connInfo string, err error) {
defer func() {
if panicRecover := recover(); panicRecover != nil {
err = fmt.Errorf(
"get mysql connection info failed for %v", panicRecover)
debug.PrintStack()
}
}()
cv := reflect.ValueOf(conn).Elem()
// fmt.Printf("%#v\n", cv)
dsnv := cv.FieldByName("dsn")
dsnStr := fmt.Sprint(dsnv)
dsnInfo, err := resolveDsn(dsnStr)
if err != nil {
return
}
fcsv := cv.FieldByName("dep")
// fmt.Printf("%#v\n", fcsv)
lports := make([]string, 0)
for _, key := range fcsv.MapKeys() {
// fcv := fcsv.Index(0).Elem()
depSet := fcsv.MapIndex(key).MapKeys()
if len(depSet) < 1 {
continue
}
fcv := depSet[0].Elem().Elem()
// fmt.Printf("%#v\n", fcv)
// fmt.Printf("%#v\n", fcv.Elem())
mc := fcv.FieldByName("ci").Elem().Elem()
// fmt.Printf("%#v", mc)
nc := mc.FieldByName("netConn").Elem().Elem()
// fmt.Printf("%#v", nc)
ic := nc.FieldByName("conn")
// fmt.Printf("%#v", conn)
fd := ic.FieldByName("fd").Elem()
// fmt.Printf("%#v", fd)
la := fd.FieldByName("laddr").Elem().Elem()
// fmt.Printf("%#v", la)
lport := la.FieldByName("Port")
lports = append(lports, fmt.Sprint(lport))
// fmt.Printf("%#v", lport)
}
connInfo = fmt.Sprintf(
"127.0.0.1:%s <==> %s:%s", strings.Join(lports, ", "),
dsnInfo["host"], dsnInfo["port"])
return
}
func resolveDsn(dsn string) (info map[string]string, err error) {
info = make(map[string]string)
pattern := regexp.MustCompile(`.*:.*@tcp\((?P<host>[\w.]+):(?P<port>\d+)\)/`)
match := pattern.FindStringSubmatch(dsn)
for idx, name := range pattern.SubexpNames() {
if idx > 0 && idx <= len(match) {
info[name] = match[idx]
}
}
return
}