| <?php |
| |
| require_once('test-path-resolver.php'); |
| require_once('uploaded-file-helpers.php'); |
| |
| class BuildRequestsFetcher { |
| function __construct($db) { |
| $this->db = $db; |
| $this->rows = null; |
| $this->commit_sets = array(); |
| $this->commits_by_id = array(); |
| $this->commits = array(); |
| $this->commit_sets_by_id = array(); |
| $this->uploaded_files = array(); |
| $this->uploaded_files_by_id = array(); |
| } |
| |
| function fetch_for_task($task_id) { |
| $this->rows = $this->db->query_and_fetch_all('SELECT *, testgroup_task as task_id |
| FROM build_requests LEFT OUTER JOIN builds ON request_build = build_id, analysis_test_groups |
| WHERE request_group = testgroup_id AND testgroup_task = $1 |
| ORDER BY request_group, request_order', array($task_id)); |
| } |
| |
| function fetch_for_group($task_id, $test_group_id) { |
| $this->rows = $this->db->query_and_fetch_all('SELECT * |
| FROM build_requests LEFT OUTER JOIN builds ON request_build = build_id |
| WHERE request_group = $1 ORDER BY request_order', array($test_group_id)); |
| foreach ($this->rows as &$row) |
| $row['task_id'] = $task_id; |
| } |
| |
| function fetch_requests_for_groups($test_groups) { |
| $test_group_id_list = array(); |
| foreach($test_groups as $group) |
| array_push($test_group_id_list, intval($group['testgroup_id'])); |
| |
| $this->rows = $this->db->query_and_fetch_all('SELECT *, testgroup_task as task_id |
| FROM build_requests, analysis_test_groups |
| WHERE request_group = testgroup_id AND testgroup_id = ANY($1) |
| ORDER BY request_group, request_order', array('{' . implode(', ', $test_group_id_list) . '}')); |
| } |
| |
| function fetch_incomplete_requests_for_triggerable($triggerable_id) { |
| $this->rows = $this->db->query_and_fetch_all('SELECT *, test_groups.testgroup_task as task_id FROM build_requests, |
| (SELECT testgroup_id, testgroup_task, (case when testgroup_author is not null then 0 else 1 end) as author_order, testgroup_created_at |
| FROM analysis_test_groups WHERE EXISTS |
| (SELECT 1 FROM build_requests WHERE testgroup_id = request_group AND request_status |
| IN (\'pending\', \'scheduled\', \'running\'))) AS test_groups |
| WHERE request_triggerable = $1 AND request_group = test_groups.testgroup_id |
| ORDER BY author_order, testgroup_created_at, request_order', array($triggerable_id)); |
| } |
| |
| function fetch_request($request_id) { |
| $this->rows = $this->db->select_rows('build_requests', 'request', array('id' => $request_id)); |
| } |
| |
| function has_results() { return is_array($this->rows); } |
| function results() { return $this->results_internal(false); } |
| function results_with_resolved_ids() { return $this->results_internal(true); } |
| |
| private function results_internal($resolve_ids) { |
| if (!$this->rows) |
| return array(); |
| |
| $id_to_platform_name = array(); |
| if ($resolve_ids) { |
| foreach ($this->db->select_rows('platforms', 'platform', array()) as $platform) |
| $id_to_platform_name[$platform['platform_id']] = $platform['platform_name']; |
| } |
| $test_path_resolver = new TestPathResolver($this->db); |
| |
| $requests = array(); |
| foreach ($this->rows as $row) { |
| $test_id = $row['request_test']; |
| $platform_id = $row['request_platform']; |
| $commit_set_id = $row['request_commit_set']; |
| |
| $this->fetch_commits_for_set_if_needed($commit_set_id, $resolve_ids); |
| |
| array_push($requests, array( |
| 'id' => $row['request_id'], |
| 'task' => $row['task_id'], |
| 'triggerable' => $row['request_triggerable'], |
| 'repositoryGroup' => $row['request_repository_group'], |
| 'test' => $resolve_ids ? $test_path_resolver->path_for_test($test_id) : $test_id, |
| 'platform' => $resolve_ids ? $id_to_platform_name[$platform_id] : $platform_id, |
| 'testGroup' => $row['request_group'], |
| 'order' => $row['request_order'], |
| 'commitSet' => $commit_set_id, |
| 'status' => $row['request_status'], |
| 'url' => $row['request_url'], |
| 'build' => $row['request_build'], |
| 'createdAt' => $row['request_created_at'] ? strtotime($row['request_created_at']) * 1000 : NULL, |
| 'statusDescription' => $row['request_status_description'], |
| )); |
| } |
| return $requests; |
| } |
| |
| function commit_sets() { return $this->commit_sets; } |
| function commits() { return $this->commits; } |
| function uploaded_files() { return $this->uploaded_files; } |
| |
| private function fetch_commits_for_set_if_needed($commit_set_id, $resolve_ids) { |
| if (array_key_exists($commit_set_id, $this->commit_sets_by_id)) |
| return; |
| |
| $commit_set_items = $this->db->query_and_fetch_all('SELECT * |
| FROM commit_set_items LEFT OUTER JOIN commits ON commitset_commit = commit_id |
| LEFT OUTER JOIN repositories ON repository_id = commit_repository |
| WHERE commitset_set = $1', array($commit_set_id)); |
| |
| $custom_roots = array(); |
| $revision_items = array(); |
| foreach ($commit_set_items as $row) { |
| $repository_id = $resolve_ids ? $row['repository_name'] : $row['repository_id']; |
| $revision = $row['commit_revision']; |
| $commit_time = $row['commit_time']; |
| |
| $root_file_id = $row['commitset_root_file']; |
| $commit_id = $row['commitset_commit']; |
| if ($root_file_id && !$commit_id) { |
| $this->add_uploaded_file($root_file_id); |
| array_push($custom_roots, $root_file_id); |
| continue; |
| } |
| |
| $patch_file_id = $row['commitset_patch_file']; |
| if ($patch_file_id) |
| $this->add_uploaded_file($patch_file_id); |
| |
| $root_file_id = $row['commitset_root_file']; |
| if ($root_file_id) |
| $this->add_uploaded_file($root_file_id); |
| |
| array_push($revision_items, array( |
| 'commit' => $row['commit_id'], |
| 'patch' => $patch_file_id, |
| 'rootFile' => $root_file_id, |
| 'commitOwner' => $row['commitset_commit_owner'], |
| 'requiresBuild' => Database::is_true($row['commitset_requires_build']))); |
| |
| if (array_key_exists($commit_id, $this->commits_by_id)) |
| continue; |
| |
| array_push($this->commits, array( |
| 'id' => $commit_id, |
| 'repository' => $repository_id, |
| 'commitOwner' => $row['commitset_commit_owner'], |
| 'revision' => $revision, |
| 'time' => Database::to_js_time($commit_time))); |
| |
| $this->commits_by_id[$commit_id] = TRUE; |
| } |
| |
| $this->commit_sets_by_id[$commit_set_id] = TRUE; |
| |
| $owner_commits_rows = $this->db->query_and_fetch_all('SELECT * FROM commits, repositories |
| WHERE commit_repository = repository_id AND commit_id |
| IN (SELECT DISTINCT(commitset_commit_owner) FROM commit_set_items |
| WHERE commitset_set = $1 AND commitset_commit_owner IS NOT NULL)', array($commit_set_id)); |
| |
| foreach ($owner_commits_rows as $row) { |
| $commit_id = $row['commit_id']; |
| if (array_key_exists($commit_id, $this->commits_by_id)) |
| continue; |
| |
| array_push($this->commits, array( |
| 'id' => $commit_id, |
| 'repository' => $resolve_ids ? $row['repository_name'] : $row['repository_id'], |
| 'commitOwner' => NULL, |
| 'revision' => $row['commit_revision'], |
| 'time' => Database::to_js_time($row['commit_time']))); |
| $this->commits_by_id[$commit_id] = TRUE; |
| } |
| |
| array_push($this->commit_sets, array('id' => $commit_set_id, 'revisionItems' => $revision_items, 'customRoots' => $custom_roots)); |
| } |
| |
| private function add_uploaded_file($root_file_id) |
| { |
| if (!array_key_exists($root_file_id, $this->uploaded_files_by_id)) { |
| $uploaded_file_row = $this->db->select_first_row('uploaded_files', 'file', array('id' => $root_file_id)); |
| array_push($this->uploaded_files, format_uploaded_file($uploaded_file_row)); |
| } |
| } |
| } |
| |
| ?> |