Verzeichnisstruktur phpBB-3.2.0
- Veröffentlicht
- 06.01.2017
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 |
create_schema.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\install\module\install_database\task;
015
016 use phpbb\install\exception\resource_limit_reached_exception;
017
018 /**
019 * Create database schema
020 */
021 class create_schema extends \phpbb\install\task_base
022 {
023 /**
024 * @var \phpbb\install\helper\config
025 */
026 protected $config;
027
028 /**
029 * @var \phpbb\db\driver\driver_interface
030 */
031 protected $db;
032
033 /**
034 * @var \phpbb\db\tools\tools_interface
035 */
036 protected $db_tools;
037
038 /**
039 * @var \phpbb\install\helper\database
040 */
041 protected $database_helper;
042
043 /**
044 * @var \phpbb\filesystem\filesystem_interface
045 */
046 protected $filesystem;
047
048 /**
049 * @var \phpbb\install\helper\iohandler\iohandler_interface
050 */
051 protected $iohandler;
052
053 /**
054 * @var string
055 */
056 protected $phpbb_root_path;
057
058 /**
059 * @var string
060 */
061 protected $php_ext;
062
063 /**
064 * Constructor
065 *
066 * @param \phpbb\install\helper\config $config Installer's config provider
067 * @param \phpbb\install\helper\database $db_helper Installer's database helper
068 * @param \phpbb\filesystem\filesystem_interface $filesystem Filesystem service
069 * @param \phpbb\install\helper\iohandler\iohandler_interface $iohandler Installer's input-output handler
070 * @param string $phpbb_root_path Path phpBB's root
071 * @param string $php_ext Extension of PHP files
072 */
073 public function __construct(\phpbb\install\helper\config $config,
074 \phpbb\install\helper\database $db_helper,
075 \phpbb\filesystem\filesystem_interface $filesystem,
076 \phpbb\install\helper\iohandler\iohandler_interface $iohandler,
077 $phpbb_root_path,
078 $php_ext)
079 {
080 $dbms = $db_helper->get_available_dbms($config->get('dbms'));
081 $dbms = $dbms[$config->get('dbms')]['DRIVER'];
082 $factory = new \phpbb\db\tools\factory();
083
084 $this->db = new $dbms();
085 $this->db->sql_connect(
086 $config->get('dbhost'),
087 $config->get('dbuser'),
088 $config->get('dbpasswd'),
089 $config->get('dbname'),
090 $config->get('dbport'),
091 false,
092 false
093 );
094
095 $this->config = $config;
096 $this->db_tools = $factory->get($this->db);
097 $this->database_helper = $db_helper;
098 $this->filesystem = $filesystem;
099 $this->iohandler = $iohandler;
100 $this->phpbb_root_path = $phpbb_root_path;
101 $this->php_ext = $php_ext;
102
103 parent::__construct(true);
104 }
105
106 /**
107 * {@inheritdoc}
108 */
109 public function run()
110 {
111 // As this task may take a large amount of time to complete refreshing the page might be necessary for some
112 // server configurations with limited resources
113 if (!$this->config->get('pre_schema_forced_refresh'))
114 {
115 if ($this->config->get_time_remaining() < 5)
116 {
117 $this->config->set('pre_schema_forced_refresh', true);
118 throw new resource_limit_reached_exception();
119 }
120 }
121
122 $this->db->sql_return_on_error(true);
123
124 $dbms = $this->config->get('dbms');
125 $dbms_info = $this->database_helper->get_available_dbms($dbms);
126 $schema_name = $dbms_info[$dbms]['SCHEMA'];
127 $delimiter = $dbms_info[$dbms]['DELIM'];
128 $table_prefix = $this->config->get('table_prefix');
129
130 if ($dbms === 'mysql')
131 {
132 if (version_compare($this->db->sql_server_info(true), '4.1.3', '>='))
133 {
134 $schema_name .= '_41';
135 }
136 else
137 {
138 $schema_name .= '_40';
139 }
140 }
141
142 $db_schema_path = $this->phpbb_root_path . 'install/schemas/' . $schema_name . '_schema.sql';
143
144 // Load database vendor specific code if there is any
145 if ($this->filesystem->exists($db_schema_path))
146 {
147 $sql_query = @file_get_contents($db_schema_path);
148 $sql_query = preg_replace('#phpbb_#i', $table_prefix, $sql_query);
149 $sql_query = $this->database_helper->remove_comments($sql_query);
150 $sql_query = $this->database_helper->split_sql_file($sql_query, $delimiter);
151
152 foreach ($sql_query as $sql)
153 {
154 if (!$this->db->sql_query($sql))
155 {
156 $error = $this->db->sql_error($this->db->get_sql_error_sql());
157 $this->iohandler->add_error_message('INST_ERR_DB', $error['message']);
158 }
159 }
160
161 unset($sql_query);
162 }
163
164 $change_prefix = false;
165
166 // Generate database schema
167 if ($this->filesystem->exists($this->phpbb_root_path . 'install/schemas/schema.json'))
168 {
169 $db_table_schema = @file_get_contents($this->phpbb_root_path . 'install/schemas/schema.json');
170 $db_table_schema = json_decode($db_table_schema, true);
171 $change_prefix = true;
172 }
173 else
174 {
175 global $table_prefix;
176
177 $table_prefix = $this->config->get('table_prefix');
178
179 if (!defined('CONFIG_TABLE'))
180 {
181 // We need to include the constants file for the table constants
182 // when we generate the schema from the migration files.
183 include ($this->phpbb_root_path . 'includes/constants.' . $this->php_ext);
184 }
185
186 $finder = new \phpbb\finder($this->filesystem, $this->phpbb_root_path, null, $this->php_ext);
187 $migrator_classes = $finder->core_path('phpbb/db/migration/data/')->get_classes();
188 $factory = new \phpbb\db\tools\factory();
189 $db_tools = $factory->get($this->db, true);
190 $schema_generator = new \phpbb\db\migration\schema_generator(
191 $migrator_classes,
192 new \phpbb\config\config(array()),
193 $this->db,
194 $db_tools,
195 $this->phpbb_root_path,
196 $this->php_ext,
197 $table_prefix
198 );
199 $db_table_schema = $schema_generator->get_schema();
200 }
201
202 if (!defined('CONFIG_TABLE'))
203 {
204 // CONFIG_TABLE is required by sql_create_index() to check the
205 // length of index names. However table_prefix is not defined
206 // here yet, so we need to create the constant ourselves.
207 define('CONFIG_TABLE', $table_prefix . 'config');
208 }
209
210 foreach ($db_table_schema as $table_name => $table_data)
211 {
212 $this->db_tools->sql_create_table(
213 ( ($change_prefix) ? ($table_prefix . substr($table_name, 6)) : $table_name ),
214 $table_data
215 );
216 }
217 }
218
219 /**
220 * {@inheritdoc}
221 */
222 static public function get_step_count()
223 {
224 return 1;
225 }
226
227 /**
228 * {@inheritdoc}
229 */
230 public function get_task_lang_name()
231 {
232 return 'TASK_CREATE_DATABASE_SCHEMA';
233 }
234 }
235