3 require('../include/admin-header.php');
4 require('../include/test-name-resolver.php');
6 function add_run($metric_id, $platform_id, $type, $date, $mean) {
9 $db->begin_transaction();
11 $config_id = $db->select_or_insert_row('test_configurations', 'config', array('metric' => $metric_id, 'platform' => $platform_id, 'type' => $type));
13 $db->rollback_transaction();
14 return notice("Failed to add the configuration for metric $metric_id and platform $platform_id");
17 $build_id = $db->insert_row('builds', 'build', array('number' => 0, 'time' => $date));
19 $db->rollback_transaction();
20 return notice("Failed to add a build");
23 // FIXME: Should we insert run_iterations?
24 $run_id = $db->insert_row('test_runs', 'run', array('config' => $config_id, 'build' => $build_id, 'iteration_count_cache' => 1, 'mean_cache' => $mean));
26 $db->rollback_transaction();
27 return notice("Failed to add a run");
30 $db->commit_transaction();
31 notice("Added a baseline test run.");
34 function delete_run($run_id, $build_id) {
37 $db->begin_transaction();
39 $build_counts = $db->query_and_fetch_all('SELECT COUNT(*) FROM test_runs WHERE run_build = $1', array($build_id));
41 $db->rollback_transaction();
42 return notice("Failed to obtain the number of runs for the build $build_id");
45 if ($build_counts[0]['count'] != 1) {
46 $db->rollback_transaction();
47 return notice("The build $build_id doesn't have exactly one run. Either the build id is wrong or it's not a synthetic build.");
50 $removed_runs = $db->query_and_fetch_all('DELETE FROM test_runs WHERE run_id = $1 RETURNING run_build', array($run_id));
51 if (!$removed_runs || count($removed_runs) != 1) {
52 $db->rollback_transaction();
53 return notice("Failed to delete the run $run_id.");
55 $associated_build = $removed_runs[0]['run_build'];
56 if ($associated_build != $build_id) {
57 $db->rollback_transaction();
58 return notice("Failed to delete the run $run_id because it was associated with the build $associated_build instead of the build $build_id");
61 $removed_builds = $db->query_and_get_affected_rows('DELETE FROM builds WHERE build_id = $1', array($build_id));
62 if (!$removed_runs || count($removed_runs) != 1) {
63 $db->rollback_transaction();
64 return notice("Failed to delete the build $build_id.");
67 $db->commit_transaction();
71 date_default_timezone_set('Etc/UTC');
73 if ($action == 'add-run' && array_get($_POST, 'metric') && array_get($_POST, 'platform')
74 && array_get($_POST, 'config-type') && array_get($_POST, 'date') && array_get($_POST, 'mean'))
75 add_run(intval($_POST['metric']), intval($_POST['platform']), $_POST['config-type'], $_POST['date'], floatval($_POST['mean']));
76 else if ($action == 'delete-run' && array_get($_POST, 'run') && array_get($_POST, 'build'))
77 delete_run(intval($_POST['run']), intval($_POST['build']));
79 notice("Invalid arguments");
81 $metric_id = intval(array_get($_GET, 'metric'));
83 $test_name_resolver = new TestNameResolver($db);
84 $full_metric_name = $test_name_resolver->full_name_for_metric($metric_id);
85 echo "<h2>$full_metric_name</h2>";
87 $page = new AdministrativePage($db, 'platforms', 'platform', array(
88 'name' => array('label' => 'Platform Name'),
89 'Configurations' => array('subcolumns'=> array('ID', 'Type'), 'custom' => function ($platform_row) {
90 return generate_rows_for_configurations($platform_row['platform_id']);
92 'Baseline Test Runs' => array('subcolumns'=> array('Run ID', 'Build ID', 'Time', 'Mean', 'Actions'), 'custom' => function ($platform_row) {
93 return generate_rows_for_test_runs($platform_row['platform_id'], 'baseline');
95 'Target Test Runs' => array('subcolumns'=> array('Run ID', 'Build ID', 'Time', 'Mean', 'Actions'), 'custom' => function ($platform_row) {
96 return generate_rows_for_test_runs($platform_row['platform_id'], 'target');
100 function generate_rows_for_configurations($platform_id) {
101 global $test_name_resolver;
104 if ($configurations = $test_name_resolver->configurations_for_metric_and_platform($metric_id, $platform_id)) {
105 foreach ($configurations as $config)
106 array_push($rows, array($config['config_id'], $config['config_type']));
111 function generate_rows_for_test_runs($platform_id, $config_type) {
115 $baseline_runs = $db->query_and_fetch_all('SELECT * FROM test_runs, test_configurations, builds
116 WHERE run_config = config_id AND run_build = build_id
117 AND config_metric = $1 AND config_platform = $2 AND config_type = $3
118 ORDER BY build_time DESC LIMIT 6', array($metric_id, $platform_id, $config_type));
121 if ($baseline_runs) {
122 foreach ($baseline_runs as $run) {
123 $deletion_form = <<< END
125 <input type="hidden" name="run" value="{$run['run_id']}">
126 <input type="hidden" name="build" value="{$run['run_build']}">
127 <button type="submit" name="action" value="delete-run">Delete</button>
130 array_push($rows, array($run['run_id'], $run['build_id'], $run['build_time'], $run['run_mean_cache'], $deletion_form));
137 <input type="hidden" name="metric" value="$metric_id">
138 <input type="hidden" name="platform" value="$platform_id">
139 <input type="hidden" name="config-type" value="$config_type">
140 <label>Date: <input type="text" name="date"></label>
141 <label>Mean: <input type="text" name="mean"></label>
142 <button type="submit" name="action" value="add-run">Add</button>
146 array_push($rows, $form);
151 $page->render_table('name');
154 require('../include/admin-footer.php');