/** Remove all related inserts for a given build */ function remove_build($buildid) { if (empty($buildid)) { return; } $buildids = '('; if (is_array($buildid)) { $buildids .= implode(',', $buildid); } else { if (!is_numeric($buildid)) { return; } $buildids .= $buildid; } $buildids .= ')'; pdo_query('DELETE FROM build2group WHERE buildid IN ' . $buildids); pdo_query('DELETE FROM builderror WHERE buildid IN ' . $buildids); pdo_query('DELETE FROM buildemail WHERE buildid IN ' . $buildids); pdo_query('DELETE FROM buildinformation WHERE buildid IN ' . $buildids); pdo_query('DELETE FROM builderrordiff WHERE buildid IN ' . $buildids); pdo_query('DELETE FROM configure WHERE buildid IN ' . $buildids); pdo_query('DELETE FROM configureerror WHERE buildid IN ' . $buildids); pdo_query('DELETE FROM configureerrordiff WHERE buildid IN ' . $buildids); pdo_query('DELETE FROM coveragesummarydiff WHERE buildid IN ' . $buildids); pdo_query('DELETE FROM testdiff WHERE buildid IN ' . $buildids); pdo_query('DELETE FROM buildtesttime WHERE buildid IN ' . $buildids); pdo_query('DELETE FROM summaryemail WHERE buildid IN ' . $buildids); // Remove the buildfailureargument $buildfailureids = '('; $buildfailure = pdo_query('SELECT id FROM buildfailure WHERE buildid IN ' . $buildids); while ($buildfailure_array = pdo_fetch_array($buildfailure)) { if ($buildfailureids != '(') { $buildfailureids .= ','; } $buildfailureids .= $buildfailure_array['id']; } $buildfailureids .= ')'; if (strlen($buildfailureids) > 2) { pdo_query('DELETE FROM buildfailure2argument WHERE buildfailureid IN ' . $buildfailureids); pdo_query('DELETE FROM label2buildfailure WHERE buildfailureid IN ' . $buildfailureids); } // Delete buildfailuredetails that are only used by builds that are being // deleted. $detailsids = '('; $buildfailuredetails = pdo_query('SELECT a.detailsid, count(b.detailsid) AS c FROM buildfailure AS a LEFT JOIN buildfailure AS b ON (a.detailsid=b.detailsid AND b.buildid NOT IN ' . $buildids . ') WHERE a.buildid IN ' . $buildids . ' GROUP BY a.detailsid HAVING count(b.detailsid)=0'); while ($buildfailuredetails_array = pdo_fetch_array($buildfailuredetails)) { if ($detailsids != '(') { $detailsids .= ','; } $detailsids .= $buildfailuredetails_array['detailsid']; } $detailsids .= ')'; if (strlen($detailsids) > 2) { pdo_query('DELETE FROM buildfailuredetails WHERE id IN ' . $detailsids); } // Remove the buildfailure. pdo_query('DELETE FROM buildfailure WHERE buildid IN ' . $buildids); // coverage file are kept unless they are shared $coveragefile = pdo_query('SELECT a.fileid,count(b.fileid) AS c FROM coverage AS a LEFT JOIN coverage AS b ON (a.fileid=b.fileid AND b.buildid NOT IN ' . $buildids . ') WHERE a.buildid IN ' . $buildids . ' GROUP BY a.fileid HAVING count(b.fileid)=0'); $fileids = '('; while ($coveragefile_array = pdo_fetch_array($coveragefile)) { if ($fileids != '(') { $fileids .= ','; } $fileids .= $coveragefile_array['fileid']; } $fileids .= ')'; if (strlen($fileids) > 2) { pdo_query('DELETE FROM coveragefile WHERE id IN ' . $fileids); } pdo_query('DELETE FROM label2coveragefile WHERE buildid IN ' . $buildids); pdo_query('DELETE FROM coverage WHERE buildid IN ' . $buildids); pdo_query('DELETE FROM coveragefilelog WHERE buildid IN ' . $buildids); pdo_query('DELETE FROM coveragesummary WHERE buildid IN ' . $buildids); // dynamicanalysisdefect $dynamicanalysis = pdo_query('SELECT id FROM dynamicanalysis WHERE buildid IN ' . $buildids); $dynids = '('; while ($dynamicanalysis_array = pdo_fetch_array($dynamicanalysis)) { if ($dynids != '(') { $dynids .= ','; } $dynids .= $dynamicanalysis_array['id']; } $dynids .= ')'; if (strlen($dynids) > 2) { pdo_query('DELETE FROM dynamicanalysisdefect WHERE dynamicanalysisid IN ' . $dynids); pdo_query('DELETE FROM label2dynamicanalysis WHERE dynamicanalysisid IN ' . $dynids); } pdo_query('DELETE FROM dynamicanalysis WHERE buildid IN ' . $buildids); pdo_query('DELETE FROM dynamicanalysissummary WHERE buildid IN ' . $buildids); // Delete the note if not shared $noteids = '('; $build2note = pdo_query('SELECT a.noteid,count(b.noteid) AS c FROM build2note AS a LEFT JOIN build2note AS b ON (a.noteid=b.noteid AND b.buildid NOT IN ' . $buildids . ') WHERE a.buildid IN ' . $buildids . ' GROUP BY a.noteid HAVING count(b.noteid)=0'); while ($build2note_array = pdo_fetch_array($build2note)) { // Note is not shared we delete if ($noteids != '(') { $noteids .= ','; } $noteids .= $build2note_array['noteid']; } $noteids .= ')'; if (strlen($noteids) > 2) { pdo_query('DELETE FROM note WHERE id IN ' . $noteids); } pdo_query('DELETE FROM build2note WHERE buildid IN ' . $buildids); // Delete the update if not shared $updateids = '('; $build2update = pdo_query('SELECT a.updateid,count(b.updateid) AS c FROM build2update AS a LEFT JOIN build2update AS b ON (a.updateid=b.updateid AND b.buildid NOT IN ' . $buildids . ') WHERE a.buildid IN ' . $buildids . ' GROUP BY a.updateid HAVING count(b.updateid)=0'); while ($build2update_array = pdo_fetch_array($build2update)) { // Update is not shared we delete if ($updateids != '(') { $updateids .= ','; } $updateids .= $build2update_array['updateid']; } $updateids .= ')'; if (strlen($updateids) > 2) { pdo_query('DELETE FROM buildupdate WHERE id IN ' . $updateids); pdo_query('DELETE FROM updatefile WHERE updateid IN ' . $updateids); } pdo_query('DELETE FROM build2update WHERE buildid IN ' . $buildids); // Delete any tests that are not shared. // First find all the tests from builds that are about to be deleted. $b2t_result = pdo_query("SELECT DISTINCT testid from build2test WHERE buildid IN {$buildids}"); $all_testids = array(); while ($b2t_row = pdo_fetch_array($b2t_result)) { $all_testids[] = $b2t_row['testid']; } // Next identify tests from this list that should be preserved // because they are shared with builds that are not about to be deleted. $testids = '(' . implode(',', $all_testids) . ')'; $save_test_result = pdo_query("SELECT DISTINCT testid FROM build2test\n WHERE testid IN {$testids} AND buildid NOT IN {$buildids}"); $tests_to_save = array(); while ($save_test_row = pdo_fetch_array($save_test_result)) { $tests_to_save[] = $save_test_row['testid']; } // Use array_diff to get the list of tests that should be deleted. $tests_to_delete = array_diff($all_testids, $tests_to_save); if (!empty($tests_to_delete)) { $testids = '(' . implode(',', $tests_to_delete) . ')'; pdo_query("DELETE FROM testmeasurement WHERE testid IN {$testids}"); pdo_query("DELETE FROM test WHERE id IN {$testids}"); $imgids = '('; // Check if the images for the test are not shared $test2image = pdo_query('SELECT a.imgid,count(b.imgid) AS c FROM test2image AS a LEFT JOIN test2image AS b ON (a.imgid=b.imgid AND b.testid NOT IN ' . $testids . ') WHERE a.testid IN ' . $testids . ' GROUP BY a.imgid HAVING count(b.imgid)=0'); while ($test2image_array = pdo_fetch_array($test2image)) { $imgid = $test2image_array['imgid']; if ($imgids != '(') { $imgids .= ','; } $imgids .= $imgid; } $imgids .= ')'; if (strlen($imgids) > 2) { pdo_query('DELETE FROM image WHERE id IN ' . $imgids); } pdo_query('DELETE FROM test2image WHERE testid IN ' . $testids); } pdo_query('DELETE FROM label2test WHERE buildid IN ' . $buildids); pdo_query('DELETE FROM build2test WHERE buildid IN ' . $buildids); // Delete the uploaded files if not shared $fileids = '('; $build2uploadfiles = pdo_query('SELECT a.fileid,count(b.fileid) AS c FROM build2uploadfile AS a LEFT JOIN build2uploadfile AS b ON (a.fileid=b.fileid AND b.buildid NOT IN ' . $buildids . ') WHERE a.buildid IN ' . $buildids . ' GROUP BY a.fileid HAVING count(b.fileid)=0'); while ($build2uploadfile_array = pdo_fetch_array($build2uploadfiles)) { $fileid = $build2uploadfile_array['fileid']; if ($fileids != '(') { $fileids .= ','; } $fileids .= $fileid; unlink_uploaded_file($fileid); } $fileids .= ')'; if (strlen($fileids) > 2) { pdo_query('DELETE FROM uploadfile WHERE id IN ' . $fileids); pdo_query('DELETE FROM build2uploadfile WHERE fileid IN ' . $fileids); } pdo_query('DELETE FROM build2uploadfile WHERE buildid IN ' . $buildids); // Delete the subproject pdo_query('DELETE FROM subproject2build WHERE buildid IN ' . $buildids); // Delete the labels pdo_query('DELETE FROM label2build WHERE buildid IN ' . $buildids); // Remove any children of these builds. if (is_array($buildid)) { // In order to avoid making the list of builds to delete too large // we delete them in batches (one batch per parent). foreach ($buildid as $parentid) { remove_children($parentid); } } else { remove_children($buildid); } // Only delete the buildid at the end so that no other build can get it in the meantime pdo_query('DELETE FROM build WHERE id IN ' . $buildids); add_last_sql_error('remove_build'); }
function remove_children(&$node) { while ($node->firstChild) { while ($node->firstChild->firstChild) { remove_children($node->firstChild); } $node->removeChild($node->firstChild); } }