14 private $utf8mb4_tables = [
16 'access_collection_membership',
22 'entity_relationships',
28 'users_remember_me_cookies',
40 private $non_mb4_columns = [
79 'name' =>
'object_class',
84 'name' =>
'object_type',
89 'name' =>
'object_subtype',
99 'name' =>
'river_key',
101 'columns' => [
'object_type',
'object_subtype',
'event']
126 $rows =
_elgg_services()->db->getConnection(DbConfig::READ)->executeQuery(
"SHOW TABLE STATUS FROM `{$config['database']}`");
128 $prefixed_table_names = array_map(
function ($t) use (
$config) {
129 return "{$config['prefix']}{$t}";
130 }, $this->utf8mb4_tables);
132 foreach (
$rows->fetchAllAssociative() as $row) {
133 $row = (object) $row;
134 if (in_array($row->Name, $prefixed_table_names) && $row->Collation !==
'utf8mb4_general_ci') {
158 $db_result =
_elgg_services()->db->getConnection(DbConfig::READ)->executeQuery(
"SHOW GLOBAL VARIABLES LIKE 'innodb_large_prefix'");
159 $rows = $db_result->fetchAllAssociative();
161 if (empty(
$rows) ||
$rows[0][
'Value'] ===
'OFF') {
163 _elgg_services()->db->getConnection(DbConfig::WRITE)->executeStatement(
"SET GLOBAL innodb_large_prefix = 'ON'");
165 }
catch (\Exception $e) {
168 $result->addError(
"Failure to set 'innodb_large_prefix'. Ask your database administrator for more information.");
169 $result->addError(
"Alternatively ask the database administrator to (temporarily) set 'innodb_large_prefix' to 'ON'.");
170 $result->addError($e->getMessage());
177 $connection =
_elgg_services()->db->getConnection(DbConfig::WRITE);
178 $connection->executeStatement(
"
180 `{$config['database']}`
181 CHARACTER SET = utf8mb4
182 COLLATE = utf8mb4_unicode_ci
185 foreach ($this->utf8mb4_tables as
$table) {
186 if (!empty($this->non_mb4_columns[
$table])) {
190 $connection->executeStatement(
"
191 ALTER TABLE {$config['prefix']}{$table}
195 $connection->executeStatement(
"
196 ALTER TABLE {$config['prefix']}{$table}
197 DROP KEY {$index['name']}
204 $connection->executeStatement(
"
205 ALTER TABLE {$config['prefix']}{$table}
209 $connection->executeStatement(
"
210 ALTER TABLE {$config['prefix']}{$table}
211 CONVERT TO CHARACTER SET utf8mb4
212 COLLATE utf8mb4_general_ci
215 if (!empty($this->non_mb4_columns[
$table])) {
217 if (empty(
$index[
'columns'])) {
219 $connection->executeStatement(
"
220 ALTER TABLE {$config['prefix']}{$table}
221 MODIFY $column VARCHAR(255)
223 COLLATE utf8_unicode_ci
233 $sql .=
" UNIQUE ({$index['name']})";
234 }
else if (
$index[
'primary']) {
235 $sql .=
" PRIMARY KEY ({$index['name']})";
238 $key_columns = implode(
',', $key_columns);
239 $sql .=
" KEY {$index['name']} ($key_columns)";
242 $connection->executeStatement(
"
243 ALTER TABLE {$config['prefix']}{$table}
249 }
catch (\Exception $e) {
251 $result->addError($e->getMessage());
return[ 'admin/delete_admin_notices'=>['access'=> 'admin'], 'admin/menu/save'=>['access'=> 'admin'], 'admin/plugins/activate'=>['access'=> 'admin'], 'admin/plugins/activate_all'=>['access'=> 'admin'], 'admin/plugins/deactivate'=>['access'=> 'admin'], 'admin/plugins/deactivate_all'=>['access'=> 'admin'], 'admin/plugins/set_priority'=>['access'=> 'admin'], 'admin/security/security_txt'=>['access'=> 'admin'], 'admin/security/settings'=>['access'=> 'admin'], 'admin/security/regenerate_site_secret'=>['access'=> 'admin'], 'admin/site/cache/invalidate'=>['access'=> 'admin'], 'admin/site/flush_cache'=>['access'=> 'admin'], 'admin/site/icons'=>['access'=> 'admin'], 'admin/site/set_maintenance_mode'=>['access'=> 'admin'], 'admin/site/set_robots'=>['access'=> 'admin'], 'admin/site/theme'=>['access'=> 'admin'], 'admin/site/unlock_upgrade'=>['access'=> 'admin'], 'admin/site/settings'=>['access'=> 'admin'], 'admin/upgrade'=>['access'=> 'admin'], 'admin/upgrade/reset'=>['access'=> 'admin'], 'admin/user/ban'=>['access'=> 'admin'], 'admin/user/bulk/ban'=>['access'=> 'admin'], 'admin/user/bulk/delete'=>['access'=> 'admin'], 'admin/user/bulk/unban'=>['access'=> 'admin'], 'admin/user/bulk/validate'=>['access'=> 'admin'], 'admin/user/change_email'=>['access'=> 'admin'], 'admin/user/delete'=>['access'=> 'admin'], 'admin/user/login_as'=>['access'=> 'admin'], 'admin/user/logout_as'=>[], 'admin/user/makeadmin'=>['access'=> 'admin'], 'admin/user/resetpassword'=>['access'=> 'admin'], 'admin/user/removeadmin'=>['access'=> 'admin'], 'admin/user/unban'=>['access'=> 'admin'], 'admin/user/validate'=>['access'=> 'admin'], 'annotation/delete'=>[], 'avatar/upload'=>[], 'comment/save'=>[], 'diagnostics/download'=>['access'=> 'admin'], 'entity/chooserestoredestination'=>[], 'entity/delete'=>[], 'entity/mute'=>[], 'entity/restore'=>[], 'entity/subscribe'=>[], 'entity/trash'=>[], 'entity/unmute'=>[], 'entity/unsubscribe'=>[], 'login'=>['access'=> 'logged_out'], 'logout'=>[], 'notifications/mute'=>['access'=> 'public'], 'plugins/settings/remove'=>['access'=> 'admin'], 'plugins/settings/save'=>['access'=> 'admin'], 'plugins/usersettings/save'=>[], 'register'=>['access'=> 'logged_out', 'middleware'=>[\Elgg\Router\Middleware\RegistrationAllowedGatekeeper::class,],], 'river/delete'=>[], 'settings/notifications'=>[], 'settings/notifications/subscriptions'=>[], 'user/changepassword'=>['access'=> 'public'], 'user/requestnewpassword'=>['access'=> 'public'], 'useradd'=>['access'=> 'admin'], 'usersettings/save'=>[], 'widgets/add'=>[], 'widgets/delete'=>[], 'widgets/move'=>[], 'widgets/save'=>[],]
Database configuration service.
Class to extend for asynchronous upgrades, i.e.
Result of a single BatchUpgrade run.
Updates database charset to utf8mb4.
shouldBeSkipped()
{Should this upgrade be skipped?If true, the upgrade will not be performed and cannot be accessed lat...
countItems()
{The total number of items to process during the upgrade.If unknown, Batch::UNKNOWN_COUNT should be r...
run(Result $result, $offset)
{Runs upgrade on a single batch of items.If countItems() returns Batch::UNKNOWN_COUNT,...
getVersion()
{Version of the upgrade.This tells the date when the upgrade was added. It consists of eight digits a...
needsIncrementOffset()
{Should the run() method receive an offset representing all processed items?If true,...
$config
Advanced site settings, debugging section.
_elgg_services()
Get the global service provider.
elgg_extract($key, $array, $default=null, bool $strict=true)
Checks for $array[$key] and returns its value if it exists, else returns $default.