Exemple #1
0
/** 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);
    }
}