def removeEntry(self, uidAuthor, idSchedGroup, fCascade = False, fCommit = False): """ Deletes a scheduling group. """ # # Input validation and retrival of current data. # if idSchedGroup == 1: raise TMRowInUse('Cannot remove the default scheduling group (id 1).'); oData = SchedGroupDataEx().initFromDbWithId(self._oDb, idSchedGroup); # # We use cascade a little different here... We don't actually delete # associated testboxes or testgroups. # if oData.aoTestBoxes: if fCascade is not True: # Complain about there being associated testboxes. asTestBoxes = ['%s (#%d)' % (oTestBox.sName, oTestBox.idTestBox) for oTestBox in oData.aoTestBoxes]; raise TMRowInUse('Scheduling group #%d is associated with one or more test boxes: %s' % (idSchedGroup, ', '.join(asTestBoxes),)); else: # Reassign testboxes to scheduling group #1 (the default group). oTbLogic = TestBoxLogic(self._oDb); for oTestBox in oData.aoTestBoxes: oTbCopy = TestBoxData().initFromOther(oTestBox); oTbCopy.idSchedGroup = 1; oTbLogic.editEntry(oTbCopy, uidAuthor, fCommit = False); oData = SchedGroupDataEx().initFromDbWithId(self._oDb, idSchedGroup); if oData.aoTestBoxes: raise TMRowInUse('More testboxes was added to the scheduling group as we were trying to delete it.'); # # Remove the group and all member records. # for oMember in oData.aoMembers: self._removeSchedGroupMember(uidAuthor, oMember); self._oDb.execute('UPDATE SchedGroupMembers\n' 'SET tsExpire = CURRENT_TIMESTAMP\n' 'WHERE idSchedGroup = %s\n' ' AND tsExpire = \'infinity\'::TIMESTAMP\n' , (idSchedGroup,)); (tsCur, tsCurMinusOne) = self._oDb.getCurrentTimestamps(); if oData.tsEffective != tsCur and oData.tsEffective != tsCurMinusOne: self._historizeEntry(idSchedGroup, tsCurMinusOne); self._readdEntry(uidAuthor, oData, tsCurMinusOne); self._historizeEntry(idSchedGroup); self._oDb.execute('UPDATE SchedGroups\n' 'SET tsExpire = CURRENT_TIMESTAMP\n' 'WHERE idSchedGroup = %s\n' ' AND tsExpire = \'infinity\'::TIMESTAMP\n' , (idSchedGroup,)) self._oDb.maybeCommit(fCommit) return True;
def removeEntry(self, uidAuthor, idBuildCategory, fCascade = False, fCommit = False): """ Tries to delete the build category. Note! Does not implement cascading. This is intentional! """ # # Check that the build category isn't used by anyone. # self._oDb.execute('SELECT COUNT(idBuild)\n' 'FROM Builds\n' 'WHERE idBuildCategory = %s\n' , (idBuildCategory,)); cBuilds = self._oDb.fetchOne()[0]; if cBuilds > 0: raise TMRowInUse('Build category #%d is used by %d builds and can therefore not be deleted.' % (idBuildCategory, cBuilds,)); # # Ok, it's not used, so just delete it. # (No history on this table. This code is for typos.) # self._oDb.execute('DELETE FROM Builds\n' 'WHERE idBuildCategory = %s\n' , (idBuildCategory,)); self._oDb.maybeCommit(fCommit); _ = uidAuthor; _ = fCascade; return True;
def _assertUnique(self, sName, idSchedGroupIgnore=None): """ Checks that the scheduling group name is unique. Raises exception if the name is already in use. """ if idSchedGroupIgnore is None: self._oDb.execute( 'SELECT idSchedGroup\n' 'FROM SchedGroups\n' 'WHERE tsExpire = \'infinity\'::TIMESTAMP\n' ' AND sName = %s\n', (sName, )) else: self._oDb.execute( 'SELECT idSchedGroup\n' 'FROM SchedGroups\n' 'WHERE tsExpire = \'infinity\'::TIMESTAMP\n' ' AND sName = %s\n' ' AND idSchedGroup <> %s\n', ( sName, idSchedGroupIgnore, )) if self._oDb.getRowCount() > 0: raise TMRowInUse('Scheduling group name (%s) is already in use.' % (sName, )) return True
def removeEntry(self, uidAuthor, idFailureCategory, fCascade = False, fCommit = False): """ Deletes a failure reason category. """ _ = fCascade; # too complicated for now. # # Check whether it's being used by other tables and bitch if it is . # We currently do not implement cascading. # self._oDb.execute('SELECT CONCAT(idFailureReason, \' - \', sShort)\n' 'FROM FailureReasons\n' 'WHERE idFailureCategory = %s\n' ' AND tsExpire = \'infinity\'::TIMESTAMP\n' , (idFailureCategory,)); aaoRows = self._oDb.fetchAll(); if aaoRows: raise TMRowInUse('Cannot remove failure reason category %u because its being used by: %s' % (idFailureCategory, ', '.join(aoRow[0] for aoRow in aaoRows),)); # # Do the job. # oData = FailureCategoryData().initFromDbWithId(self._oDb, idFailureCategory); (tsCur, tsCurMinusOne) = self._oDb.getCurrentTimestamps(); if oData.tsEffective != tsCur and oData.tsEffective != tsCurMinusOne: self._historizeEntry(idFailureCategory, tsCurMinusOne); self._readdEntry(uidAuthor, oData, tsCurMinusOne); self._historizeEntry(idFailureCategory); self._oDb.maybeCommit(fCommit); return True;
def removeEntry(self, uidAuthor, idFailureReason, fCascade=False, fCommit=False): """ Deletes a failure reason. """ _ = fCascade # too complicated for now. # # Check whether it's being used by other tables and bitch if it is . # We currently do not implement cascading. # self._oDb.execute( 'SELECT CONCAT(idBlacklisting, \' - blacklisting\')\n' 'FROM BuildBlacklist\n' 'WHERE idFailureReason = %s\n' ' AND tsExpire = \'infinity\'::TIMESTAMP\n' 'UNION\n' 'SELECT CONCAT(idTestResult, \' - test result failure reason\')\n' 'FROM TestResultFailures\n' 'WHERE idFailureReason = %s\n' ' AND tsExpire = \'infinity\'::TIMESTAMP\n', ( idFailureReason, idFailureReason, )) aaoRows = self._oDb.fetchAll() if aaoRows: raise TMRowInUse( 'Cannot remove failure reason %u because its being used by: %s' % ( idFailureReason, ', '.join(aoRow[0] for aoRow in aaoRows), )) # # Do the job. # oData = FailureReasonData().initFromDbWithId(self._oDb, idFailureReason) assert oData.idFailureReason == idFailureReason (tsCur, tsCurMinusOne) = self._oDb.getCurrentTimestamps() if oData.tsEffective != tsCur and oData.tsEffective != tsCurMinusOne: self._historizeEntry(idFailureReason, tsCurMinusOne) self._readdEntry(uidAuthor, oData, tsCurMinusOne) self._historizeEntry(idFailureReason) self._oDb.maybeCommit(fCommit) return True
def removeEntry(self, uidAuthor, idBuildSrc, fCascade=False, fCommit=False): """ Deletes a build sources. """ # # Check cascading. # if fCascade is not True: self._oDb.execute( 'SELECT idSchedGroup, sName\n' 'FROM SchedGroups\n' 'WHERE idBuildSrc = %s\n' ' OR idBuildSrcTestSuite = %s\n', ( idBuildSrc, idBuildSrc, )) if self._oDb.getRowCount() > 0: asGroups = [] for aoRow in self._oDb.fetchAll(): asGroups.append('%s (#%d)' % (aoRow[1], aoRow[0])) raise TMRowInUse( 'Build source #%d is used by one or more scheduling groups: %s' % ( idBuildSrc, ', '.join(asGroups), )) else: self._oDb.execute( 'UPDATE SchedGroups\n' 'SET idBuildSrc = NULL\n' 'WHERE idBuildSrc = %s', (idBuildSrc, )) self._oDb.execute( 'UPDATE SchedGroups\n' 'SET idBuildSrcTestSuite = NULL\n' 'WHERE idBuildSrcTestSuite = %s', (idBuildSrc, )) # # Do the job. # self._historizeBuildSource(idBuildSrc, None) _ = uidAuthor ## @todo record deleter. self._oDb.maybeCommit(fCommit) return True
def removeEntry(self, uidAuthor, idTestGroup, fCascade = False, fCommit = False): """ Deletes a test group. """ _ = uidAuthor; ## @todo record uidAuthor. # # Cascade. # if fCascade is not True: self._oDb.execute('SELECT SchedGroups.idSchedGroup, SchedGroups.sName\n' 'FROM SchedGroupMembers, SchedGroups\n' 'WHERE SchedGroupMembers.idTestGroup = %s\n' ' AND SchedGroupMembers.tsExpire = \'infinity\'::TIMESTAMP\n' ' AND SchedGroups.idSchedGroup = SchedGroupMembers.idSchedGroup\n' ' AND SchedGroups.tsExpire = \'infinity\'::TIMESTAMP\n' , ( idTestGroup, )); aoGroups = self._oDb.fetchAll(); if aoGroups: asGroups = ['%s (#%d)' % (sName, idSchedGroup) for idSchedGroup, sName in aoGroups]; raise TMRowInUse('Test group #%d is member of one or more scheduling groups: %s' % (idTestGroup, ', '.join(asGroups),)); else: self._oDb.execute('UPDATE SchedGroupMembers\n' 'SET tsExpire = CURRENT_TIMESTAMP\n' 'WHERE idTestGroup = %s\n' ' AND tsExpire = \'infinity\'::TIMESTAMP\n' , ( idTestGroup, )); # # Remove the group. # self._oDb.execute('UPDATE TestGroupMembers\n' 'SET tsExpire = CURRENT_TIMESTAMP\n' 'WHERE idTestGroup = %s\n' ' AND tsExpire = \'infinity\'::TIMESTAMP\n' , (idTestGroup,)) self._oDb.execute('UPDATE TestGroups\n' 'SET tsExpire = CURRENT_TIMESTAMP\n' 'WHERE idTestGroup = %s\n' ' AND tsExpire = \'infinity\'::TIMESTAMP\n' , (idTestGroup,)) self._oDb.maybeCommit(fCommit) return True;