示例#1
0
文件: project.php 项目: rpshaw/CDash
 /**
  * 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;
             }
         }
     }
 }
示例#2
0
文件: common.php 项目: rpshaw/CDash
/** 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");
}
示例#3
0
文件: common.php 项目: kitware/cdash
/** 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');
}