Verzeichnisstruktur phpBB-3.1.0
- Veröffentlicht
- 27.10.2014
So funktioniert es
|
Auf das letzte Element klicken. Dies geht jeweils ein Schritt zurück |
Auf das Icon klicken, dies öffnet das Verzeichnis. Nochmal klicken schließt das Verzeichnis. |
|
(Beispiel Datei-Icons)
|
Auf das Icon klicken um den Quellcode anzuzeigen |
schema_generator.php
001 <?php
002 /**
003 *
004 * This file is part of the phpBB Forum Software package.
005 *
006 * @copyright (c) phpBB Limited <https://www.phpbb.com>
007 * @license GNU General Public License, version 2 (GPL-2.0)
008 *
009 * For full copyright and license information, please see
010 * the docs/CREDITS.txt file.
011 *
012 */
013
014 namespace phpbb\db\migration;
015
016 /**
017 * The schema generator generates the schema based on the existing migrations
018 */
019 class schema_generator
020 {
021 /** @var \phpbb\config\config */
022 protected $config;
023
024 /** @var \phpbb\db\driver\driver_interface */
025 protected $db;
026
027 /** @var \phpbb\db\tools */
028 protected $db_tools;
029
030 /** @var array */
031 protected $class_names;
032
033 /** @var string */
034 protected $table_prefix;
035
036 /** @var string */
037 protected $phpbb_root_path;
038
039 /** @var string */
040 protected $php_ext;
041
042 /** @var array */
043 protected $tables;
044
045 /** @var array */
046 protected $dependencies = array();
047
048 /**
049 * Constructor
050 */
051 public function __construct(array $class_names, \phpbb\config\config $config, \phpbb\db\driver\driver_interface $db, \phpbb\db\tools $db_tools, $phpbb_root_path, $php_ext, $table_prefix)
052 {
053 $this->config = $config;
054 $this->db = $db;
055 $this->db_tools = $db_tools;
056 $this->class_names = $class_names;
057 $this->phpbb_root_path = $phpbb_root_path;
058 $this->php_ext = $php_ext;
059 $this->table_prefix = $table_prefix;
060 }
061
062 /**
063 * Loads all migrations and their application state from the database.
064 *
065 * @return array
066 */
067 public function get_schema()
068 {
069 if (!empty($this->tables))
070 {
071 return $this->tables;
072 }
073
074 $migrations = $this->class_names;
075
076 $tree = array();
077 $check_dependencies = true;
078 while (!empty($migrations))
079 {
080 foreach ($migrations as $migration_class)
081 {
082 $open_dependencies = array_diff($migration_class::depends_on(), $tree);
083
084 if (empty($open_dependencies))
085 {
086 $migration = new $migration_class($this->config, $this->db, $this->db_tools, $this->phpbb_root_path, $this->php_ext, $this->table_prefix);
087 $tree[] = $migration_class;
088 $migration_key = array_search($migration_class, $migrations);
089
090 foreach ($migration->update_schema() as $change_type => $data)
091 {
092 if ($change_type === 'add_tables')
093 {
094 foreach ($data as $table => $table_data)
095 {
096 $this->tables[$table] = $table_data;
097 }
098 }
099 else if ($change_type === 'drop_tables')
100 {
101 foreach ($data as $table)
102 {
103 unset($this->tables[$table]);
104 }
105 }
106 else if ($change_type === 'add_columns')
107 {
108 foreach ($data as $table => $add_columns)
109 {
110 foreach ($add_columns as $column => $column_data)
111 {
112 if (isset($column_data['after']))
113 {
114 $columns = $this->tables[$table]['COLUMNS'];
115 $offset = array_search($column_data['after'], array_keys($columns));
116 unset($column_data['after']);
117
118 if ($offset === false)
119 {
120 $this->tables[$table]['COLUMNS'][$column] = array_values($column_data);
121 }
122 else
123 {
124 $this->tables[$table]['COLUMNS'] = array_merge(array_slice($columns, 0, $offset + 1, true), array($column => array_values($column_data)), array_slice($columns, $offset));
125 }
126 }
127 else
128 {
129 $this->tables[$table]['COLUMNS'][$column] = $column_data;
130 }
131 }
132 }
133 }
134 else if ($change_type === 'change_columns')
135 {
136 foreach ($data as $table => $change_columns)
137 {
138 foreach ($change_columns as $column => $column_data)
139 {
140 $this->tables[$table]['COLUMNS'][$column] = $column_data;
141 }
142 }
143 }
144 else if ($change_type === 'drop_columns')
145 {
146 foreach ($data as $table => $drop_columns)
147 {
148 if (is_array($drop_columns))
149 {
150 foreach ($drop_columns as $column)
151 {
152 unset($this->tables[$table]['COLUMNS'][$column]);
153 }
154 }
155 else
156 {
157 unset($this->tables[$table]['COLUMNS'][$drop_columns]);
158 }
159 }
160 }
161 else if ($change_type === 'add_unique_index')
162 {
163 foreach ($data as $table => $add_index)
164 {
165 foreach ($add_index as $key => $index_data)
166 {
167 $this->tables[$table]['KEYS'][$key] = array('UNIQUE', $index_data);
168 }
169 }
170 }
171 else if ($change_type === 'add_index')
172 {
173 foreach ($data as $table => $add_index)
174 {
175 foreach ($add_index as $key => $index_data)
176 {
177 $this->tables[$table]['KEYS'][$key] = array('INDEX', $index_data);
178 }
179 }
180 }
181 else if ($change_type === 'drop_keys')
182 {
183 foreach ($data as $table => $drop_keys)
184 {
185 foreach ($drop_keys as $key)
186 {
187 unset($this->tables[$table]['KEYS'][$key]);
188 }
189 }
190 }
191 else
192 {
193 var_dump($change_type);
194 }
195 }
196 unset($migrations[$migration_key]);
197 }
198 else if ($check_dependencies)
199 {
200 $this->dependencies = array_merge($this->dependencies, $open_dependencies);
201 }
202 }
203
204 // Only run this check after the first run
205 if ($check_dependencies)
206 {
207 $this->check_dependencies();
208 $check_dependencies = false;
209 }
210 }
211
212 ksort($this->tables);
213 return $this->tables;
214 }
215
216 /**
217 * Check if one of the migrations files' dependencies can't be resolved
218 * by the supplied list of migrations
219 *
220 * @throws \UnexpectedValueException If a dependency can't be resolved
221 */
222 protected function check_dependencies()
223 {
224 // Strip duplicate values from array
225 $this->dependencies = array_unique($this->dependencies);
226
227 foreach ($this->dependencies as $dependency)
228 {
229 if (!in_array($dependency, $this->class_names))
230 {
231 throw new \UnexpectedValueException("Unable to resolve the dependency '$dependency'");
232 }
233 }
234 }
235 }
236