/** * Checks whether this project has exceeded its upload size quota. If so, * Removes the files (starting with the oldest builds) until the total upload size * is <= the upload quota. */ function CullUploadedFiles() { if (!$this->Id) { add_log('Id not set', 'Project::CullUploadedFiles', LOG_ERR); return false; } $totalUploadSize = $this->GetUploadsTotalSize(); if ($totalUploadSize > $this->UploadQuota) { require_once 'cdash/common.php'; add_log('Upload quota exceeded, removing old files', 'Project::CullUploadedFiles', LOG_INFO, $this->Id); $query = pdo_query("SELECT DISTINCT build.id AS id, build.starttime\n FROM build, build2uploadfile, uploadfile\n WHERE build.projectid=" . qnum($this->Id) . " AND\n build.id=build2uploadfile.buildid AND\n build2uploadfile.fileid=uploadfile.id\n ORDER BY build.starttime ASC"); while ($builds_array = pdo_fetch_array($query)) { // Delete the uploaded files $fileids = '('; $build2uploadfiles = pdo_query("SELECT fileid FROM build2uploadfile\n WHERE buildid = " . qnum($builds_array['id'])); while ($build2uploadfile_array = pdo_fetch_array($build2uploadfiles)) { $fileid = $build2uploadfile_array['fileid']; if ($fileids != '(') { $fileids .= ','; } $fileids .= $fileid; $totalUploadSize -= unlink_uploaded_file($fileid); add_log("Removed file {$fileid}", 'Project::CullUploadedFiles', LOG_INFO, $this->Id); } $fileids .= ')'; if (strlen($fileids) > 2) { pdo_query("DELETE FROM uploadfile WHERE id IN " . $fileids); pdo_query("DELETE FROM build2uploadfile WHERE fileid IN " . $fileids); } // Stop if we get below the quota if ($totalUploadSize <= $this->UploadQuota) { break; } } } }
/** 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); pdo_query("DELETE FROM errorlog 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\n FROM buildfailure AS a\n LEFT JOIN buildfailure AS b\n ON (a.detailsid=b.detailsid AND b.buildid NOT IN " . $buildids . ")\n WHERE a.buildid IN " . $buildids . "\n 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\n FROM coverage AS a LEFT JOIN coverage AS b\n ON (a.fileid=b.fileid AND b.buildid NOT IN " . $buildids . ") WHERE a.buildid IN " . $buildids . "\n 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); // Delete the note if not shared $noteids = '('; $build2note = pdo_query("SELECT a.noteid,count(b.noteid) AS c\n FROM build2note AS a LEFT JOIN build2note AS b\n ON (a.noteid=b.noteid AND b.buildid NOT IN " . $buildids . ") WHERE a.buildid IN " . $buildids . "\n 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\n FROM build2update AS a LEFT JOIN build2update AS b\n ON (a.updateid=b.updateid AND b.buildid NOT IN " . $buildids . ") WHERE a.buildid IN " . $buildids . "\n 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 the test if not shared $build2test = pdo_query("SELECT a.testid,count(b.testid) AS c\n FROM build2test AS a LEFT JOIN build2test AS b\n ON (a.testid=b.testid AND b.buildid NOT IN " . $buildids . ") WHERE a.buildid IN " . $buildids . "\n GROUP BY a.testid HAVING count(b.testid)=0"); $testids = '('; while ($build2test_array = pdo_fetch_array($build2test)) { $testid = $build2test_array["testid"]; if ($testids != '(') { $testids .= ','; } $testids .= $testid; } $testids .= ')'; if (strlen($testids) > 2) { 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\n FROM test2image AS a LEFT JOIN test2image AS b\n ON (a.imgid=b.imgid AND b.testid NOT IN " . $testids . ") WHERE a.testid IN " . $testids . "\n 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\n FROM build2uploadfile AS a LEFT JOIN build2uploadfile AS b\n ON (a.fileid=b.fileid AND b.buildid NOT IN " . $buildids . ") WHERE a.buildid IN " . $buildids . "\n 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); // 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"); }
/** 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'); }