2024-01-12 13:15:30 +08:00
|
|
|
|
package dm
|
|
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
|
"database/sql"
|
|
|
|
|
|
"fmt"
|
|
|
|
|
|
"mayfly-go/internal/db/dbm/dbi"
|
2024-12-08 13:04:23 +08:00
|
|
|
|
"mayfly-go/pkg/utils/collx"
|
2024-01-19 08:59:35 +00:00
|
|
|
|
"net/url"
|
2024-01-12 13:15:30 +08:00
|
|
|
|
"strings"
|
|
|
|
|
|
)
|
|
|
|
|
|
|
2024-01-24 17:01:17 +08:00
|
|
|
|
func init() {
|
2024-12-08 13:04:23 +08:00
|
|
|
|
dbi.Register(DbTypeDM, new(Meta))
|
2024-01-12 13:15:30 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2024-12-08 13:04:23 +08:00
|
|
|
|
const (
|
|
|
|
|
|
DbTypeDM dbi.DbType = "dm"
|
|
|
|
|
|
)
|
|
|
|
|
|
|
2024-10-20 03:52:23 +00:00
|
|
|
|
type Meta struct {
|
2024-01-12 13:15:30 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
2024-10-20 03:52:23 +00:00
|
|
|
|
func (dm *Meta) GetSqlDb(d *dbi.DbInfo) (*sql.DB, error) {
|
2024-01-12 13:15:30 +08:00
|
|
|
|
driverName := "dm"
|
|
|
|
|
|
db := d.Database
|
|
|
|
|
|
var dbParam string
|
|
|
|
|
|
if db != "" {
|
|
|
|
|
|
// dm database可以使用db/schema表示,方便连接指定schema, 若不存在schema则使用默认schema
|
|
|
|
|
|
ss := strings.Split(db, "/")
|
|
|
|
|
|
if len(ss) > 1 {
|
2024-01-19 08:59:35 +00:00
|
|
|
|
dbParam = fmt.Sprintf("%s?schema=\"%s\"&escapeProcess=true", ss[0], ss[len(ss)-1])
|
2024-01-12 13:15:30 +08:00
|
|
|
|
} else {
|
2024-01-19 08:59:35 +00:00
|
|
|
|
dbParam = db + "?escapeProcess=true"
|
2024-01-12 13:15:30 +08:00
|
|
|
|
}
|
2024-01-19 08:59:35 +00:00
|
|
|
|
} else {
|
|
|
|
|
|
dbParam = "?escapeProcess=true"
|
2024-01-12 13:15:30 +08:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
err := d.IfUseSshTunnelChangeIpPort()
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
return nil, err
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2024-01-19 08:59:35 +00:00
|
|
|
|
dsn := fmt.Sprintf("dm://%s:%s@%s:%d/%s", d.Username, url.PathEscape(d.Password), d.Host, d.Port, dbParam)
|
2024-01-12 13:15:30 +08:00
|
|
|
|
return sql.Open(driverName, dsn)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2024-10-20 03:52:23 +00:00
|
|
|
|
func (dm *Meta) GetDialect(conn *dbi.DbConn) dbi.Dialect {
|
2024-03-15 13:31:53 +08:00
|
|
|
|
return &DMDialect{dc: conn}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
2024-11-01 17:27:22 +08:00
|
|
|
|
func (dm *Meta) GetMetadata(conn *dbi.DbConn) dbi.Metadata {
|
|
|
|
|
|
return &DMMetadata{
|
2024-03-15 13:31:53 +08:00
|
|
|
|
dc: conn,
|
2024-11-01 17:27:22 +08:00
|
|
|
|
}
|
2024-01-12 13:15:30 +08:00
|
|
|
|
}
|
2024-12-08 13:04:23 +08:00
|
|
|
|
|
|
|
|
|
|
func (sm *Meta) GetDbDataTypes() []*dbi.DbDataType {
|
|
|
|
|
|
return collx.AsArray[*dbi.DbDataType](CHAR, VARCHAR, TEXT, LONG, LONGVARCHAR, IMAGE, LONGVARBINARY, CLOB,
|
|
|
|
|
|
BLOB,
|
|
|
|
|
|
NUMERIC, DECIMAL, NUMBER, INTEGER, INT, BIGINT, TINYINT, BYTE, SMALLINT, BIT, DOUBLE, FLOAT,
|
|
|
|
|
|
TIME, DATE, TIMESTAMP,
|
|
|
|
|
|
ST_CURVE, ST_LINESTRING, ST_GEOMCOLLECTION, ST_GEOMETRY, ST_MULTICURVE, ST_MULTILINESTRING,
|
|
|
|
|
|
ST_MULTIPOINT, ST_MULTIPOLYGON, ST_MULTISURFACE, ST_POINT, ST_POLYGON, ST_SURFACE,
|
|
|
|
|
|
)
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
func (mm *Meta) GetCommonTypeConverter() dbi.CommonTypeConverter {
|
|
|
|
|
|
return &commonTypeConverter{}
|
|
|
|
|
|
}
|