@@ -63,7 +63,8 @@ func (c *componentRepository) LoadComponents(tx core.DB, assetVersionName string
6363 query := c .GetDB (tx ).Preload ("Component" ).Preload ("Dependency" ).Where ("asset_version_name = ? AND asset_id = ?" , assetVersionName , assetID )
6464
6565 if scannerID != "" {
66- query = query .Where ("scanner_id LIKE %?%" , scannerID )
66+ scannerID = "%" + scannerID + "%"
67+ query = query .Where ("scanner_ids LIKE ?" , scannerID )
6768 }
6869
6970 err = query .Find (& components ).Error
@@ -82,15 +83,16 @@ func (c *componentRepository) LoadPathToComponent(tx core.DB, assetVersionName s
8283
8384 //Find all needed components recursively until we hit the root component
8485
86+ scannerID = "%" + scannerID + "%"
8587 query := c .GetDB (tx ).Raw (`WITH RECURSIVE components_cte AS (
86- SELECT component_purl,dependency_purl,asset_id,scanner_id ,depth,semver_start,semver_end
88+ SELECT component_purl,dependency_purl,asset_id,scanner_ids ,depth,semver_start,semver_end
8789 FROM component_dependencies
88- WHERE dependency_purl like ? AND asset_id = ? AND asset_version_name = ? AND scanner_id LIKE %?%
90+ WHERE dependency_purl like ? AND asset_id = ? AND asset_version_name = ? AND scanner_ids LIKE ?
8991 UNION ALL
90- SELECT co.component_purl,co.dependency_purl,co.asset_id,co.scanner_id ,co.depth,co.semver_start,co.semver_end
92+ SELECT co.component_purl,co.dependency_purl,co.asset_id,co.scanner_ids ,co.depth,co.semver_start,co.semver_end
9193 FROM component_dependencies AS co
9294 INNER JOIN components_cte AS cte ON co.dependency_purl = cte.component_purl
93- WHERE co.asset_id = ? AND co.asset_version_name = ? AND co.scanner_id LIKE %?%
95+ WHERE co.asset_id = ? AND co.asset_version_name = ? AND co.scanner_ids LIKE ?
9496 )
9597 SELECT DISTINCT * FROM components_cte` , pURL , assetID , assetVersionName , scannerID , assetID , assetVersionName , scannerID )
9698
@@ -114,7 +116,8 @@ func (c *componentRepository) GetLicenseDistribution(tx core.DB, assetVersionNam
114116 query := c .GetDB (tx ).Table ("components" ).Select ("components.license as license, COUNT(components.license) as count" ).Joins ("RIGHT JOIN component_dependencies ON components.purl = component_dependencies.dependency_purl" ).Where ("asset_version_name = ? AND asset_id = ?" , assetVersionName , assetID ).Group ("components.license" )
115117
116118 if scannerID != "" {
117- query = query .Where ("scanner_id LIKE %?%" , scannerID )
119+ scannerID = "%" + scannerID + "%"
120+ query = query .Where ("scanner_ids LIKE ?" , scannerID )
118121 }
119122
120123 err = query .Scan (& licenses ).Error
@@ -146,7 +149,8 @@ func (c *componentRepository) LoadComponentsWithProject(tx core.DB, assetVersion
146149 query := c .GetDB (tx ).Model (& models.ComponentDependency {}).Joins ("Dependency" ).Joins ("Dependency.ComponentProject" ).Where ("asset_version_name = ? AND asset_id = ?" , assetVersionName , assetID )
147150
148151 if scannerID != "" {
149- query = query .Where ("scanner_id LIKE %?%" , scannerID )
152+ scannerID = "%" + scannerID + "%"
153+ query = query .Where ("scanner_ids LIKE ?" , scannerID )
150154 }
151155
152156 for _ , f := range filter {
@@ -180,29 +184,41 @@ func (c *componentRepository) LoadComponentsWithProject(tx core.DB, assetVersion
180184 return core .NewPaged (pageInfo , total , components ), err
181185}
182186
183- func (c * componentRepository ) LoadAllLatestComponentFromAssetVersion (tx core.DB , assetVersion models.AssetVersion , scannerID string ) ([]models.ComponentDependency , error ) {
184- var component []models.ComponentDependency
185- err := c .GetDB (tx ).Preload ("Component" ).Preload ("Dependency" ).Where ("asset_version_name = ? AND asset_id AND scanner_id LIKE %?%" , assetVersion .Name , assetVersion .AssetID ).Find (& component ).Error
186- return component , err
187- }
188-
189187func (c * componentRepository ) FindByPurl (tx core.DB , purl string ) (models.Component , error ) {
190188 var component models.Component
191189 err := c .GetDB (tx ).Where ("purl = ?" , purl ).First (& component ).Error
192190 return component , err
193191}
194192
195- func (c * componentRepository ) HandleStateDiff (tx core.DB , assetVersionName string , assetID uuid.UUID , oldState []models.ComponentDependency , newState []models.ComponentDependency ) error {
193+ func (c * componentRepository ) HandleStateDiff (tx core.DB , assetVersionName string , assetID uuid.UUID , oldState []models.ComponentDependency , newState []models.ComponentDependency , scannerID string ) error {
196194 comparison := utils .CompareSlices (oldState , newState , func (dep models.ComponentDependency ) string {
197195 return utils .SafeDereference (dep .ComponentPurl ) + "->" + dep .DependencyPurl
198196 })
199197
200198 removed := comparison .OnlyInA
201199 added := comparison .OnlyInB
200+ needToBeChanged := comparison .InBoth
202201
203202 return c .GetDB (tx ).Transaction (func (tx * gorm.DB ) error {
204- if len (removed ) != 0 {
205- if err := c .GetDB (tx ).Delete (& removed ).Error ; err != nil {
203+ dependenciesToUpdate , err := removeScannerIDFromComponents (tx , c , removed , scannerID )
204+ if err != nil {
205+ return err
206+ }
207+ if len (dependenciesToUpdate ) > 0 {
208+ err := c .db .Save (dependenciesToUpdate ).Error
209+ if err != nil {
210+ return err
211+ }
212+ }
213+
214+ for i := range needToBeChanged {
215+ if ! strings .Contains (needToBeChanged [i ].ScannerIDs , scannerID ) {
216+ needToBeChanged [i ].ScannerIDs = needToBeChanged [i ].ScannerIDs + scannerID + " "
217+ }
218+ }
219+ if len (needToBeChanged ) > 0 {
220+ err := c .db .Save (needToBeChanged ).Error
221+ if err != nil {
206222 return err
207223 }
208224 }
@@ -219,12 +235,12 @@ func (c *componentRepository) HandleStateDiff(tx core.DB, assetVersionName strin
219235
220236func (c * componentRepository ) GetDependencyCountPerScanner (assetVersionName string , assetID uuid.UUID ) (map [string ]int , error ) {
221237 var results []struct {
222- ScannerID string `gorm:"column:scanner_id "`
238+ ScannerID string `gorm:"column:scanner_ids "`
223239 Count int `gorm:"column:count"`
224240 }
225241 err := c .db .Model (& models.Component {}).
226- Select ("scanner_id , COUNT(*) as count" ).
227- Group ("scanner_id " ).
242+ Select ("scanner_ids , COUNT(*) as count" ).
243+ Group ("scanner_ids " ).
228244 Where ("asset_version_name = ?" , assetVersionName ).
229245 Where ("asset_id = ?" , assetID ).
230246 Find (& results ).Error
@@ -241,3 +257,21 @@ func (c *componentRepository) GetDependencyCountPerScanner(assetVersionName stri
241257
242258 return counts , nil
243259}
260+
261+ func removeScannerIDFromComponents (tx core.DB , c * componentRepository , components []models.ComponentDependency , scannerID string ) ([]models.ComponentDependency , error ) {
262+ var componentDependeciesToChange []models.ComponentDependency
263+ scannerID += " "
264+ for i := range components {
265+
266+ if components [i ].ScannerIDs == scannerID {
267+ if err := c .GetDB (tx ).Delete (& components [i ]).Error ; err != nil {
268+ return componentDependeciesToChange , err
269+ }
270+ } else {
271+ components [i ].ScannerIDs = strings .Replace (components [i ].ScannerIDs , scannerID , "" , 1 )
272+ componentDependeciesToChange = append (componentDependeciesToChange , components [i ])
273+ }
274+ }
275+
276+ return componentDependeciesToChange , nil
277+ }
0 commit comments