Files
mayfly-go/server/internal/db/dbm/mysql/meta.go

69 lines
1.7 KiB
Go
Raw Normal View History

package mysql
import (
"context"
"database/sql"
"fmt"
"mayfly-go/internal/db/dbm/dbi"
2024-12-08 13:04:23 +08:00
"mayfly-go/pkg/utils/collx"
"net"
"github.com/go-sql-driver/mysql"
)
func init() {
meta := new(Meta)
2024-12-08 13:04:23 +08:00
dbi.Register(DbTypeMysql, meta)
dbi.Register(DbTypeMariadb, meta)
}
2024-12-08 13:04:23 +08:00
const (
DbTypeMysql dbi.DbType = "mysql"
DbTypeMariadb dbi.DbType = "mariadb"
)
type Meta struct {
}
func (mm *Meta) 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)
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
2024-12-08 13:04:23 +08:00
dsn := fmt.Sprintf("%s:%s@%s(%s:%d)/%s?parseTime=true&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 (mm *Meta) GetDialect(conn *dbi.DbConn) dbi.Dialect {
2024-03-15 13:31:53 +08:00
return &MysqlDialect{dc: conn}
}
func (mm *Meta) GetMetadata(conn *dbi.DbConn) dbi.Metadata {
return &MysqlMetadata{dc: conn}
}
2024-12-08 13:04:23 +08:00
func (mm *Meta) GetDbDataTypes() []*dbi.DbDataType {
return collx.AsArray(
UnsignedBigint, Bigint, Tinyint, Smallint, Int, Bit, Float, Double, Decimal,
Varchar, Char, Text, Longtext, Mediumtext,
Datetime, Date, Time, Timestamp,
Enum, JSON, Set,
Binary, Blob, Longblob, Mediumblob, Varbinary,
)
}
func (mm *Meta) GetCommonTypeConverter() dbi.CommonTypeConverter {
return &commonTypeConverter{}
}