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

72 lines
1.7 KiB
Go
Raw Normal View History

package dm
import (
2025-05-22 23:29:50 +08:00
"context"
"database/sql"
"fmt"
"mayfly-go/internal/db/dbm/dbi"
2024-12-08 13:04:23 +08:00
"mayfly-go/pkg/utils/collx"
"net/url"
"strings"
)
func init() {
2024-12-08 13:04:23 +08:00
dbi.Register(DbTypeDM, new(Meta))
}
2024-12-08 13:04:23 +08:00
const (
DbTypeDM dbi.DbType = "dm"
)
type Meta struct {
}
2025-05-22 23:29:50 +08:00
func (dm *Meta) GetSqlDb(ctx context.Context, d *dbi.DbInfo) (*sql.DB, error) {
driverName := "dm"
db := d.Database
dbParam := "?escapeProcess=true"
if db != "" {
// dm database可以使用db/schema表示方便连接指定schema, 若不存在schema则使用默认schema
ss := strings.Split(db, "/")
if len(ss) > 1 {
dbParam = fmt.Sprintf("%s&schema=\"%s\"", dbParam, ss[len(ss)-1])
}
}
if d.Params != "" {
dbParam += "&" + d.Params
}
2025-05-22 23:29:50 +08:00
err := d.IfUseSshTunnelChangeIpPort(ctx)
if err != nil {
return nil, err
}
2025-09-14 20:53:47 +08:00
dsn := fmt.Sprintf("dm://%s:%s@%s:%d%s", d.Username, url.PathEscape(d.Password), d.Host, d.Port, dbParam)
return sql.Open(driverName, dsn)
}
func (dm *Meta) GetDialect(conn *dbi.DbConn) dbi.Dialect {
2024-03-15 13:31:53 +08:00
return &DMDialect{dc: conn}
}
func (dm *Meta) GetMetadata(conn *dbi.DbConn) dbi.Metadata {
return &DMMetadata{
2024-03-15 13:31:53 +08:00
dc: conn,
}
}
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, DATETIME,
2024-12-08 13:04:23 +08:00
ST_CURVE, ST_LINESTRING, ST_GEOMCOLLECTION, ST_GEOMETRY, ST_MULTICURVE, ST_MULTILINESTRING,
ST_MULTIPOINT, ST_MULTIPOLYGON, ST_MULTISURFACE, ST_POINT, ST_POLYGON, ST_SURFACE,
TABLES,
2024-12-08 13:04:23 +08:00
)
}
func (mm *Meta) GetCommonTypeConverter() dbi.CommonTypeConverter {
return &commonTypeConverter{}
}