connect()) exit_with_error('DatabaseConnectionFailure'); $report = json_decode($post_data, true); verify_worker($db, $report); $triggerable_name = array_get($report, 'triggerable'); $triggerable = $db->select_first_row('build_triggerables', 'triggerable', array('name' => $triggerable_name)); if (!$triggerable) exit_with_error('TriggerableNotFound', array('triggerable' => $triggerable_name)); $triggerable_id = $triggerable['triggerable_id']; $configurations = array_get($report, 'configurations'); validate_configurations($db, $configurations); $repository_groups = array_get($report, 'repositoryGroups', array()); validate_repository_groups($db, $repository_groups); $finder = new RepositoryGroupFinder($db, $triggerable_id); foreach ($repository_groups as &$group) $group['existingGroup'] = $finder->find_by_repositories($group['repository_id_list']); $db->begin_transaction(); if ($db->query_and_get_affected_rows('DELETE FROM triggerable_configurations WHERE trigconfig_triggerable = $1', array($triggerable_id)) === false) { $db->rollback_transaction(); exit_with_error('FailedToDeleteExistingConfigurations', array('triggerable' => $triggerable_id)); } foreach ($configurations as &$entry) { $config_info = array('test' => $entry['test'], 'platform' => $entry['platform'], 'triggerable' => $triggerable_id); if (!$db->insert_row('triggerable_configurations', 'trigconfig', $config_info, null)) { $db->rollback_transaction(); exit_with_error('FailedToInsertConfiguration', array('entry' => $entry)); } } foreach ($repository_groups as &$group) { $group_id = $group['existingGroup']; $group_info = array( 'triggerable' => $triggerable_id, 'name' => $group['name'], 'description' => array_get($group, 'description'), 'accepts_roots' => Database::to_database_boolean(array_get($group, 'acceptsRoots', FALSE))); if ($group_id) { if (!$db->update_row('triggerable_repository_groups', 'repositorygroup', array('id' => $group_id), $group_info)) { $db->rollback_transaction(); exit_with_error('FailedToInsertRepositoryGroup', array('repositoryGroup' => $group)); } } else { $group_id = $db->update_or_insert_row('triggerable_repository_groups', 'repositorygroup', array('triggerable' => $triggerable_id, 'name' => $group['name']), $group_info); if (!$group_id) { $db->rollback_transaction(); exit_with_error('FailedToInsertRepositoryGroup', array('repositoryGroup' => $group)); } } if ($db->query_and_get_affected_rows('DELETE FROM triggerable_repositories WHERE trigrepo_group = $1', array($group_id)) === FALSE) { $db->rollback_transaction(); exit_with_error('FailedToDisassociateRepositories', array('repositoryGroup' => $group)); } foreach ($group['repositories'] as $repository_data) { $row = array('group' => $group_id, 'repository' => $repository_data['repository'], 'accepts_patch' => Database::to_database_boolean(array_get($repository_data, 'acceptsPatch', FALSE))); if (!$db->insert_row('triggerable_repositories', 'trigrepo', $row, null)) { $db->rollback_transaction(); exit_with_error('FailedToAssociateRepository', array('repositoryGroup' => $group, 'repository' => $repository_id)); } } } $db->commit_transaction(); $generator = new ManifestGenerator($db); if (!$generator->generate()) exit_with_error('FailedToGenerateManifest'); if (!$generator->store()) exit_with_error('FailedToStoreManifest'); exit_with_success(); } function validate_configurations($db, $configurations) { if (!is_array($configurations)) exit_with_error('InvalidConfigurations', array('configurations' => $configurations)); foreach ($configurations as $entry) { if (!is_array($entry) || !array_key_exists('test', $entry) || !array_key_exists('platform', $entry)) exit_with_error('InvalidConfigurationEntry', array('configurationEntry' => $entry)); } } function validate_repository_groups($db, &$repository_groups) { if (!is_array($repository_groups)) exit_with_error('InvalidRepositoryGroups', array('repositoryGroups' => $repository_groups)); $top_level_repositories = $db->select_rows('repositories', 'repository', array('owner' => null)); $top_level_repository_ids = array(); foreach ($top_level_repositories as $repository_row) $top_level_repository_ids[$repository_row['repository_id']] = true; foreach ($repository_groups as &$group) { if (!is_array($group) || !array_key_exists('name', $group) || !array_key_exists('repositories', $group) || !is_array($group['repositories'])) exit_with_error('InvalidRepositoryGroup', array('repositoryGroup' => $group)); $accepts_roots = array_get($group, 'acceptsRoots', FALSE); if ($accepts_roots !== TRUE && $accepts_roots !== FALSE) exit_with_error('InvalidAcceptsRoots', array('repositoryGroup' => $group, 'acceptsRoots' => accepts_roots)); $repository_list = $group['repositories']; $group_repository_list = array(); foreach ($repository_list as $repository_data) { if (!$repository_data || !is_array($repository_data)) exit_with_error('InvalidRepositoryData', array('repositoryGroup' => $group, 'data' => $repository_data)); $id = array_get($repository_data, 'repository'); if (!$id || !is_numeric($id) || !array_key_exists($id, $top_level_repository_ids)) exit_with_error('InvalidRepository', array('repositoryGroup' => $group, 'repository' => $id)); if (array_key_exists($id, $group_repository_list)) exit_with_error('DuplicateRepository', array('repositoryGroup' => $group, 'repository' => $id)); $accepts_patch = array_get($repository_data, 'acceptsPatch', FALSE); if ($accepts_patch !== TRUE && $accepts_patch !== FALSE) exit_with_error('InvalidRepositoryData', array('repositoryGroup' => $group, 'repository' => $id)); $group_repository_list[$id] = true; } $group['repository_id_list'] = array_keys($group_repository_list); } } main(file_get_contents('php://input')); ?>