mirror of
https://gitee.com/dromara/mayfly-go
synced 2025-11-02 23:40:24 +08:00
129 lines
3.9 KiB
Go
129 lines
3.9 KiB
Go
package application
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
|
|
"mayfly-go/internal/devops/domain/entity"
|
|
"mayfly-go/internal/devops/domain/repository"
|
|
"mayfly-go/internal/devops/infrastructure/persistence"
|
|
"mayfly-go/pkg/global"
|
|
"mayfly-go/pkg/model"
|
|
"strings"
|
|
|
|
"github.com/xwb1989/sqlparser"
|
|
)
|
|
|
|
type DbSqlExec interface {
|
|
// 生成sql执行记录
|
|
GenExecLog(loginAccount *model.LoginAccount, dbId uint64, db string, sql string, dbInstance *DbInstance) *entity.DbSqlExec
|
|
|
|
// 保存sql执行记录
|
|
Save(*entity.DbSqlExec)
|
|
|
|
// 根据条件删除sql执行记录
|
|
DeleteBy(condition *entity.DbSqlExec)
|
|
|
|
// 分页获取
|
|
GetPageList(condition *entity.DbSqlExec, pageParam *model.PageParam, toEntity interface{}, orderBy ...string) *model.PageResult
|
|
}
|
|
|
|
type dbSqlExecAppImpl struct {
|
|
dbSqlExecRepo repository.DbSqlExec
|
|
}
|
|
|
|
var DbSqlExecApp DbSqlExec = &dbSqlExecAppImpl{
|
|
dbSqlExecRepo: persistence.DbSqlExecDao,
|
|
}
|
|
|
|
func (d *dbSqlExecAppImpl) GenExecLog(loginAccount *model.LoginAccount, dbId uint64, db string, sql string, dbInstance *DbInstance) *entity.DbSqlExec {
|
|
defer func() {
|
|
if err := recover(); err != nil {
|
|
global.Log.Error("生成sql执行记录失败", err)
|
|
}
|
|
}()
|
|
stmt, err := sqlparser.Parse(sql)
|
|
if err != nil {
|
|
global.Log.Error("记录数据库sql执行记录失败", err)
|
|
}
|
|
|
|
dbSqlExecRecord := new(entity.DbSqlExec)
|
|
dbSqlExecRecord.DbId = dbId
|
|
dbSqlExecRecord.Db = db
|
|
dbSqlExecRecord.Sql = sql
|
|
dbSqlExecRecord.SetBaseInfo(loginAccount)
|
|
|
|
switch stmt := stmt.(type) {
|
|
case *sqlparser.Update:
|
|
doUpdate(stmt, dbInstance, dbSqlExecRecord)
|
|
case *sqlparser.Delete:
|
|
doDelete(stmt, dbInstance, dbSqlExecRecord)
|
|
case *sqlparser.Insert:
|
|
doInsert(stmt, dbSqlExecRecord)
|
|
}
|
|
|
|
return dbSqlExecRecord
|
|
}
|
|
|
|
func (d *dbSqlExecAppImpl) Save(dse *entity.DbSqlExec) {
|
|
d.dbSqlExecRepo.Insert(dse)
|
|
}
|
|
|
|
func (d *dbSqlExecAppImpl) DeleteBy(condition *entity.DbSqlExec) {
|
|
d.dbSqlExecRepo.DeleteBy(condition)
|
|
}
|
|
|
|
func (d *dbSqlExecAppImpl) GetPageList(condition *entity.DbSqlExec, pageParam *model.PageParam, toEntity interface{}, orderBy ...string) *model.PageResult {
|
|
return d.dbSqlExecRepo.GetPageList(condition, pageParam, toEntity, orderBy...)
|
|
}
|
|
|
|
func doUpdate(update *sqlparser.Update, dbInstance *DbInstance, dbSqlExec *entity.DbSqlExec) {
|
|
tableStr := sqlparser.String(update.TableExprs)
|
|
// 可能使用别名,故空格切割
|
|
tableName := strings.Split(tableStr, " ")[0]
|
|
where := sqlparser.String(update.Where)
|
|
|
|
updateExprs := update.Exprs
|
|
updateColumns := make([]string, 0)
|
|
for _, v := range updateExprs {
|
|
updateColumns = append(updateColumns, v.Name.Name.String())
|
|
}
|
|
|
|
// 获取表主键列名,排除使用别名
|
|
primaryKey := dbInstance.GetMeta().GetPrimaryKey(tableName)
|
|
|
|
updateColumnsAndPrimaryKey := strings.Join(updateColumns, ",") + "," + primaryKey
|
|
// 查询要更新字段数据的旧值,以及主键值
|
|
selectSql := fmt.Sprintf("SELECT %s FROM %s %s LIMIT 200", updateColumnsAndPrimaryKey, tableStr, where)
|
|
_, res, _ := dbInstance.SelectData(selectSql)
|
|
|
|
bytes, _ := json.Marshal(res)
|
|
dbSqlExec.OldValue = string(bytes)
|
|
dbSqlExec.Table = tableName
|
|
dbSqlExec.Type = entity.DbSqlExecTypeUpdate
|
|
}
|
|
|
|
func doDelete(delete *sqlparser.Delete, dbInstance *DbInstance, dbSqlExec *entity.DbSqlExec) {
|
|
tableStr := sqlparser.String(delete.TableExprs)
|
|
// 可能使用别名,故空格切割
|
|
table := strings.Split(tableStr, " ")[0]
|
|
where := sqlparser.String(delete.Where)
|
|
|
|
// 查询删除数据
|
|
selectSql := fmt.Sprintf("SELECT * FROM %s %s LIMIT 200", tableStr, where)
|
|
_, res, _ := dbInstance.SelectData(selectSql)
|
|
|
|
bytes, _ := json.Marshal(res)
|
|
dbSqlExec.OldValue = string(bytes)
|
|
dbSqlExec.Table = table
|
|
dbSqlExec.Type = entity.DbSqlExecTypeDelete
|
|
}
|
|
|
|
func doInsert(insert *sqlparser.Insert, dbSqlExec *entity.DbSqlExec) {
|
|
tableStr := sqlparser.String(insert.Table)
|
|
// 可能使用别名,故空格切割
|
|
table := strings.Split(tableStr, " ")[0]
|
|
dbSqlExec.Table = table
|
|
dbSqlExec.Type = entity.DbSqlExecTypeInsert
|
|
}
|