3 include('../include/admin-header.php');
5 function merge_platforms($platform_to_merge, $destination_platform) {
8 $db->begin_transaction();
10 // First, move all test runs to the test configurations in the destination for all test configurations that
11 // exist in both the original platform and the platform into which we're merging.
12 if (!$db->query_and_get_affected_rows('UPDATE test_runs SET run_config = destination.config_id
13 FROM test_configurations as merged, test_configurations as destination
14 WHERE merged.config_platform = $1 AND destination.config_platform = $2
15 AND run_config = merged.config_id
16 AND destination.config_type = merged.config_type
17 AND destination.config_metric = merged.config_metric', array($platform_to_merge, $destination_platform))) {
18 $db->rollback_transaction();
19 return notice("Failed to migrate test runs for $platform_to_merge that have test configurations in $destination_platform.");
22 // Then migrate test configurations that don't exist in the destination platform to the new platform
23 // so that test runs associated with those configurations are moved to the destination.
24 if ($db->query_and_get_affected_rows('UPDATE test_configurations SET config_platform = $2
25 WHERE config_platform = $1 AND config_metric NOT IN (SELECT config_metric FROM test_configurations WHERE config_platform = $2)',
26 array($platform_to_merge, $destination_platform)) === FALSE) {
27 $db->rollback_transaction();
28 return notice("Failed to migrate test configurations for $platform_to_merge.");
31 if ($db->query_and_fetch_all('SELECT * FROM test_runs, test_configurations WHERE run_config = config_id AND config_platform = $1', array($platform_to_merge))) {
32 // We should never reach here.
33 $db->rollback_transaction();
34 return notice('Failed to migrate all test runs.');
37 $db->query_and_get_affected_rows('DELETE FROM platforms WHERE platform_id = $1', array($platform_to_merge));
38 $db->commit_transaction();
42 if ($action == 'update') {
43 if (update_field('platforms', 'platform', 'name')
44 || update_field('platforms', 'platform', 'hidden'))
45 regenerate_manifest();
47 notice('Invalid parameters.');
48 } else if ($action == 'merge')
49 merge_platforms(intval($_POST['id']), intval($_POST['destination']));
51 $platforms = $db->fetch_table('platforms', 'platform_name');
53 function merge_list($platform_row) {
57 $id = $platform_row['platform_id'];
59 <form method="POST"><input type="hidden" name="id" value="$id">
60 <select name="destination">
63 foreach ($platforms as $platform) {
64 if ($platform['platform_id'] == $id)
67 <option value="{$platform['platform_id']}">{$platform['platform_name']}</option>
73 <button type="submit" name="action" value="merge">Merge</button>
76 return array($content);
79 $page = new AdministrativePage($db, 'platforms', 'platform', array(
80 'name' => array('editing_mode' => 'string'),
81 'hidden' => array('editing_mode' => 'boolean'),
82 'merge into' => array('custom' => function ($platform_row) { return merge_list($platform_row); }),
85 $page->render_table('name');
88 include('../include/admin-footer.php');