From 7e9a381641b4d5b870174dfef03333798771046e Mon Sep 17 00:00:00 2001 From: "meilin.huang" <954537473@qq.com> Date: Wed, 24 Jan 2024 17:01:17 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E6=95=B0=E6=8D=AE=E5=BA=93meta?= =?UTF-8?q?=E4=BD=BF=E7=94=A8=E6=B3=A8=E5=86=8C=E6=96=B9=E5=BC=8F=EF=BC=8C?= =?UTF-8?q?=E6=96=B9=E4=BE=BF=E5=8F=AF=E6=8F=92=E6=8B=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/internal/db/dbm/dbi/dialect.go | 1 + server/internal/db/dbm/dbi/meta.go | 14 +++++++++++ server/internal/db/dbm/dbm.go | 29 +++++----------------- server/internal/db/dbm/dm/dialect.go | 9 ++++--- server/internal/db/dbm/dm/meta.go | 13 ++-------- server/internal/db/dbm/mysql/dialect.go | 8 +++--- server/internal/db/dbm/mysql/meta.go | 15 +++-------- server/internal/db/dbm/oracle/dialect.go | 8 +++--- server/internal/db/dbm/oracle/meta.go | 13 ++-------- server/internal/db/dbm/postgres/dialect.go | 8 +++--- server/internal/db/dbm/postgres/meta.go | 13 ++-------- server/internal/db/dbm/sqlite/dialect.go | 8 +++--- server/internal/db/dbm/sqlite/meta.go | 13 ++-------- server/pkg/ioc/ioc.go | 2 +- 14 files changed, 55 insertions(+), 99 deletions(-) diff --git a/server/internal/db/dbm/dbi/dialect.go b/server/internal/db/dbm/dbi/dialect.go index 21a3d3f8..35373cea 100644 --- a/server/internal/db/dbm/dbi/dialect.go +++ b/server/internal/db/dbm/dbi/dialect.go @@ -115,6 +115,7 @@ type Dialect interface { // 批量保存数据 BatchInsert(tx *sql.Tx, tableName string, columns []string, values [][]any) (int64, error) + // 获取数据转换器用于解析格式化列数据等 GetDataConverter() DataConverter CopyTable(copy *DbCopyTable) error diff --git a/server/internal/db/dbm/dbi/meta.go b/server/internal/db/dbm/dbi/meta.go index 3cedb0dc..d7b1a0ac 100644 --- a/server/internal/db/dbm/dbi/meta.go +++ b/server/internal/db/dbm/dbi/meta.go @@ -2,6 +2,20 @@ package dbi import "database/sql" +var ( + metas map[DbType]Meta = make(map[DbType]Meta) +) + +// 注册数据库类型与dbmeta +func Register(dt DbType, meta Meta) { + metas[dt] = meta +} + +// 根据数据库类型获取对应的Meta +func GetMeta(dt DbType) Meta { + return metas[dt] +} + // 数据库元信息获取,如获取sql.DB、Dialect等 type Meta interface { // 根据数据库信息获取sql.DB diff --git a/server/internal/db/dbm/dbm.go b/server/internal/db/dbm/dbm.go index 241f5f2d..3dc2bf57 100644 --- a/server/internal/db/dbm/dbm.go +++ b/server/internal/db/dbm/dbm.go @@ -4,11 +4,11 @@ import ( "fmt" "mayfly-go/internal/common/consts" "mayfly-go/internal/db/dbm/dbi" - "mayfly-go/internal/db/dbm/dm" - "mayfly-go/internal/db/dbm/mysql" - "mayfly-go/internal/db/dbm/oracle" - "mayfly-go/internal/db/dbm/postgres" - "mayfly-go/internal/db/dbm/sqlite" + _ "mayfly-go/internal/db/dbm/dm" + _ "mayfly-go/internal/db/dbm/mysql" + _ "mayfly-go/internal/db/dbm/oracle" + _ "mayfly-go/internal/db/dbm/postgres" + _ "mayfly-go/internal/db/dbm/sqlite" "mayfly-go/internal/machine/mcm" "mayfly-go/pkg/cache" "mayfly-go/pkg/logx" @@ -39,23 +39,6 @@ func init() { var mutex sync.Mutex -func getDbMetaByType(dt dbi.DbType) dbi.Meta { - switch dt { - case dbi.DbTypeMysql, dbi.DbTypeMariadb: - return mysql.GetMeta() - case dbi.DbTypePostgres: - return postgres.GetMeta() - case dbi.DbTypeDM: - return dm.GetMeta() - case dbi.DbTypeOracle: - return oracle.GetMeta() - case dbi.DbTypeSqlite: - return sqlite.GetMeta() - default: - panic(fmt.Sprintf("invalid database type: %s", dt)) - } -} - // 从缓存中获取数据库连接信息,若缓存中不存在则会使用回调函数获取dbInfo进行连接并缓存 func GetDbConn(dbId uint64, database string, getDbInfo func() (*dbi.DbInfo, error)) (*dbi.DbConn, error) { connId := dbi.GetDbConnId(dbId, database) @@ -92,7 +75,7 @@ func GetDbConn(dbId uint64, database string, getDbInfo func() (*dbi.DbInfo, erro // 使用指定dbInfo信息进行连接 func Conn(di *dbi.DbInfo) (*dbi.DbConn, error) { - return di.Conn(getDbMetaByType(di.Type)) + return di.Conn(dbi.GetMeta(di.Type)) } // 根据实例id获取连接 diff --git a/server/internal/db/dbm/dm/dialect.go b/server/internal/db/dbm/dm/dialect.go index 085d575c..f146ea2a 100644 --- a/server/internal/db/dbm/dm/dialect.go +++ b/server/internal/db/dbm/dm/dialect.go @@ -4,7 +4,6 @@ import ( "context" "database/sql" "fmt" - "github.com/kanzihuang/vitess/go/vt/sqlparser" "mayfly-go/internal/db/dbm/dbi" "mayfly-go/pkg/errorx" "mayfly-go/pkg/logx" @@ -15,6 +14,8 @@ import ( "strings" "time" + "github.com/kanzihuang/vitess/go/vt/sqlparser" + _ "gitee.com/chunanyong/dm" ) @@ -291,13 +292,13 @@ func (dd *DMDialect) BatchInsert(tx *sql.Tx, tableName string, columns []string, return int64(effRows), nil } -type DataConverter struct { -} - func (dd *DMDialect) GetDataConverter() dbi.DataConverter { return new(DataConverter) } +type DataConverter struct { +} + func (dd *DataConverter) GetDataType(dbColumnType string) dbi.DataType { if numberRegexp.MatchString(dbColumnType) { return dbi.DataTypeNumber diff --git a/server/internal/db/dbm/dm/meta.go b/server/internal/db/dbm/dm/meta.go index 784aea9b..7d49efd2 100644 --- a/server/internal/db/dbm/dm/meta.go +++ b/server/internal/db/dbm/dm/meta.go @@ -6,19 +6,10 @@ import ( "mayfly-go/internal/db/dbm/dbi" "net/url" "strings" - "sync" ) -var ( - meta dbi.Meta - once sync.Once -) - -func GetMeta() dbi.Meta { - once.Do(func() { - meta = new(DmMeta) - }) - return meta +func init() { + dbi.Register(dbi.DbTypeDM, new(DmMeta)) } type DmMeta struct { diff --git a/server/internal/db/dbm/mysql/dialect.go b/server/internal/db/dbm/mysql/dialect.go index 5eb4632f..342d6f77 100644 --- a/server/internal/db/dbm/mysql/dialect.go +++ b/server/internal/db/dbm/mysql/dialect.go @@ -202,6 +202,10 @@ func (md *MysqlDialect) BatchInsert(tx *sql.Tx, tableName string, columns []stri return md.dc.TxExec(tx, sqlStr, args...) } +func (md *MysqlDialect) GetDataConverter() dbi.DataConverter { + return new(DataConverter) +} + var ( // 数字类型 numberRegexp = regexp.MustCompile(`(?i)int|double|float|number|decimal|byte|bit`) @@ -216,10 +220,6 @@ var ( type DataConverter struct { } -func (md *MysqlDialect) GetDataConverter() dbi.DataConverter { - return new(DataConverter) -} - func (dc *DataConverter) GetDataType(dbColumnType string) dbi.DataType { if numberRegexp.MatchString(dbColumnType) { return dbi.DataTypeNumber diff --git a/server/internal/db/dbm/mysql/meta.go b/server/internal/db/dbm/mysql/meta.go index 31c6b381..0ce1719b 100644 --- a/server/internal/db/dbm/mysql/meta.go +++ b/server/internal/db/dbm/mysql/meta.go @@ -6,21 +6,14 @@ import ( "fmt" "mayfly-go/internal/db/dbm/dbi" "net" - "sync" "github.com/go-sql-driver/mysql" ) -var ( - meta dbi.Meta - once sync.Once -) - -func GetMeta() dbi.Meta { - once.Do(func() { - meta = new(MysqlMeta) - }) - return meta +func init() { + meta := new(MysqlMeta) + dbi.Register(dbi.DbTypeMysql, meta) + dbi.Register(dbi.DbTypeMariadb, meta) } type MysqlMeta struct { diff --git a/server/internal/db/dbm/oracle/dialect.go b/server/internal/db/dbm/oracle/dialect.go index 8b01e0f7..766818c4 100644 --- a/server/internal/db/dbm/oracle/dialect.go +++ b/server/internal/db/dbm/oracle/dialect.go @@ -292,6 +292,10 @@ func (od *OracleDialect) BatchInsert(tx *sql.Tx, tableName string, columns []str return res, err } +func (od *OracleDialect) GetDataConverter() dbi.DataConverter { + return new(DataConverter) +} + var ( // 数字类型 numberTypeRegexp = regexp.MustCompile(`(?i)int|double|float|number|decimal|byte|bit`) @@ -302,10 +306,6 @@ var ( type DataConverter struct { } -func (od *OracleDialect) GetDataConverter() dbi.DataConverter { - return new(DataConverter) -} - func (dc *DataConverter) GetDataType(dbColumnType string) dbi.DataType { if numberTypeRegexp.MatchString(dbColumnType) { return dbi.DataTypeNumber diff --git a/server/internal/db/dbm/oracle/meta.go b/server/internal/db/dbm/oracle/meta.go index d4928e2f..ab62f1eb 100644 --- a/server/internal/db/dbm/oracle/meta.go +++ b/server/internal/db/dbm/oracle/meta.go @@ -5,21 +5,12 @@ import ( "fmt" "mayfly-go/internal/db/dbm/dbi" "strings" - "sync" go_ora "github.com/sijms/go-ora/v2" ) -var ( - meta dbi.Meta - once sync.Once -) - -func GetMeta() dbi.Meta { - once.Do(func() { - meta = new(OraMeta) - }) - return meta +func init() { + dbi.Register(dbi.DbTypeOracle, new(OraMeta)) } type OraMeta struct { diff --git a/server/internal/db/dbm/postgres/dialect.go b/server/internal/db/dbm/postgres/dialect.go index 646b66b6..ce00c6e7 100644 --- a/server/internal/db/dbm/postgres/dialect.go +++ b/server/internal/db/dbm/postgres/dialect.go @@ -222,6 +222,10 @@ func (md *PgsqlDialect) BatchInsert(tx *sql.Tx, tableName string, columns []stri return md.dc.TxExec(tx, sqlStr, args...) } +func (md *PgsqlDialect) GetDataConverter() dbi.DataConverter { + return new(DataConverter) +} + var ( // 数字类型 numberRegexp = regexp.MustCompile(`(?i)int|double|float|number|decimal|byte|bit`) @@ -236,10 +240,6 @@ var ( type DataConverter struct { } -func (md *PgsqlDialect) GetDataConverter() dbi.DataConverter { - return new(DataConverter) -} - func (dc *DataConverter) GetDataType(dbColumnType string) dbi.DataType { if numberRegexp.MatchString(dbColumnType) { return dbi.DataTypeNumber diff --git a/server/internal/db/dbm/postgres/meta.go b/server/internal/db/dbm/postgres/meta.go index 48ce7102..56b1f004 100644 --- a/server/internal/db/dbm/postgres/meta.go +++ b/server/internal/db/dbm/postgres/meta.go @@ -9,22 +9,13 @@ import ( "mayfly-go/pkg/utils/netx" "net" "strings" - "sync" "time" pq "gitee.com/liuzongyang/libpq" ) -var ( - meta dbi.Meta - once sync.Once -) - -func GetMeta() dbi.Meta { - once.Do(func() { - meta = new(PostgresMeta) - }) - return meta +func init() { + dbi.Register(dbi.DbTypePostgres, new(PostgresMeta)) } type PostgresMeta struct { diff --git a/server/internal/db/dbm/sqlite/dialect.go b/server/internal/db/dbm/sqlite/dialect.go index 95780094..8bbb94d0 100644 --- a/server/internal/db/dbm/sqlite/dialect.go +++ b/server/internal/db/dbm/sqlite/dialect.go @@ -221,6 +221,10 @@ func (sd *SqliteDialect) BatchInsert(tx *sql.Tx, tableName string, columns []str return sd.dc.TxExec(tx, sqlStr, args...) } +func (sd *SqliteDialect) GetDataConverter() dbi.DataConverter { + return new(DataConverter) +} + var ( // 数字类型 numberRegexp = regexp.MustCompile(`(?i)int|double|float|number|decimal|byte|bit|real`) @@ -231,10 +235,6 @@ var ( type DataConverter struct { } -func (sd *SqliteDialect) GetDataConverter() dbi.DataConverter { - return new(DataConverter) -} - func (dc *DataConverter) GetDataType(dbColumnType string) dbi.DataType { if numberRegexp.MatchString(dbColumnType) { return dbi.DataTypeNumber diff --git a/server/internal/db/dbm/sqlite/meta.go b/server/internal/db/dbm/sqlite/meta.go index 604e1f10..b13034ab 100644 --- a/server/internal/db/dbm/sqlite/meta.go +++ b/server/internal/db/dbm/sqlite/meta.go @@ -5,19 +5,10 @@ import ( "errors" "mayfly-go/internal/db/dbm/dbi" "os" - "sync" ) -var ( - meta dbi.Meta - once sync.Once -) - -func GetMeta() dbi.Meta { - once.Do(func() { - meta = new(SqliteMeta) - }) - return meta +func init() { + dbi.Register(dbi.DbTypeSqlite, new(SqliteMeta)) } type SqliteMeta struct { diff --git a/server/pkg/ioc/ioc.go b/server/pkg/ioc/ioc.go index d7f7d2c8..40cddbf2 100644 --- a/server/pkg/ioc/ioc.go +++ b/server/pkg/ioc/ioc.go @@ -26,7 +26,7 @@ func (c *Container) Register(bean any, opts ...ComponentOption) { componentName := component.Name cType := structx.IndirectType(reflect.TypeOf(component.Value)) - // 组件名为空,则去组件类型名称作为组件名 + // 组件名为空,则取组件类型名称作为组件名 if componentName == "" { componentName = cType.Name() component.Name = componentName