2024-01-12 13:15:30 +08:00
|
|
|
|
package mysql
|
|
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
|
"context"
|
|
|
|
|
|
"database/sql"
|
|
|
|
|
|
"fmt"
|
|
|
|
|
|
"mayfly-go/internal/db/dbm/dbi"
|
|
|
|
|
|
"net"
|
|
|
|
|
|
|
|
|
|
|
|
"github.com/go-sql-driver/mysql"
|
|
|
|
|
|
)
|
|
|
|
|
|
|
2024-01-24 17:01:17 +08:00
|
|
|
|
func init() {
|
|
|
|
|
|
meta := new(MysqlMeta)
|
|
|
|
|
|
dbi.Register(dbi.DbTypeMysql, meta)
|
|
|
|
|
|
dbi.Register(dbi.DbTypeMariadb, meta)
|
2024-01-12 13:15:30 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
type MysqlMeta struct {
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
func (md *MysqlMeta) GetSqlDb(d *dbi.DbInfo) (*sql.DB, error) {
|
|
|
|
|
|
// SSH Conect
|
|
|
|
|
|
if d.SshTunnelMachineId > 0 {
|
2024-01-13 13:38:53 +08:00
|
|
|
|
sshTunnelMachine, err := dbi.GetSshTunnel(d.SshTunnelMachineId)
|
2024-01-12 13:15:30 +08:00
|
|
|
|
if err != nil {
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
}
|
|
|
|
|
|
mysql.RegisterDialContext(d.Network, func(ctx context.Context, addr string) (net.Conn, error) {
|
|
|
|
|
|
return sshTunnelMachine.GetDialConn("tcp", addr)
|
|
|
|
|
|
})
|
|
|
|
|
|
}
|
|
|
|
|
|
// 设置dataSourceName -> 更多参数参考:https://github.com/go-sql-driver/mysql#dsn-data-source-name
|
|
|
|
|
|
dsn := fmt.Sprintf("%s:%s@%s(%s:%d)/%s?timeout=8s", d.Username, d.Password, d.Network, d.Host, d.Port, d.Database)
|
|
|
|
|
|
if d.Params != "" {
|
|
|
|
|
|
dsn = fmt.Sprintf("%s&%s", dsn, d.Params)
|
|
|
|
|
|
}
|
|
|
|
|
|
const driverName = "mysql"
|
|
|
|
|
|
return sql.Open(driverName, dsn)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
func (md *MysqlMeta) GetDialect(conn *dbi.DbConn) dbi.Dialect {
|
|
|
|
|
|
return &MysqlDialect{conn}
|
|
|
|
|
|
}
|