118 lines
3.7 KiB
PHP
118 lines
3.7 KiB
PHP
|
<?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);
|
||
|
}
|
||
|
}
|
||
|
}
|