Skip to content

Commit

Permalink
When the scene refers to the scene set, add the judgment of whether t…
Browse files Browse the repository at this point in the history
…he reference is circular
  • Loading branch information
kakj-go committed Oct 11, 2021
1 parent 488c7f2 commit 6fb3ae8
Show file tree
Hide file tree
Showing 2 changed files with 64 additions and 8 deletions.
37 changes: 34 additions & 3 deletions modules/dop/dao/autotest_scene.go
Original file line number Diff line number Diff line change
Expand Up @@ -77,6 +77,18 @@ func (db *DBClient) GetAutotestScene(id uint64) (*AutoTestScene, error) {
return &scene, nil
}

func (db *DBClient) GetAutotestSceneTx(id uint64, tx *gorm.DB) (*AutoTestScene, error) {
var scene AutoTestScene
if tx == nil {
tx = db.DB
}
err := tx.Where("id = ?", id).Find(&scene).Error
if err != nil {
return nil, err
}
return &scene, nil
}

func (db *DBClient) GetAutotestSceneByPreID(preID uint64) (*AutoTestScene, error) {
var scene AutoTestScene
err := db.Where("pre_id = ?", preID).Find(&scene).Error
Expand Down Expand Up @@ -123,6 +135,25 @@ func (db *DBClient) ListAutotestScene(req apistructs.AutotestSceneRequest) (uint
return uint64(total), scenes, nil
}

func (db *DBClient) ListAutotestSceneTx(req apistructs.AutotestSceneRequest, tx *gorm.DB) (uint64, []AutoTestScene, error) {
var (
scenes []AutoTestScene
total int64
)
//sql := db.Table("dice_autotest_scene").Where("set_id = ?", req.SetID)
//err := sql.Offset((req.PageNo - 1) * req.PageSize).Limit(req.PageSize).Find(&scenes).
// Offset(0).Limit(-1).Count(&total).Error
if tx == nil {
tx = db.DB
}
sql := tx.Table("dice_autotest_scene").Where("set_id = ?", req.SetID)
err := sql.Find(&scenes).Offset(0).Limit(-1).Count(&total).Error
if err != nil {
return 0, nil, err
}
return uint64(total), scenes, nil
}

// ListAutotestScenes 批量查询场景
func (db *DBClient) ListAutotestScenes(setIDs []uint64) ([]AutoTestScene, error) {
var (
Expand Down Expand Up @@ -187,8 +218,8 @@ func (db *DBClient) DeleteAutoTestScene(id uint64) (err error) {
}

// like linklist change to node index
func (db *DBClient) MoveAutoTestScene(id, newPreID, newSetID uint64) (err error) {
return db.Transaction(func(tx *gorm.DB) error {
func (db *DBClient) MoveAutoTestScene(id, newPreID, newSetID uint64, tx *gorm.DB) (err error) {
return func() error {
var scene, next, oldNext AutoTestScene
// get scene
if err := tx.Where("id = ?", id).Find(&scene).Error; err != nil {
Expand Down Expand Up @@ -253,7 +284,7 @@ func (db *DBClient) MoveAutoTestScene(id, newPreID, newSetID uint64) (err error)
}()

return nil
})
}()
}

// check sceneSet linked list not have same pre_id
Expand Down
35 changes: 30 additions & 5 deletions modules/dop/services/autotest_v2/scene.go
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,7 @@ func (svc *Service) CreateAutotestScene(req apistructs.AutotestSceneRequest) (ui
RefSetID: req.RefSetID,
Name: req.Name,
}
if err := svc.checkCycle(checkScene, nil, nil); err != nil {
if err := svc.checkCycle(checkScene, nil, nil, nil); err != nil {
return 0, apierrors.ErrCreateAutoTestScene.InternalError(err)
}

Expand Down Expand Up @@ -119,7 +119,7 @@ func (svc *Service) CreateAutotestScene(req apistructs.AutotestSceneRequest) (ui
}

// check whether the nesting depth of the scene reference scene set is greater than a certain value
func (svc *Service) checkCycle(scene dao.AutoTestScene, allNodes []uint64, allNodesMap map[uint64]bool) error {
func (svc *Service) checkCycle(scene dao.AutoTestScene, allNodes []uint64, allNodesMap map[uint64]bool, tx *gorm.DB) error {
// Initialization data, add begin data
if allNodes == nil && allNodesMap == nil {
allNodes = append(allNodes, scene.SetID)
Expand All @@ -140,7 +140,7 @@ func (svc *Service) checkCycle(scene dao.AutoTestScene, allNodes []uint64, allNo
return fmt.Errorf("error scene reference scene set cycle error, scene reference path : %v", allNodes)
}

_, refScenes, err := svc.db.ListAutotestScene(apistructs.AutotestSceneRequest{SetID: scene.RefSetID})
_, refScenes, err := svc.db.ListAutotestSceneTx(apistructs.AutotestSceneRequest{SetID: scene.RefSetID}, tx)
if err != nil {
return err
}
Expand All @@ -150,7 +150,7 @@ func (svc *Service) checkCycle(scene dao.AutoTestScene, allNodes []uint64, allNo
if refScene.RefSetID <= 0 {
continue
}
err := svc.checkCycle(refScene, allNodes, allNodesMap)
err := svc.checkCycle(refScene, allNodes, allNodesMap, tx)
if err != nil {
return err
}
Expand Down Expand Up @@ -236,7 +236,32 @@ func (svc *Service) MoveAutotestScene(req apistructs.AutotestSceneRequest) (uint
return 0, apierrors.ErrMoveAutoTestScene.AlreadyExists()
}
}
err := svc.db.MoveAutoTestScene(req.ID, preID, uint64(req.GroupID))

err := svc.db.Transaction(func(tx *gorm.DB) error {
err := svc.db.MoveAutoTestScene(req.ID, preID, uint64(req.GroupID), tx)
if err != nil {
return err
}

scene, err := svc.db.GetAutotestSceneTx(req.ID, tx)
if err != nil {
return err
}

// scene reference scene set is moved
if scene.RefSetID > 0 && req.GroupID > 0 {
checkScene := dao.AutoTestScene{
SpaceID: scene.SpaceID,
SetID: scene.SetID,
RefSetID: scene.RefSetID,
}
err := svc.checkCycle(checkScene, nil, nil, tx)
if err != nil {
return err
}
}
return nil
})
if err != nil {
return 0, err
}
Expand Down

0 comments on commit 6fb3ae8

Please sign in to comment.