/** * {@inheritdoc} */ public function run() { if (!$this->config->get('populate_migration_refresh_before', false)) { if ($this->config->get_time_remaining() < 1) { $this->config->set('populate_migration_refresh_before', true); throw new resource_limit_reached_exception(); } } $finder = $this->extension_manager->get_finder(); $migrations = $finder->core_path('phpbb/db/migration/data/')->get_classes(); $this->migrator->populate_migrations($migrations); }
/** * {@inheritdoc} */ public function run() { $this->language->add_lang('migrator'); if (!isset($this->config['version_update_from'])) { $this->config->set('version_update_from', $this->config['version']); } $original_version = $this->config['version_update_from']; $this->migrator->set_output_handler(new log_wrapper_migrator_output_handler($this->language, new installer_migrator_output_handler($this->iohandler), $this->phpbb_root_path . 'store/migrations_' . time() . '.log', $this->filesystem)); $this->migrator->create_migrations_table(); $migrations = $this->extension_manager->get_finder()->core_path('phpbb/db/migration/data/')->extension_directory('/migrations')->get_classes(); $this->migrator->set_migrations($migrations); $migration_step_count = $this->installer_config->get('database_update_migration_steps', -1); if ($migration_step_count < 0) { $migration_step_count = count($this->migrator->get_installable_migrations()) * 2; $this->installer_config->set('database_update_migration_steps', $migration_step_count); } $progress_count = $this->installer_config->get('database_update_count', 0); $restart_progress_bar = $progress_count === 0; // Only "restart" when the update runs for the first time $this->iohandler->set_task_count($migration_step_count, $restart_progress_bar); $this->installer_config->set_task_progress_count($migration_step_count); while (!$this->migrator->finished()) { try { $this->migrator->update(); $progress_count++; $last_run_migration = $this->migrator->get_last_run_migration(); if (isset($last_run_migration['effectively_installed']) && $last_run_migration['effectively_installed']) { // We skipped two step, so increment $progress_count by another one $progress_count++; } else { if ($last_run_migration['task'] === 'process_schema_step' && !$last_run_migration['state']['migration_schema_done'] || $last_run_migration['task'] === 'process_data_step' && !$last_run_migration['state']['migration_data_done']) { // We just run a step that wasn't counted yet so make it count $migration_step_count++; } } $this->iohandler->set_task_count($migration_step_count); $this->installer_config->set_task_progress_count($migration_step_count); $this->iohandler->set_progress('STAGE_UPDATE_DATABASE', $progress_count); } catch (exception $e) { $msg = $e->getParameters(); array_unshift($msg, $e->getMessage()); $this->iohandler->add_error_message($msg); throw new user_interaction_required_exception(); } if ($this->installer_config->get_time_remaining() <= 0 || $this->installer_config->get_memory_remaining() <= 0) { $this->installer_config->set('database_update_count', $progress_count); $this->installer_config->set('database_update_migration_steps', $migration_step_count); throw new resource_limit_reached_exception(); } } if ($original_version !== $this->config['version']) { $this->log->add('admin', isset($this->user->data['user_id']) ? $this->user->data['user_id'] : ANONYMOUS, $this->user->ip, 'LOG_UPDATE_DATABASE', false, array($original_version, $this->config['version'])); } $this->iohandler->add_success_message('INLINE_UPDATE_SUCCESSFUL'); $this->config->delete('version_update_from'); $this->cache->purge(); $this->config->increment('assets_version', 1); }
/** * Single purge step that reverts any included and installed migrations * * @param mixed $old_state State returned by previous call of this method * @return false Indicates no further steps are required */ public function purge_step($old_state) { $migrations = $this->get_migration_file_list(); $this->migrator->set_migrations($migrations); foreach ($migrations as $migration) { while ($this->migrator->migration_state($migration) !== false) { $this->migrator->revert($migration); return true; } } return false; }
/** * Get the list of migration files from this extension * * @return array */ protected function get_migration_file_list() { if ($this->migrations !== false) { return $this->migrations; } // Only have the finder search in this extension path directory $migrations = $this->extension_finder->extension_directory('/migrations')->find_from_extension($this->extension_name, $this->extension_path); $migrations = $this->extension_finder->get_classes_from_files($migrations); $this->migrator->set_migrations($migrations); $migrations = $this->migrator->get_migrations(); return $migrations; }
/** * {@inheritdoc} */ public function run() { $this->language->add_lang('migrator'); if (!isset($this->config['version_update_from'])) { $this->config->set('version_update_from', $this->config['version']); } $original_version = $this->config['version_update_from']; $this->migrator->set_output_handler(new log_wrapper_migrator_output_handler($this->language, new installer_migrator_output_handler($this->iohandler), $this->phpbb_root_path . 'store/migrations_' . time() . '.log', $this->filesystem)); $this->migrator->create_migrations_table(); $migrations = $this->extension_manager->get_finder()->core_path('phpbb/db/migration/data/')->extension_directory('/migrations')->get_classes(); $this->migrator->set_migrations($migrations); $migration_count = count($this->migrator->get_migrations()); $this->iohandler->set_task_count($migration_count, true); $progress_count = $this->installer_config->get('database_update_count', 0); while (!$this->migrator->finished()) { try { $this->migrator->update(); $progress_count++; $this->iohandler->set_progress('STAGE_UPDATE_DATABASE', $progress_count); } catch (exception $e) { $msg = $e->getParameters(); array_unshift($msg, $e->getMessage()); $this->iohandler->add_error_message($msg); $this->iohandler->send_response(); throw new user_interaction_required_exception(); } if ($this->installer_config->get_time_remaining() <= 0 || $this->installer_config->get_memory_remaining() <= 0) { $this->installer_config->set('database_update_count', $progress_count); throw new resource_limit_reached_exception(); } } if ($original_version !== $this->config['version']) { $this->log->add('admin', isset($this->user->data['user_id']) ? $this->user->data['user_id'] : ANONYMOUS, $this->user->ip, 'LOG_UPDATE_DATABASE', false, array($original_version, $this->config['version'])); } $this->iohandler->finish_progress('INLINE_UPDATE_SUCCESSFUL'); $this->iohandler->add_success_message('INLINE_UPDATE_SUCCESSFUL'); $this->config->delete('version_update_from'); $this->cache->purge(); $this->config->increment('assets_version', 1); }
protected function load_migrations() { $migrations = $this->extension_manager->get_finder()->core_path('phpbb/db/migration/data/')->extension_directory('/migrations')->get_classes(); $this->migrator->set_migrations($migrations); return $this->migrator->get_migrations(); }
/** * {@inheritdoc} */ public function run() { $finder = $this->extension_manager->get_finder(); $migrations = $finder->core_path('phpbb/db/migration/data/')->get_classes(); $this->migrator->populate_migrations($migrations); }
/** * Populate migrations for the installation * * This "installs" all migrations from (root path)/phpbb/db/migrations/data. * "installs" means it adds all migrations to the migrations table, but does not * perform any of the actions in the migrations. * * @param \phpbb\extension\manager $extension_manager * @param \phpbb\db\migrator $migrator */ function populate_migrations($extension_manager, $migrator) { $finder = $extension_manager->get_finder(); $migrations = $finder->core_path('phpbb/db/migration/data/')->get_classes(); $migrator->populate_migrations($migrations); }
/** * Loads all migrations and their application state from the database. * * @return array */ public function get_schema() { if (!empty($this->tables)) { return $this->tables; } $migrations = $this->class_names; $tree = array(); $check_dependencies = true; while (!empty($migrations)) { foreach ($migrations as $key => $migration_class) { // Unset classes that are not a valid migration if (\phpbb\db\migrator::is_migration($migration_class) === false) { unset($migrations[$key]); continue; } $open_dependencies = array_diff($migration_class::depends_on(), $tree); if (empty($open_dependencies)) { $migration = new $migration_class($this->config, $this->db, $this->db_tools, $this->phpbb_root_path, $this->php_ext, $this->table_prefix); $tree[] = $migration_class; $migration_key = array_search($migration_class, $migrations); foreach ($migration->update_schema() as $change_type => $data) { if ($change_type === 'add_tables') { foreach ($data as $table => $table_data) { $this->tables[$table] = $table_data; } } else { if ($change_type === 'drop_tables') { foreach ($data as $table) { unset($this->tables[$table]); } } else { if ($change_type === 'add_columns') { foreach ($data as $table => $add_columns) { foreach ($add_columns as $column => $column_data) { if (isset($column_data['after'])) { $columns = $this->tables[$table]['COLUMNS']; $offset = array_search($column_data['after'], array_keys($columns)); unset($column_data['after']); if ($offset === false) { $this->tables[$table]['COLUMNS'][$column] = array_values($column_data); } else { $this->tables[$table]['COLUMNS'] = array_merge(array_slice($columns, 0, $offset + 1, true), array($column => array_values($column_data)), array_slice($columns, $offset)); } } else { $this->tables[$table]['COLUMNS'][$column] = $column_data; } } } } else { if ($change_type === 'change_columns') { foreach ($data as $table => $change_columns) { foreach ($change_columns as $column => $column_data) { $this->tables[$table]['COLUMNS'][$column] = $column_data; } } } else { if ($change_type === 'drop_columns') { foreach ($data as $table => $drop_columns) { if (is_array($drop_columns)) { foreach ($drop_columns as $column) { unset($this->tables[$table]['COLUMNS'][$column]); } } else { unset($this->tables[$table]['COLUMNS'][$drop_columns]); } } } else { if ($change_type === 'add_unique_index') { foreach ($data as $table => $add_index) { foreach ($add_index as $key => $index_data) { $this->tables[$table]['KEYS'][$key] = array('UNIQUE', $index_data); } } } else { if ($change_type === 'add_index') { foreach ($data as $table => $add_index) { foreach ($add_index as $key => $index_data) { $this->tables[$table]['KEYS'][$key] = array('INDEX', $index_data); } } } else { if ($change_type === 'drop_keys') { foreach ($data as $table => $drop_keys) { foreach ($drop_keys as $key) { unset($this->tables[$table]['KEYS'][$key]); } } } else { var_dump($change_type); } } } } } } } } } unset($migrations[$migration_key]); } else { if ($check_dependencies) { $this->dependencies = array_merge($this->dependencies, $open_dependencies); } } } // Only run this check after the first run if ($check_dependencies) { $this->check_dependencies(); $check_dependencies = false; } } ksort($this->tables); return $this->tables; }