diff options
| author | Nils Adermann <naderman@naderman.de> | 2014-03-29 16:29:33 -0400 |
|---|---|---|
| committer | Nils Adermann <naderman@naderman.de> | 2014-03-29 16:29:33 -0400 |
| commit | 308e8b0c9689334ef45fad9a9ed0f0ae63746bc7 (patch) | |
| tree | 8f31cf74280c12ef0aae139b24e1ed78207b8445 /phpBB/phpbb/db/migration/schema_generator.php | |
| parent | f426fa02951b5131f77ad2c4596a0bd87ef23d84 (diff) | |
| parent | 8824a53b0a539d63fe10e5e12ef1889fe90d4187 (diff) | |
| download | forums-308e8b0c9689334ef45fad9a9ed0f0ae63746bc7.tar forums-308e8b0c9689334ef45fad9a9ed0f0ae63746bc7.tar.gz forums-308e8b0c9689334ef45fad9a9ed0f0ae63746bc7.tar.bz2 forums-308e8b0c9689334ef45fad9a9ed0f0ae63746bc7.tar.xz forums-308e8b0c9689334ef45fad9a9ed0f0ae63746bc7.zip | |
Merge remote-tracking branch 'github-nickvergessen/ticket/11459' into develop-ascraeus
* github-nickvergessen/ticket/11459: (21 commits)
[ticket/11459] Make 3.1.0-dev migration depend on migrations_table
[ticket/11459] Move $supported_dbms to beginning of create schema file
[ticket/11459] Fix missing constant CONFIG_TABLE for sql_create_index()
[ticket/11459] Fix auth provider test
[ticket/11459] Correctly set up the database from schema in unit tests
[ticket/11459] Install DB schema from json file
[ticket/11459] Clean up a little more
[ticket/11459] Do not add table schema to database schema files
[ticket/11459] Create schema.json from migration files
[ticket/11459] Do not take files of extensions into account
[ticket/11459] Pass array with migration class names to schema generator
[ticket/11459] Refresh schema files
[ticket/11459] Remove spaces from the end of lines in MSSQL
[ticket/11459] Correctly handle index column length
[ticket/11459] Add migration for migrations table
[ticket/11459] Update doc blocks
[ticket/11459] Remove old schema file
[ticket/11459] Update schema files with new script
[ticket/11459] Use new migration/schema_generator to create schema files
[ticket/11459] Add Schema from 3.0.0
...
Diffstat (limited to 'phpBB/phpbb/db/migration/schema_generator.php')
| -rw-r--r-- | phpBB/phpbb/db/migration/schema_generator.php | 179 |
1 files changed, 179 insertions, 0 deletions
diff --git a/phpBB/phpbb/db/migration/schema_generator.php b/phpBB/phpbb/db/migration/schema_generator.php new file mode 100644 index 0000000000..a7e2fa8f06 --- /dev/null +++ b/phpBB/phpbb/db/migration/schema_generator.php @@ -0,0 +1,179 @@ +<?php +/** +* +* @package db +* @copyright (c) 2014 phpBB Group +* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2 +* +*/ + +namespace phpbb\db\migration; + +/** +* The schema generator generates the schema based on the existing migrations +* +* @package db +*/ +class schema_generator +{ + /** @var \phpbb\config\config */ + protected $config; + + /** @var \phpbb\db\driver\driver */ + protected $db; + + /** @var \phpbb\db\tools */ + protected $db_tools; + + /** @var array */ + protected $class_names; + + /** @var string */ + protected $table_prefix; + + /** @var string */ + protected $phpbb_root_path; + + /** @var string */ + protected $php_ext; + + /** @var array */ + protected $tables; + + /** + * Constructor + */ + public function __construct(array $class_names, \phpbb\config\config $config, \phpbb\db\driver\driver $db, \phpbb\db\tools $db_tools, $phpbb_root_path, $php_ext, $table_prefix) + { + $this->config = $config; + $this->db = $db; + $this->db_tools = $db_tools; + $this->class_names = $class_names; + $this->phpbb_root_path = $phpbb_root_path; + $this->php_ext = $php_ext; + $this->table_prefix = $table_prefix; + } + + /** + * 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(); + while (!empty($migrations)) + { + foreach ($migrations as $migration_class) + { + $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) + { + $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]); + } + } + } + + ksort($this->tables); + return $this->tables; + } +} |
