mirror of
https://gitee.com/dromara/mayfly-go
synced 2025-11-04 00:10:25 +08:00
refactor: code review
This commit is contained in:
@@ -1,5 +1,5 @@
|
|||||||
<template>
|
<template>
|
||||||
<el-input v-model="cron" placeholder="可点击左边按钮进行可视化配置">
|
<el-input v-model="cron" placeholder="可点击左边按钮配置">
|
||||||
<template #prepend>
|
<template #prepend>
|
||||||
<el-button @click="showCron = true" icon="Pointer"></el-button>
|
<el-button @click="showCron = true" icon="Pointer"></el-button>
|
||||||
</template>
|
</template>
|
||||||
|
|||||||
@@ -363,7 +363,7 @@ export class DbInst {
|
|||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
if (!dbDialect) {
|
if (!dbDialect) {
|
||||||
return `${value}`;
|
return `'${value}'`;
|
||||||
}
|
}
|
||||||
return dbDialect.wrapStrValue(columnType, value);
|
return dbDialect.wrapStrValue(columnType, value);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,6 +31,7 @@ require (
|
|||||||
go.mongodb.org/mongo-driver v1.13.1 // mongo
|
go.mongodb.org/mongo-driver v1.13.1 // mongo
|
||||||
golang.org/x/crypto v0.18.0 // ssh
|
golang.org/x/crypto v0.18.0 // ssh
|
||||||
golang.org/x/oauth2 v0.15.0
|
golang.org/x/oauth2 v0.15.0
|
||||||
|
golang.org/x/sync v0.6.0
|
||||||
gopkg.in/natefinch/lumberjack.v2 v2.2.1
|
gopkg.in/natefinch/lumberjack.v2 v2.2.1
|
||||||
gopkg.in/yaml.v3 v3.0.1
|
gopkg.in/yaml.v3 v3.0.1
|
||||||
// gorm
|
// gorm
|
||||||
@@ -84,7 +85,6 @@ require (
|
|||||||
golang.org/x/exp v0.0.0-20230519143937-03e91628a987 // indirect
|
golang.org/x/exp v0.0.0-20230519143937-03e91628a987 // indirect
|
||||||
golang.org/x/image v0.13.0 // indirect
|
golang.org/x/image v0.13.0 // indirect
|
||||||
golang.org/x/net v0.19.0 // indirect
|
golang.org/x/net v0.19.0 // indirect
|
||||||
golang.org/x/sync v0.1.0 // indirect
|
|
||||||
golang.org/x/sys v0.16.0 // indirect
|
golang.org/x/sys v0.16.0 // indirect
|
||||||
golang.org/x/text v0.14.0 // indirect
|
golang.org/x/text v0.14.0 // indirect
|
||||||
google.golang.org/appengine v1.6.7 // indirect
|
google.golang.org/appengine v1.6.7 // indirect
|
||||||
|
|||||||
@@ -355,7 +355,7 @@ func (d *Db) dumpDb(writer *gzipWriter, dbId uint64, dbName string, tables []str
|
|||||||
writer.WriteString("BEGIN;\n")
|
writer.WriteString("BEGIN;\n")
|
||||||
}
|
}
|
||||||
insertSql := "INSERT INTO %s VALUES (%s);\n"
|
insertSql := "INSERT INTO %s VALUES (%s);\n"
|
||||||
dbMeta.WalkTableRecord(table, func(record map[string]any, columns []*dbi.QueryColumn) error {
|
dbConn.WalkTableRows(context.TODO(), table, func(record map[string]any, columns []*dbi.QueryColumn) error {
|
||||||
var values []string
|
var values []string
|
||||||
writer.TryFlush()
|
writer.TryFlush()
|
||||||
for _, column := range columns {
|
for _, column := range columns {
|
||||||
|
|||||||
@@ -77,6 +77,11 @@ func (d *DbConn) WalkQueryRows(ctx context.Context, querySql string, walkFn Walk
|
|||||||
return walkQueryRows(ctx, d.db, querySql, walkFn, args...)
|
return walkQueryRows(ctx, d.db, querySql, walkFn, args...)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 游标方式遍历指定表的结果集, walkFn返回error不为nil, 则跳出遍历
|
||||||
|
func (d *DbConn) WalkTableRows(ctx context.Context, tableName string, walkFn WalkQueryRowsFunc) error {
|
||||||
|
return d.WalkQueryRows(ctx, fmt.Sprintf("SELECT * FROM %s", tableName), walkFn)
|
||||||
|
}
|
||||||
|
|
||||||
// 执行 update, insert, delete,建表等sql
|
// 执行 update, insert, delete,建表等sql
|
||||||
// 返回影响条数和错误
|
// 返回影响条数和错误
|
||||||
func (d *DbConn) Exec(sql string, args ...any) (int64, error) {
|
func (d *DbConn) Exec(sql string, args ...any) (int64, error) {
|
||||||
|
|||||||
@@ -104,9 +104,6 @@ type Dialect interface {
|
|||||||
// 获取建表ddl
|
// 获取建表ddl
|
||||||
GetTableDDL(tableName string) (string, error)
|
GetTableDDL(tableName string) (string, error)
|
||||||
|
|
||||||
// WalkTableRecord 遍历指定表的数据
|
|
||||||
WalkTableRecord(tableName string, walkFn WalkQueryRowsFunc) error
|
|
||||||
|
|
||||||
GetSchemas() ([]string, error)
|
GetSchemas() ([]string, error)
|
||||||
|
|
||||||
// GetDbProgram 获取数据库程序模块,用于数据库备份与恢复
|
// GetDbProgram 获取数据库程序模块,用于数据库备份与恢复
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
package dm
|
package dm
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
|
||||||
"database/sql"
|
"database/sql"
|
||||||
"fmt"
|
"fmt"
|
||||||
"mayfly-go/internal/db/dbm/dbi"
|
"mayfly-go/internal/db/dbm/dbi"
|
||||||
@@ -233,10 +232,6 @@ func (dd *DMDialect) GetTableDDL(tableName string) (string, error) {
|
|||||||
return builder.String(), nil
|
return builder.String(), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (dd *DMDialect) WalkTableRecord(tableName string, walkFn dbi.WalkQueryRowsFunc) error {
|
|
||||||
return dd.dc.WalkQueryRows(context.Background(), fmt.Sprintf("SELECT * FROM %s", tableName), walkFn)
|
|
||||||
}
|
|
||||||
|
|
||||||
// 获取DM当前连接的库可访问的schemaNames
|
// 获取DM当前连接的库可访问的schemaNames
|
||||||
func (dd *DMDialect) GetSchemas() ([]string, error) {
|
func (dd *DMDialect) GetSchemas() ([]string, error) {
|
||||||
sql := dbi.GetLocalSql(DM_META_FILE, DM_DB_SCHEMAS)
|
sql := dbi.GetLocalSql(DM_META_FILE, DM_DB_SCHEMAS)
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
package mysql
|
package mysql
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
|
||||||
"database/sql"
|
"database/sql"
|
||||||
"fmt"
|
"fmt"
|
||||||
"mayfly-go/internal/db/dbm/dbi"
|
"mayfly-go/internal/db/dbm/dbi"
|
||||||
@@ -164,10 +163,6 @@ func (md *MysqlDialect) GetTableDDL(tableName string) (string, error) {
|
|||||||
return anyx.ConvString(res[0]["Create Table"]) + ";", nil
|
return anyx.ConvString(res[0]["Create Table"]) + ";", nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (md *MysqlDialect) WalkTableRecord(tableName string, walkFn dbi.WalkQueryRowsFunc) error {
|
|
||||||
return md.dc.WalkQueryRows(context.Background(), fmt.Sprintf("SELECT * FROM %s", tableName), walkFn)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (md *MysqlDialect) GetSchemas() ([]string, error) {
|
func (md *MysqlDialect) GetSchemas() ([]string, error) {
|
||||||
return nil, nil
|
return nil, nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,11 +15,12 @@ import (
|
|||||||
"strings"
|
"strings"
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"github.com/pkg/errors"
|
|
||||||
"mayfly-go/internal/db/config"
|
"mayfly-go/internal/db/config"
|
||||||
"mayfly-go/internal/db/dbm/dbi"
|
"mayfly-go/internal/db/dbm/dbi"
|
||||||
"mayfly-go/internal/db/domain/entity"
|
"mayfly-go/internal/db/domain/entity"
|
||||||
"mayfly-go/pkg/logx"
|
"mayfly-go/pkg/logx"
|
||||||
|
|
||||||
|
"github.com/pkg/errors"
|
||||||
)
|
)
|
||||||
|
|
||||||
var _ dbi.DbProgram = (*DbProgramMysql)(nil)
|
var _ dbi.DbProgram = (*DbProgramMysql)(nil)
|
||||||
@@ -584,7 +585,7 @@ func (svc *DbProgramMysql) ReplayBinlog(ctx context.Context, originalDatabase, t
|
|||||||
_ = mysqlbinlogCmd.Cancel()
|
_ = mysqlbinlogCmd.Cancel()
|
||||||
if err := mysqlbinlogCmd.Wait(); err != nil {
|
if err := mysqlbinlogCmd.Wait(); err != nil {
|
||||||
if mysqlbinlogErr.Len() > 0 {
|
if mysqlbinlogErr.Len() > 0 {
|
||||||
logx.Errorf("运行 mysqlbinlog 程序失败", mysqlbinlogErr.String())
|
logx.Errorf("运行 mysqlbinlog 程序失败: %s", mysqlbinlogErr.String())
|
||||||
if replayErr != nil {
|
if replayErr != nil {
|
||||||
replayErr = errors.Wrap(replayErr, "运行 mysqlbinlog 程序失败: "+mysqlbinlogErr.String())
|
replayErr = errors.Wrap(replayErr, "运行 mysqlbinlog 程序失败: "+mysqlbinlogErr.String())
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
package oracle
|
package oracle
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
|
||||||
"database/sql"
|
"database/sql"
|
||||||
"fmt"
|
"fmt"
|
||||||
"mayfly-go/internal/db/dbm/dbi"
|
"mayfly-go/internal/db/dbm/dbi"
|
||||||
@@ -233,10 +232,6 @@ func (od *OracleDialect) GetTableDDL(tableName string) (string, error) {
|
|||||||
return builder.String(), nil
|
return builder.String(), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (od *OracleDialect) WalkTableRecord(tableName string, walkFn dbi.WalkQueryRowsFunc) error {
|
|
||||||
return od.dc.WalkQueryRows(context.Background(), fmt.Sprintf("SELECT * FROM %s", tableName), walkFn)
|
|
||||||
}
|
|
||||||
|
|
||||||
// 获取DM当前连接的库可访问的schemaNames
|
// 获取DM当前连接的库可访问的schemaNames
|
||||||
func (od *OracleDialect) GetSchemas() ([]string, error) {
|
func (od *OracleDialect) GetSchemas() ([]string, error) {
|
||||||
sql := dbi.GetLocalSql(ORACLE_META_FILE, ORACLE_DB_SCHEMAS)
|
sql := dbi.GetLocalSql(ORACLE_META_FILE, ORACLE_DB_SCHEMAS)
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
package postgres
|
package postgres
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
|
||||||
"database/sql"
|
"database/sql"
|
||||||
"fmt"
|
"fmt"
|
||||||
"mayfly-go/internal/db/dbm/dbi"
|
"mayfly-go/internal/db/dbm/dbi"
|
||||||
@@ -173,10 +172,6 @@ func (md *PgsqlDialect) GetTableDDL(tableName string) (string, error) {
|
|||||||
return res[0]["sql"].(string), nil
|
return res[0]["sql"].(string), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (md *PgsqlDialect) WalkTableRecord(tableName string, walkFn dbi.WalkQueryRowsFunc) error {
|
|
||||||
return md.dc.WalkQueryRows(context.Background(), fmt.Sprintf("SELECT * FROM %s", tableName), walkFn)
|
|
||||||
}
|
|
||||||
|
|
||||||
// 获取pgsql当前连接的库可访问的schemaNames
|
// 获取pgsql当前连接的库可访问的schemaNames
|
||||||
func (md *PgsqlDialect) GetSchemas() ([]string, error) {
|
func (md *PgsqlDialect) GetSchemas() ([]string, error) {
|
||||||
sql := dbi.GetLocalSql(PGSQL_META_FILE, PGSQL_DB_SCHEMAS)
|
sql := dbi.GetLocalSql(PGSQL_META_FILE, PGSQL_DB_SCHEMAS)
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
package sqlite
|
package sqlite
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
|
||||||
"database/sql"
|
"database/sql"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
@@ -183,10 +182,6 @@ func (sd *SqliteDialect) GetTableDDL(tableName string) (string, error) {
|
|||||||
return builder.String(), nil
|
return builder.String(), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (sd *SqliteDialect) WalkTableRecord(tableName string, walkFn dbi.WalkQueryRowsFunc) error {
|
|
||||||
return sd.dc.WalkQueryRows(context.Background(), fmt.Sprintf("SELECT * FROM %s", tableName), walkFn)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (sd *SqliteDialect) GetSchemas() ([]string, error) {
|
func (sd *SqliteDialect) GetSchemas() ([]string, error) {
|
||||||
return nil, nil
|
return nil, nil
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,16 +1,22 @@
|
|||||||
package ioc
|
package ioc
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"context"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"mayfly-go/pkg/logx"
|
"mayfly-go/pkg/logx"
|
||||||
|
"mayfly-go/pkg/utils/collx"
|
||||||
"mayfly-go/pkg/utils/structx"
|
"mayfly-go/pkg/utils/structx"
|
||||||
"reflect"
|
"reflect"
|
||||||
"strings"
|
"strings"
|
||||||
|
"sync"
|
||||||
|
|
||||||
|
"golang.org/x/sync/errgroup"
|
||||||
)
|
)
|
||||||
|
|
||||||
// 容器
|
// 容器
|
||||||
type Container struct {
|
type Container struct {
|
||||||
|
mu sync.RWMutex
|
||||||
components map[string]*Component
|
components map[string]*Component
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -22,6 +28,9 @@ func NewContainer() *Container {
|
|||||||
|
|
||||||
// 注册实例至实例容器
|
// 注册实例至实例容器
|
||||||
func (c *Container) Register(bean any, opts ...ComponentOption) {
|
func (c *Container) Register(bean any, opts ...ComponentOption) {
|
||||||
|
c.mu.Lock()
|
||||||
|
defer c.mu.Unlock()
|
||||||
|
|
||||||
component := NewComponent(bean, opts...)
|
component := NewComponent(bean, opts...)
|
||||||
|
|
||||||
componentName := component.Name
|
componentName := component.Name
|
||||||
@@ -32,7 +41,7 @@ func (c *Container) Register(bean any, opts ...ComponentOption) {
|
|||||||
component.Name = componentName
|
component.Name = componentName
|
||||||
}
|
}
|
||||||
|
|
||||||
if _, err := c.Get(componentName); err == nil {
|
if _, ok := c.components[componentName]; ok {
|
||||||
logx.Warnf("组件名[%s]已经注册至容器, 重复注册...", componentName)
|
logx.Warnf("组件名[%s]已经注册至容器, 重复注册...", componentName)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -58,16 +67,37 @@ func (c *Container) Inject(obj any) error {
|
|||||||
|
|
||||||
// 对所有组件实例执行Inject。即为实例字段注入依赖的组件实例
|
// 对所有组件实例执行Inject。即为实例字段注入依赖的组件实例
|
||||||
func (c *Container) InjectComponents() error {
|
func (c *Container) InjectComponents() error {
|
||||||
for _, v := range c.components {
|
componentsGroups := collx.ArraySplit[*Component](collx.MapValues(c.components), 10)
|
||||||
|
|
||||||
|
ctx, cancel := context.WithCancel(context.Background())
|
||||||
|
defer cancel()
|
||||||
|
errGroup, _ := errgroup.WithContext(ctx)
|
||||||
|
|
||||||
|
for _, components := range componentsGroups {
|
||||||
|
components := components // 创建局部变量以在闭包中使用
|
||||||
|
errGroup.Go(func() error {
|
||||||
|
for _, v := range components {
|
||||||
if err := c.Inject(v.Value); err != nil {
|
if err := c.Inject(v.Value); err != nil {
|
||||||
|
cancel() // 取消所有协程的执行
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return nil
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := errGroup.Wait(); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
// 根据组件实例名,获取对应实例信息
|
// 根据组件实例名,获取对应实例信息
|
||||||
func (c *Container) Get(name string) (any, error) {
|
func (c *Container) Get(name string) (any, error) {
|
||||||
|
c.mu.RLock()
|
||||||
|
defer c.mu.RUnlock()
|
||||||
|
|
||||||
component, ok := c.components[name]
|
component, ok := c.components[name]
|
||||||
if !ok {
|
if !ok {
|
||||||
return nil, errors.New("component not found: " + name)
|
return nil, errors.New("component not found: " + name)
|
||||||
|
|||||||
@@ -116,7 +116,7 @@ func ErrorTrace(msg string, err any) {
|
|||||||
default:
|
default:
|
||||||
errMsg = fmt.Sprintf("%v", t)
|
errMsg = fmt.Sprintf("%v", t)
|
||||||
}
|
}
|
||||||
Log(context.Background(), slog.LevelError, fmt.Sprintf(msg+"\n%s\n%s", errMsg, runtimex.StatckStr(2, 10)))
|
Log(context.Background(), slog.LevelError, fmt.Sprintf(msg+"\n%s\n%s", errMsg, runtimex.StatckStr(2, 20)))
|
||||||
}
|
}
|
||||||
|
|
||||||
func ErrorWithFields(ctx context.Context, msg string, mapFields map[string]any) {
|
func ErrorWithFields(ctx context.Context, msg string, mapFields map[string]any) {
|
||||||
|
|||||||
Reference in New Issue
Block a user