ImgURL Pro容器部署
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

118 lines
3.7 KiB

2 years ago
<?php
declare(strict_types=1);
namespace PhpMyAdmin\Table;
use PhpMyAdmin\Controllers\Table\StructureController;
use PhpMyAdmin\DatabaseInterface;
use PhpMyAdmin\Html\Generator;
use PhpMyAdmin\Index;
use PhpMyAdmin\Message;
use PhpMyAdmin\Query\Compatibility;
use PhpMyAdmin\Query\Generator as QueryGenerator;
use PhpMyAdmin\ResponseRenderer;
use PhpMyAdmin\Template;
use function __;
final class Indexes
{
/** @var ResponseRenderer */
protected $response;
/** @var Template */
protected $template;
/** @var DatabaseInterface */
private $dbi;
public function __construct(ResponseRenderer $response, Template $template, DatabaseInterface $dbi)
{
$this->response = $response;
$this->template = $template;
$this->dbi = $dbi;
}
/**
* Process the data from the edit/create index form,
* run the query to build the new index
* and moves back to /table/sql
*
* @param Index $index An Index instance.
* @param bool $renameMode Rename the Index mode
*/
public function doSaveData(Index $index, bool $renameMode, string $db, string $table): void
{
global $containerBuilder;
$error = false;
if ($renameMode && Compatibility::isCompatibleRenameIndex($this->dbi->getVersion())) {
$oldIndexName = $_POST['old_index'];
if ($oldIndexName === 'PRIMARY') {
if ($index->getName() === '') {
$index->setName('PRIMARY');
} elseif ($index->getName() !== 'PRIMARY') {
$error = Message::error(
__('The name of the primary key must be "PRIMARY"!')
);
}
}
$sql_query = QueryGenerator::getSqlQueryForIndexRename(
$db,
$table,
$oldIndexName,
$index->getName()
);
} else {
$sql_query = $this->dbi->getTable($db, $table)
->getSqlQueryForIndexCreateOrEdit($index, $error);
}
// If there is a request for SQL previewing.
if (isset($_POST['preview_sql'])) {
$this->response->addJSON(
'sql_data',
$this->template->render('preview_sql', ['query_data' => $sql_query])
);
} elseif (! $error) {
$this->dbi->query($sql_query);
$response = ResponseRenderer::getInstance();
if ($response->isAjax()) {
$message = Message::success(
__('Table %1$s has been altered successfully.')
);
$message->addParam($table);
$this->response->addJSON(
'message',
Generator::getMessage($message, $sql_query, 'success')
);
$indexes = Index::getFromTable($table, $db);
$indexesDuplicates = Index::findDuplicates($table, $db);
$this->response->addJSON(
'index_table',
$this->template->render('indexes', [
'url_params' => [
'db' => $db,
'table' => $table,
],
'indexes' => $indexes,
'indexes_duplicates' => $indexesDuplicates,
])
);
} else {
/** @var StructureController $controller */
$controller = $containerBuilder->get(StructureController::class);
$controller();
}
} else {
$this->response->setRequestStatus(false);
$this->response->addJSON('message', $error);
}
}
}