55from DIRAC .Core .Base .DB import DB
66from DIRAC .Core .Security import Properties
77from DIRAC .Core .Utilities import List
8+ from DIRAC .Core .Utilities .ReturnValues import convertToReturnValue , returnValueOrRaise
89
910
1011class SandboxMetadataDB (DB ):
@@ -219,11 +220,8 @@ def assignSandboxesToEntities(self, enDict, requesterName, requesterGroup, owner
219220 return result
220221 return S_OK (assigned )
221222
222- def __filterEntitiesByRequester (self , entitiesList , requesterName , requesterGroup ):
223- """
224- Given a list of entities and a requester, return the ones that the requester is allowed to modify
225- """
226- sqlCond = ["s.OwnerId=o.OwnerId" , "s.SBId=e.SBId" ]
223+ def __entitiesByRequesterCond (self , requesterName , requesterGroup ):
224+ sqlCond = []
227225 requesterProps = Registry .getPropertiesForEntity (requesterGroup , name = requesterName )
228226 if Properties .JOB_ADMINISTRATOR in requesterProps :
229227 # Do nothing, just ensure it doesn't fit in the other cases
@@ -235,44 +233,40 @@ def __filterEntitiesByRequester(self, entitiesList, requesterName, requesterGrou
235233 sqlCond .append (f"o.Owner='{ requesterName } '" )
236234 else :
237235 return S_ERROR ("Not authorized to access sandbox" )
238- for i in range (len (entitiesList )):
239- entitiesList [i ] = self ._escapeString (entitiesList [i ])["Value" ]
240- if len (entitiesList ) == 1 :
241- sqlCond .append (f"e.EntityId = { entitiesList [0 ]} " )
242- else :
243- sqlCond .append (f"e.EntityId in ( { ', ' .join (entitiesList )} )" )
244- sqlCmd = "SELECT DISTINCT e.EntityId FROM `sb_EntityMapping` e, `sb_SandBoxes` s, `sb_Owners` o WHERE"
245- sqlCmd = f"{ sqlCmd } { ' AND ' .join (sqlCond )} "
246- result = self ._query (sqlCmd )
247- if not result ["OK" ]:
248- return result
249- return S_OK ([row [0 ] for row in result ["Value" ]])
236+ return sqlCond
250237
238+ @convertToReturnValue
251239 def unassignEntities (self , entities , requesterName , requesterGroup ):
252240 """
253241 Unassign jobs to sandboxes
254242
255243 :param list entities: list of entities to unassign
256244 """
257- updated = 0
258245 if not entities :
259- return S_OK ()
260- result = self .__filterEntitiesByRequester (entities , requesterName , requesterGroup )
261- if not result ["OK" ]:
262- gLogger .error ("Cannot filter entities" , result ["Message" ])
263- return result
264- ids = result ["Value" ]
265- if not ids :
266- return S_OK (0 )
267- sqlCmd = "DELETE FROM `sb_EntityMapping` WHERE EntityId in ( %s )" % ", " .join (
268- ["'%s'" % str (eid ) for eid in ids ]
269- )
270- result = self ._update (sqlCmd )
271- if not result ["OK" ]:
272- gLogger .error ("Cannot unassign entities" , result ["Message" ])
273- else :
274- updated += 1
275- return S_OK (updated )
246+ return None
247+ conds = self .__entitiesByRequesterCond (requesterName , requesterGroup )
248+
249+ sqlCmd = "CREATE TEMPORARY TABLE to_delete_EntityId (EntityId VARCHAR(128) NOT NULL, PRIMARY KEY (EntityId)) ENGINE=MEMORY;"
250+ returnValueOrRaise (self ._update (sqlCmd ))
251+ try :
252+ sqlCmd = "INSERT INTO to_delete_EntityId (EntityId) VALUES ( %s )"
253+ returnValueOrRaise (self ._updatemany (sqlCmd , [(e ,) for e in entities ]))
254+ sqlCmd = "DELETE m from `sb_EntityMapping` m JOIN to_delete_EntityId t USING (EntityId)"
255+ if conds :
256+ sqlCmd = " " .join (
257+ [
258+ sqlCmd ,
259+ "JOIN `sb_SandBoxes` s ON s.SBId = m.SBId" ,
260+ "JOIN `sb_Owners` o ON s.OwnerId = o.OwnerId" ,
261+ "WHERE" ,
262+ " AND " .join (conds ),
263+ ]
264+ )
265+ returnValueOrRaise (self ._update (sqlCmd ))
266+ finally :
267+ sqlCmd = "DROP TEMPORARY TABLE to_delete_EntityId"
268+ returnValueOrRaise (self ._update (sqlCmd ))
269+ return 1
276270
277271 def getSandboxesAssignedToEntity (self , entityId , requesterName , requesterGroup , requestedVO ):
278272 """
0 commit comments