operations = $operations; $this->dbi = $dbi; } public function __invoke(ServerRequest $request): void { $GLOBALS['errorUrl'] ??= null; if (! $this->response->isAjax()) { return; } $dbCollation = $request->getParsedBodyParam('db_collation') ?? ''; if (empty($dbCollation)) { $this->response->setRequestStatus(false); $this->response->addJSON('message', Message::error(__('No collation provided.'))); return; } $this->checkParameters(['db']); $GLOBALS['errorUrl'] = Util::getScriptNameForOption($GLOBALS['cfg']['DefaultTabDatabase'], 'database'); $GLOBALS['errorUrl'] .= Url::getCommon(['db' => $GLOBALS['db']], '&'); if (! $this->hasDatabase()) { return; } $sql_query = 'ALTER DATABASE ' . Util::backquote($GLOBALS['db']) . ' DEFAULT' . Util::getCharsetQueryPart($dbCollation); $this->dbi->query($sql_query); $message = Message::success(); /** * Changes tables charset if requested by the user */ if ($request->getParsedBodyParam('change_all_tables_collations') === 'on') { [$tables] = Util::getDbInfo($request, $GLOBALS['db']); foreach ($tables as ['Name' => $tableName]) { if ($this->dbi->getTable($GLOBALS['db'], $tableName)->isView()) { // Skip views, we can not change the collation of a view. // issue #15283 continue; } $sql_query = 'ALTER TABLE ' . Util::backquote($GLOBALS['db']) . '.' . Util::backquote($tableName) . ' DEFAULT ' . Util::getCharsetQueryPart($dbCollation); $this->dbi->query($sql_query); /** * Changes columns charset if requested by the user */ if ($request->getParsedBodyParam('change_all_tables_columns_collations') !== 'on') { continue; } $this->operations->changeAllColumnsCollation($GLOBALS['db'], $tableName, $dbCollation); } } $this->response->setRequestStatus($message->isSuccess()); $this->response->addJSON('message', $message); } }