function main()
{
    $data = ensure_privileged_api_data_and_token();
    $test_group_id = array_get($data, 'group');
    if (!$test_group_id) {
        exit_with_error('TestGroupNotSpecified');
    }
    $values = array();
    if (array_key_exists('name', $data)) {
        $values['name'] = $data['name'];
    }
    if (array_key_exists('hidden', $data)) {
        $values['hidden'] = Database::to_database_boolean($data['hidden']);
    }
    if (!$values) {
        exit_with_error('NothingToUpdate');
    }
    $db = connect();
    $db->begin_transaction();
    if (!$db->update_row('analysis_test_groups', 'testgroup', array('id' => $test_group_id), $values)) {
        $db->rollback_transaction();
        exit_with_error('FailedToUpdateTestGroup', array('id' => $test_group_id, 'values' => $values));
    }
    if (array_get($data, 'hidden')) {
        $db->query_and_get_affected_rows('UPDATE build_requests SET request_status = $1
            WHERE request_group = $2 AND request_status = $3', array('canceled', $test_group_id, 'pending'));
    }
    $db->commit_transaction();
    exit_with_success();
}
function main()
{
    $data = ensure_privileged_api_data_and_token();
    $analysis_task_id = array_get($data, 'task');
    if (!$analysis_task_id) {
        exit_with_error('AnalysisTaskNotSpecified');
    }
    $values = array();
    if (array_key_exists('name', $data)) {
        $values['name'] = $data['name'];
    }
    if (array_key_exists('result', $data)) {
        require_match_one_of_values('Result', $data['result'], array(null, 'progression', 'regression', 'unchanged', 'inconclusive'));
        $values['result'] = $data['result'];
    }
    if (array_key_exists('needed', $data)) {
        $needed = $data['needed'];
        if ($needed === null) {
            $values['needed'] = null;
        } else {
            if (in_array($needed, array(0, false))) {
                $values['needed'] = Database::to_database_boolean(false);
            } else {
                if (in_array($needed, array(1, true))) {
                    $values['needed'] = Database::to_database_boolean(true);
                } else {
                    exit_with_error('InvalidValueForFeedback', array('value' => $data['needed']));
                }
            }
        }
    }
    if (!$values) {
        exit_with_error('NothingToUpdate');
    }
    $db = connect();
    $db->begin_transaction();
    if (!$db->update_row('analysis_tasks', 'task', array('id' => $analysis_task_id), $values)) {
        $db->rollback_transaction();
        exit_with_error('FailedToUpdateTask', array('id' => $analysis_task_id, 'values' => $values));
    }
    $db->commit_transaction();
    exit_with_success();
}
function main()
{
    $data = ensure_privileged_api_data_and_token();
    $analysis_task_id = array_get($data, 'task');
    $repository_id = array_get($data, 'repository');
    $revision = array_get($data, 'revision');
    $kind = array_get($data, 'kind');
    $commit_id_to_diassociate = array_get($data, 'commit');
    $db = connect();
    $db->begin_transaction();
    require_format('AnalysisTask', $analysis_task_id, '/^\\d+$/');
    if ($commit_id_to_diassociate) {
        require_format('Commit', $commit_id_to_diassociate, '/^\\d*$/');
        $count = $db->query_and_get_affected_rows("DELETE FROM task_commits WHERE taskcommit_task = \$1 AND taskcommit_commit = \$2", array($analysis_task_id, $commit_id_to_diassociate));
        if ($count != 1) {
            $db->rollback_transaction();
            exit_with_error('UnexpectedNumberOfAffectedRows', array('affectedRows' => $count));
        }
    } else {
        require_format('Repository', $repository_id, '/^\\d+$/');
        require_format('Kind', $kind, '/^(cause|fix)$/');
        $commit_info = array('repository' => $repository_id, 'revision' => $revision);
        $commit_rows = $db->query_and_fetch_all('SELECT commit_id FROM commits WHERE commit_repository = $1 AND commit_revision LIKE $2 LIMIT 2', array($repository_id, '%' . Database::escape_for_like($revision) . '%'));
        if (count($commit_rows) > 1) {
            $db->rollback_transaction();
            exit_with_error('AmbiguousRevision', $commit_info);
        } else {
            if (!$commit_rows) {
                $db->rollback_transaction();
                exit_with_error('CommitNotFound', $commit_info);
            }
        }
        $commit_id = $commit_rows[0]['commit_id'];
        $association = array('task' => $analysis_task_id, 'commit' => $commit_id, 'is_fix' => Database::to_database_boolean($kind == 'fix'));
        $commit_id = $db->update_or_insert_row('task_commits', 'taskcommit', array('task' => $analysis_task_id, 'commit' => $commit_id), $association, 'commit');
        if (!$commit_id) {
            $db->rollback_transaction();
            exit_with_error('FailedToAssociateCommit', $association);
        }
    }
    $db->commit_transaction();
    exit_with_success();
}