コード例 #1
0
 /**
  * {@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);
 }
コード例 #2
0
ファイル: update.php プロジェクト: phpbb/phpbb-core
 /**
  * {@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);
 }
コード例 #3
0
ファイル: base.php プロジェクト: Mtechnik/phpbb
 /**
  * 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;
 }
コード例 #4
0
ファイル: base.php プロジェクト: 007durgesh219/phpbb
 /**
  * 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;
 }
コード例 #5
0
ファイル: update.php プロジェクト: hybiepoo/phpbb
 /**
  * {@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);
 }
コード例 #6
0
ファイル: migration_command.php プロジェクト: phpbb/phpbb
 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();
 }
コード例 #7
0
 /**
  * {@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);
 }
コード例 #8
0
ファイル: install_install.php プロジェクト: hgchen/phpbb
 /**
  * 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);
 }
コード例 #9
0
 /**
  * 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;
 }