mirror of
				https://gitee.com/dromara/mayfly-go
				synced 2025-11-04 16:30:25 +08:00 
			
		
		
		
	
		
			
	
	
		
			128 lines
		
	
	
		
			3.9 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
		
		
			
		
	
	
			128 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.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
							 | 
						||
| 
								 | 
							
								}
							 |