3 require('../include/json-header.php');
5 $paths = array_key_exists('PATH_INFO', $_SERVER) ? explode('/', trim($_SERVER['PATH_INFO'], '/')) : array();
7 if (count($paths) != 1)
8 exit_with_error('InvalidRequest');
10 $parts = explode('-', $paths[0]);
11 if (count($parts) != 2)
12 exit_with_error('InvalidRequest');
16 exit_with_error('DatabaseConnectionFailure');
18 $platform_id = intval($parts[0]);
19 $metric_id = intval($parts[1]);
20 $config_rows = $db->query_and_fetch_all('SELECT config_id, config_type, config_platform, config_metric
21 FROM test_configurations WHERE config_metric = $1 AND config_platform = $2', array($metric_id, $platform_id));
23 exit_with_error('ConfigurationNotFound');
25 $repository_id_to_name = array();
26 if ($repository_table = $db->fetch_table('repositories')) {
27 foreach ($repository_table as $repository)
28 $repository_id_to_name[$repository['repository_id']] = $repository['repository_name'];
31 function fetch_runs_for_config($db, $config) {
32 $raw_runs = $db->query_and_fetch_all('
33 SELECT test_runs.*, builds.*, array_agg((commit_repository, commit_revision, commit_time)) AS revisions
34 FROM builds LEFT OUTER JOIN build_commits ON commit_build = build_id LEFT OUTER JOIN commits ON build_commit = commit_id, test_runs
35 WHERE run_build = build_id AND run_config = $1
36 GROUP BY build_id, run_id', array($config['config_id']));
38 $formatted_runs = array();
40 return $formatted_runs;
42 foreach ($raw_runs as $run)
43 array_push($formatted_runs, format_run($run));
45 return $formatted_runs;
48 date_default_timezone_set('UTC');
49 function parse_revisions_array($postgres_array) {
50 global $repository_id_to_name;
52 // e.g. {"(WebKit,131456,\"2012-10-16 14:53:00\")","(Chromium,162004,)"}
53 $outer_array = json_decode('[' . trim($postgres_array, '{}') . ']');
55 foreach ($outer_array as $item) {
56 $name_and_revision = explode(',', trim($item, '()'));
57 if (!$name_and_revision[0])
59 $time = strtotime(trim($name_and_revision[2], '"')) * 1000;
60 $revisions[$repository_id_to_name[trim($name_and_revision[0], '"')]] = array(trim($name_and_revision[1], '"'), $time);
65 function format_run($run) {
67 'id' => intval($run['run_id']),
68 'mean' => floatval($run['run_mean_cache']),
69 'iterationCount' => intval($run['run_iteration_count_cache']),
70 'sum' => floatval($run['run_sum_cache']),
71 'squareSum' => floatval($run['run_square_sum_cache']),
72 'revisions' => parse_revisions_array($run['revisions']),
73 'buildTime' => strtotime($run['build_time']) * 1000,
74 'buildNumber' => intval($run['build_number']),
75 'builder' => $run['build_builder']);
79 foreach ($config_rows as $config) {
80 if ($runs = fetch_runs_for_config($db, $config))
81 $results[$config['config_type']] = $runs;
84 exit_with_success($results);