Update website
This commit is contained in:
parent
4413528994
commit
1d90fbf296
6865 changed files with 1091082 additions and 0 deletions
|
@ -0,0 +1,34 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace PhpMyAdmin\Controllers\Database\Structure;
|
||||
|
||||
use PhpMyAdmin\Controllers\Database\AbstractController;
|
||||
|
||||
use function __;
|
||||
|
||||
final class AddPrefixController extends AbstractController
|
||||
{
|
||||
public function __invoke(): void
|
||||
{
|
||||
global $db;
|
||||
|
||||
$selected = $_POST['selected_tbl'] ?? [];
|
||||
|
||||
if (empty($selected)) {
|
||||
$this->response->setRequestStatus(false);
|
||||
$this->response->addJSON('message', __('No table selected.'));
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
$params = ['db' => $db];
|
||||
foreach ($selected as $selectedValue) {
|
||||
$params['selected'][] = $selectedValue;
|
||||
}
|
||||
|
||||
$this->response->disable();
|
||||
$this->render('database/structure/add_prefix', ['url_params' => $params]);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,64 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace PhpMyAdmin\Controllers\Database\Structure;
|
||||
|
||||
use PhpMyAdmin\Controllers\Database\AbstractController;
|
||||
use PhpMyAdmin\Controllers\Database\StructureController;
|
||||
use PhpMyAdmin\DatabaseInterface;
|
||||
use PhpMyAdmin\Message;
|
||||
use PhpMyAdmin\ResponseRenderer;
|
||||
use PhpMyAdmin\Template;
|
||||
use PhpMyAdmin\Util;
|
||||
|
||||
use function count;
|
||||
|
||||
final class AddPrefixTableController extends AbstractController
|
||||
{
|
||||
/** @var DatabaseInterface */
|
||||
private $dbi;
|
||||
|
||||
/** @var StructureController */
|
||||
private $structureController;
|
||||
|
||||
public function __construct(
|
||||
ResponseRenderer $response,
|
||||
Template $template,
|
||||
string $db,
|
||||
DatabaseInterface $dbi,
|
||||
StructureController $structureController
|
||||
) {
|
||||
parent::__construct($response, $template, $db);
|
||||
$this->dbi = $dbi;
|
||||
$this->structureController = $structureController;
|
||||
}
|
||||
|
||||
public function __invoke(): void
|
||||
{
|
||||
global $db, $message, $sql_query;
|
||||
|
||||
$selected = $_POST['selected'] ?? [];
|
||||
|
||||
$sql_query = '';
|
||||
$selectedCount = count($selected);
|
||||
|
||||
for ($i = 0; $i < $selectedCount; $i++) {
|
||||
$newTableName = $_POST['add_prefix'] . $selected[$i];
|
||||
$aQuery = 'ALTER TABLE ' . Util::backquote($selected[$i])
|
||||
. ' RENAME ' . Util::backquote($newTableName);
|
||||
|
||||
$sql_query .= $aQuery . ';' . "\n";
|
||||
$this->dbi->selectDb($db);
|
||||
$this->dbi->query($aQuery);
|
||||
}
|
||||
|
||||
$message = Message::success();
|
||||
|
||||
if (empty($_POST['message'])) {
|
||||
$_POST['message'] = $message;
|
||||
}
|
||||
|
||||
($this->structureController)();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,59 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace PhpMyAdmin\Controllers\Database\Structure\CentralColumns;
|
||||
|
||||
use PhpMyAdmin\Controllers\Database\AbstractController;
|
||||
use PhpMyAdmin\Controllers\Database\StructureController;
|
||||
use PhpMyAdmin\Database\CentralColumns;
|
||||
use PhpMyAdmin\DatabaseInterface;
|
||||
use PhpMyAdmin\Message;
|
||||
use PhpMyAdmin\ResponseRenderer;
|
||||
use PhpMyAdmin\Template;
|
||||
|
||||
use function __;
|
||||
|
||||
final class AddController extends AbstractController
|
||||
{
|
||||
/** @var DatabaseInterface */
|
||||
private $dbi;
|
||||
|
||||
/** @var StructureController */
|
||||
private $structureController;
|
||||
|
||||
public function __construct(
|
||||
ResponseRenderer $response,
|
||||
Template $template,
|
||||
string $db,
|
||||
DatabaseInterface $dbi,
|
||||
StructureController $structureController
|
||||
) {
|
||||
parent::__construct($response, $template, $db);
|
||||
$this->dbi = $dbi;
|
||||
$this->structureController = $structureController;
|
||||
}
|
||||
|
||||
public function __invoke(): void
|
||||
{
|
||||
global $message;
|
||||
|
||||
$selected = $_POST['selected_tbl'] ?? [];
|
||||
|
||||
if (empty($selected)) {
|
||||
$this->response->setRequestStatus(false);
|
||||
$this->response->addJSON('message', __('No table selected.'));
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
$centralColumns = new CentralColumns($this->dbi);
|
||||
$error = $centralColumns->syncUniqueColumns($selected);
|
||||
|
||||
$message = $error instanceof Message ? $error : Message::success(__('Success!'));
|
||||
|
||||
unset($_POST['submit_mult']);
|
||||
|
||||
($this->structureController)();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,59 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace PhpMyAdmin\Controllers\Database\Structure\CentralColumns;
|
||||
|
||||
use PhpMyAdmin\Controllers\Database\AbstractController;
|
||||
use PhpMyAdmin\Controllers\Database\StructureController;
|
||||
use PhpMyAdmin\Database\CentralColumns;
|
||||
use PhpMyAdmin\DatabaseInterface;
|
||||
use PhpMyAdmin\Message;
|
||||
use PhpMyAdmin\ResponseRenderer;
|
||||
use PhpMyAdmin\Template;
|
||||
|
||||
use function __;
|
||||
|
||||
final class MakeConsistentController extends AbstractController
|
||||
{
|
||||
/** @var DatabaseInterface */
|
||||
private $dbi;
|
||||
|
||||
/** @var StructureController */
|
||||
private $structureController;
|
||||
|
||||
public function __construct(
|
||||
ResponseRenderer $response,
|
||||
Template $template,
|
||||
string $db,
|
||||
DatabaseInterface $dbi,
|
||||
StructureController $structureController
|
||||
) {
|
||||
parent::__construct($response, $template, $db);
|
||||
$this->dbi = $dbi;
|
||||
$this->structureController = $structureController;
|
||||
}
|
||||
|
||||
public function __invoke(): void
|
||||
{
|
||||
global $db, $message;
|
||||
|
||||
$selected = $_POST['selected_tbl'] ?? [];
|
||||
|
||||
if (empty($selected)) {
|
||||
$this->response->setRequestStatus(false);
|
||||
$this->response->addJSON('message', __('No table selected.'));
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
$centralColumns = new CentralColumns($this->dbi);
|
||||
$error = $centralColumns->makeConsistentWithList($db, $selected);
|
||||
|
||||
$message = $error instanceof Message ? $error : Message::success(__('Success!'));
|
||||
|
||||
unset($_POST['submit_mult']);
|
||||
|
||||
($this->structureController)();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,59 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace PhpMyAdmin\Controllers\Database\Structure\CentralColumns;
|
||||
|
||||
use PhpMyAdmin\Controllers\Database\AbstractController;
|
||||
use PhpMyAdmin\Controllers\Database\StructureController;
|
||||
use PhpMyAdmin\Database\CentralColumns;
|
||||
use PhpMyAdmin\DatabaseInterface;
|
||||
use PhpMyAdmin\Message;
|
||||
use PhpMyAdmin\ResponseRenderer;
|
||||
use PhpMyAdmin\Template;
|
||||
|
||||
use function __;
|
||||
|
||||
final class RemoveController extends AbstractController
|
||||
{
|
||||
/** @var DatabaseInterface */
|
||||
private $dbi;
|
||||
|
||||
/** @var StructureController */
|
||||
private $structureController;
|
||||
|
||||
public function __construct(
|
||||
ResponseRenderer $response,
|
||||
Template $template,
|
||||
string $db,
|
||||
DatabaseInterface $dbi,
|
||||
StructureController $structureController
|
||||
) {
|
||||
parent::__construct($response, $template, $db);
|
||||
$this->dbi = $dbi;
|
||||
$this->structureController = $structureController;
|
||||
}
|
||||
|
||||
public function __invoke(): void
|
||||
{
|
||||
global $message;
|
||||
|
||||
$selected = $_POST['selected_tbl'] ?? [];
|
||||
|
||||
if (empty($selected)) {
|
||||
$this->response->setRequestStatus(false);
|
||||
$this->response->addJSON('message', __('No table selected.'));
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
$centralColumns = new CentralColumns($this->dbi);
|
||||
$error = $centralColumns->deleteColumnsFromList($_POST['db'], $selected);
|
||||
|
||||
$message = $error instanceof Message ? $error : Message::success(__('Success!'));
|
||||
|
||||
unset($_POST['submit_mult']);
|
||||
|
||||
($this->structureController)();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,43 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace PhpMyAdmin\Controllers\Database\Structure;
|
||||
|
||||
use PhpMyAdmin\Controllers\Database\AbstractController;
|
||||
|
||||
use function __;
|
||||
|
||||
final class ChangePrefixFormController extends AbstractController
|
||||
{
|
||||
public function __invoke(): void
|
||||
{
|
||||
global $db;
|
||||
|
||||
$selected = $_POST['selected_tbl'] ?? [];
|
||||
$submitMult = $_POST['submit_mult'] ?? '';
|
||||
|
||||
if (empty($selected)) {
|
||||
$this->response->setRequestStatus(false);
|
||||
$this->response->addJSON('message', __('No table selected.'));
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
$route = '/database/structure/replace-prefix';
|
||||
if ($submitMult === 'copy_tbl_change_prefix') {
|
||||
$route = '/database/structure/copy-table-with-prefix';
|
||||
}
|
||||
|
||||
$urlParams = ['db' => $db];
|
||||
foreach ($selected as $selectedValue) {
|
||||
$urlParams['selected'][] = $selectedValue;
|
||||
}
|
||||
|
||||
$this->response->disable();
|
||||
$this->render('database/structure/change_prefix_form', [
|
||||
'route' => $route,
|
||||
'url_params' => $urlParams,
|
||||
]);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,45 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace PhpMyAdmin\Controllers\Database\Structure;
|
||||
|
||||
use PhpMyAdmin\Controllers\Database\AbstractController;
|
||||
|
||||
use function __;
|
||||
|
||||
final class CopyFormController extends AbstractController
|
||||
{
|
||||
public function __invoke(): void
|
||||
{
|
||||
global $db, $dblist;
|
||||
|
||||
$selected = $_POST['selected_tbl'] ?? [];
|
||||
|
||||
if (empty($selected)) {
|
||||
$this->response->setRequestStatus(false);
|
||||
$this->response->addJSON('message', __('No table selected.'));
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
$urlParams = ['db' => $db];
|
||||
foreach ($selected as $selectedValue) {
|
||||
$urlParams['selected'][] = $selectedValue;
|
||||
}
|
||||
|
||||
$databasesList = $dblist->databases;
|
||||
foreach ($databasesList as $key => $databaseName) {
|
||||
if ($databaseName == $db) {
|
||||
$databasesList->offsetUnset($key);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
$this->response->disable();
|
||||
$this->render('database/structure/copy_form', [
|
||||
'url_params' => $urlParams,
|
||||
'options' => $databasesList->getList(),
|
||||
]);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,72 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace PhpMyAdmin\Controllers\Database\Structure;
|
||||
|
||||
use PhpMyAdmin\Controllers\Database\AbstractController;
|
||||
use PhpMyAdmin\Controllers\Database\StructureController;
|
||||
use PhpMyAdmin\Message;
|
||||
use PhpMyAdmin\Operations;
|
||||
use PhpMyAdmin\ResponseRenderer;
|
||||
use PhpMyAdmin\Table;
|
||||
use PhpMyAdmin\Template;
|
||||
|
||||
use function count;
|
||||
|
||||
final class CopyTableController extends AbstractController
|
||||
{
|
||||
/** @var Operations */
|
||||
private $operations;
|
||||
|
||||
/** @var StructureController */
|
||||
private $structureController;
|
||||
|
||||
public function __construct(
|
||||
ResponseRenderer $response,
|
||||
Template $template,
|
||||
string $db,
|
||||
Operations $operations,
|
||||
StructureController $structureController
|
||||
) {
|
||||
parent::__construct($response, $template, $db);
|
||||
$this->operations = $operations;
|
||||
$this->structureController = $structureController;
|
||||
}
|
||||
|
||||
public function __invoke(): void
|
||||
{
|
||||
global $db, $message;
|
||||
|
||||
$selected = $_POST['selected'] ?? [];
|
||||
$targetDb = $_POST['target_db'] ?? null;
|
||||
$selectedCount = count($selected);
|
||||
|
||||
for ($i = 0; $i < $selectedCount; $i++) {
|
||||
Table::moveCopy(
|
||||
$db,
|
||||
$selected[$i],
|
||||
$targetDb,
|
||||
$selected[$i],
|
||||
$_POST['what'],
|
||||
false,
|
||||
'one_table',
|
||||
isset($_POST['drop_if_exists']) && $_POST['drop_if_exists'] === 'true'
|
||||
);
|
||||
|
||||
if (empty($_POST['adjust_privileges'])) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$this->operations->adjustPrivilegesCopyTable($db, $selected[$i], $targetDb, $selected[$i]);
|
||||
}
|
||||
|
||||
$message = Message::success();
|
||||
|
||||
if (empty($_POST['message'])) {
|
||||
$_POST['message'] = $message;
|
||||
}
|
||||
|
||||
($this->structureController)();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,67 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace PhpMyAdmin\Controllers\Database\Structure;
|
||||
|
||||
use PhpMyAdmin\Controllers\Database\AbstractController;
|
||||
use PhpMyAdmin\Controllers\Database\StructureController;
|
||||
use PhpMyAdmin\Message;
|
||||
use PhpMyAdmin\ResponseRenderer;
|
||||
use PhpMyAdmin\Table;
|
||||
use PhpMyAdmin\Template;
|
||||
|
||||
use function count;
|
||||
use function mb_strlen;
|
||||
use function mb_substr;
|
||||
|
||||
final class CopyTableWithPrefixController extends AbstractController
|
||||
{
|
||||
/** @var StructureController */
|
||||
private $structureController;
|
||||
|
||||
public function __construct(
|
||||
ResponseRenderer $response,
|
||||
Template $template,
|
||||
string $db,
|
||||
StructureController $structureController
|
||||
) {
|
||||
parent::__construct($response, $template, $db);
|
||||
$this->structureController = $structureController;
|
||||
}
|
||||
|
||||
public function __invoke(): void
|
||||
{
|
||||
global $db, $message;
|
||||
|
||||
$selected = $_POST['selected'] ?? [];
|
||||
$fromPrefix = $_POST['from_prefix'] ?? null;
|
||||
$toPrefix = $_POST['to_prefix'] ?? null;
|
||||
|
||||
$selectedCount = count($selected);
|
||||
|
||||
for ($i = 0; $i < $selectedCount; $i++) {
|
||||
$current = $selected[$i];
|
||||
$newTableName = $toPrefix . mb_substr($current, mb_strlen((string) $fromPrefix));
|
||||
|
||||
Table::moveCopy(
|
||||
$db,
|
||||
$current,
|
||||
$db,
|
||||
$newTableName,
|
||||
'data',
|
||||
false,
|
||||
'one_table',
|
||||
isset($_POST['drop_if_exists']) && $_POST['drop_if_exists'] === 'true'
|
||||
);
|
||||
}
|
||||
|
||||
$message = Message::success();
|
||||
|
||||
if (empty($_POST['message'])) {
|
||||
$_POST['message'] = $message;
|
||||
}
|
||||
|
||||
($this->structureController)();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,81 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace PhpMyAdmin\Controllers\Database\Structure;
|
||||
|
||||
use PhpMyAdmin\Controllers\Database\AbstractController;
|
||||
use PhpMyAdmin\DatabaseInterface;
|
||||
use PhpMyAdmin\ResponseRenderer;
|
||||
use PhpMyAdmin\Template;
|
||||
use PhpMyAdmin\Util;
|
||||
use PhpMyAdmin\Utils\ForeignKey;
|
||||
|
||||
use function __;
|
||||
use function htmlspecialchars;
|
||||
use function in_array;
|
||||
|
||||
final class DropFormController extends AbstractController
|
||||
{
|
||||
/** @var DatabaseInterface */
|
||||
private $dbi;
|
||||
|
||||
public function __construct(ResponseRenderer $response, Template $template, string $db, DatabaseInterface $dbi)
|
||||
{
|
||||
parent::__construct($response, $template, $db);
|
||||
$this->dbi = $dbi;
|
||||
}
|
||||
|
||||
public function __invoke(): void
|
||||
{
|
||||
global $db;
|
||||
|
||||
$selected = $_POST['selected_tbl'] ?? [];
|
||||
|
||||
if (empty($selected)) {
|
||||
$this->response->setRequestStatus(false);
|
||||
$this->response->addJSON('message', __('No table selected.'));
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
$views = $this->dbi->getVirtualTables($db);
|
||||
|
||||
$fullQueryViews = '';
|
||||
$fullQuery = '';
|
||||
|
||||
foreach ($selected as $selectedValue) {
|
||||
$current = $selectedValue;
|
||||
if (! empty($views) && in_array($current, $views)) {
|
||||
$fullQueryViews .= (empty($fullQueryViews) ? 'DROP VIEW ' : ', ')
|
||||
. Util::backquote(htmlspecialchars($current));
|
||||
} else {
|
||||
$fullQuery .= (empty($fullQuery) ? 'DROP TABLE ' : ', ')
|
||||
. Util::backquote(htmlspecialchars($current));
|
||||
}
|
||||
}
|
||||
|
||||
if (! empty($fullQuery)) {
|
||||
$fullQuery .= ';<br>' . "\n";
|
||||
}
|
||||
|
||||
if (! empty($fullQueryViews)) {
|
||||
$fullQuery .= $fullQueryViews . ';<br>' . "\n";
|
||||
}
|
||||
|
||||
$urlParams = ['db' => $db];
|
||||
foreach ($selected as $selectedValue) {
|
||||
$urlParams['selected'][] = $selectedValue;
|
||||
}
|
||||
|
||||
foreach ($views as $current) {
|
||||
$urlParams['views'][] = $current;
|
||||
}
|
||||
|
||||
$this->render('database/structure/drop_form', [
|
||||
'url_params' => $urlParams,
|
||||
'full_query' => $fullQuery,
|
||||
'is_foreign_key_check' => ForeignKey::isCheckEnabled(),
|
||||
]);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,135 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace PhpMyAdmin\Controllers\Database\Structure;
|
||||
|
||||
use PhpMyAdmin\ConfigStorage\RelationCleanup;
|
||||
use PhpMyAdmin\Controllers\Database\AbstractController;
|
||||
use PhpMyAdmin\Controllers\Database\StructureController;
|
||||
use PhpMyAdmin\DatabaseInterface;
|
||||
use PhpMyAdmin\Message;
|
||||
use PhpMyAdmin\ResponseRenderer;
|
||||
use PhpMyAdmin\Template;
|
||||
use PhpMyAdmin\Util;
|
||||
use PhpMyAdmin\Utils\ForeignKey;
|
||||
|
||||
use function __;
|
||||
use function count;
|
||||
use function in_array;
|
||||
|
||||
final class DropTableController extends AbstractController
|
||||
{
|
||||
/** @var DatabaseInterface */
|
||||
private $dbi;
|
||||
|
||||
/** @var RelationCleanup */
|
||||
private $relationCleanup;
|
||||
|
||||
/** @var StructureController */
|
||||
private $structureController;
|
||||
|
||||
public function __construct(
|
||||
ResponseRenderer $response,
|
||||
Template $template,
|
||||
string $db,
|
||||
DatabaseInterface $dbi,
|
||||
RelationCleanup $relationCleanup,
|
||||
StructureController $structureController
|
||||
) {
|
||||
parent::__construct($response, $template, $db);
|
||||
$this->dbi = $dbi;
|
||||
$this->relationCleanup = $relationCleanup;
|
||||
$this->structureController = $structureController;
|
||||
}
|
||||
|
||||
public function __invoke(): void
|
||||
{
|
||||
global $db, $message, $reload, $sql_query;
|
||||
|
||||
$reload = $_POST['reload'] ?? $reload ?? null;
|
||||
$multBtn = $_POST['mult_btn'] ?? '';
|
||||
$selected = $_POST['selected'] ?? [];
|
||||
|
||||
$views = $this->dbi->getVirtualTables($db);
|
||||
|
||||
if ($multBtn !== __('Yes')) {
|
||||
$message = Message::success(__('No change'));
|
||||
|
||||
if (empty($_POST['message'])) {
|
||||
$_POST['message'] = Message::success();
|
||||
}
|
||||
|
||||
unset($_POST['mult_btn']);
|
||||
|
||||
($this->structureController)();
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
$defaultFkCheckValue = ForeignKey::handleDisableCheckInit();
|
||||
$sql_query = '';
|
||||
$sqlQueryViews = '';
|
||||
$selectedCount = count($selected);
|
||||
|
||||
for ($i = 0; $i < $selectedCount; $i++) {
|
||||
$this->relationCleanup->table($db, $selected[$i]);
|
||||
$current = $selected[$i];
|
||||
|
||||
if (! empty($views) && in_array($current, $views)) {
|
||||
$sqlQueryViews .= (empty($sqlQueryViews) ? 'DROP VIEW ' : ', ') . Util::backquote($current);
|
||||
} else {
|
||||
$sql_query .= (empty($sql_query) ? 'DROP TABLE ' : ', ') . Util::backquote($current);
|
||||
}
|
||||
|
||||
$reload = 1;
|
||||
}
|
||||
|
||||
if (! empty($sql_query)) {
|
||||
$sql_query .= ';';
|
||||
} elseif (! empty($sqlQueryViews)) {
|
||||
$sql_query = $sqlQueryViews . ';';
|
||||
unset($sqlQueryViews);
|
||||
}
|
||||
|
||||
// Unset cache values for tables count, issue #14205
|
||||
if (isset($_SESSION['tmpval'])) {
|
||||
if (isset($_SESSION['tmpval']['table_limit_offset'])) {
|
||||
unset($_SESSION['tmpval']['table_limit_offset']);
|
||||
}
|
||||
|
||||
if (isset($_SESSION['tmpval']['table_limit_offset_db'])) {
|
||||
unset($_SESSION['tmpval']['table_limit_offset_db']);
|
||||
}
|
||||
}
|
||||
|
||||
$message = Message::success();
|
||||
|
||||
$this->dbi->selectDb($db);
|
||||
$result = $this->dbi->tryQuery($sql_query);
|
||||
|
||||
if (! $result) {
|
||||
$message = Message::error($this->dbi->getError());
|
||||
}
|
||||
|
||||
if ($result && ! empty($sqlQueryViews)) {
|
||||
$sql_query .= ' ' . $sqlQueryViews . ';';
|
||||
$result = $this->dbi->tryQuery($sqlQueryViews);
|
||||
unset($sqlQueryViews);
|
||||
}
|
||||
|
||||
if (! $result) {
|
||||
$message = Message::error($this->dbi->getError());
|
||||
}
|
||||
|
||||
ForeignKey::handleDisableCheckCleanup($defaultFkCheckValue);
|
||||
|
||||
if (empty($_POST['message'])) {
|
||||
$_POST['message'] = $message;
|
||||
}
|
||||
|
||||
unset($_POST['mult_btn']);
|
||||
|
||||
($this->structureController)();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,44 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace PhpMyAdmin\Controllers\Database\Structure;
|
||||
|
||||
use PhpMyAdmin\Controllers\Database\AbstractController;
|
||||
use PhpMyAdmin\Util;
|
||||
use PhpMyAdmin\Utils\ForeignKey;
|
||||
|
||||
use function __;
|
||||
use function htmlspecialchars;
|
||||
|
||||
final class EmptyFormController extends AbstractController
|
||||
{
|
||||
public function __invoke(): void
|
||||
{
|
||||
global $db;
|
||||
|
||||
$selected = $_POST['selected_tbl'] ?? [];
|
||||
|
||||
if (empty($selected)) {
|
||||
$this->response->setRequestStatus(false);
|
||||
$this->response->addJSON('message', __('No table selected.'));
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
$fullQuery = '';
|
||||
$urlParams = ['db' => $db];
|
||||
|
||||
foreach ($selected as $selectedValue) {
|
||||
$fullQuery .= 'TRUNCATE ';
|
||||
$fullQuery .= Util::backquote(htmlspecialchars($selectedValue)) . ';<br>';
|
||||
$urlParams['selected'][] = $selectedValue;
|
||||
}
|
||||
|
||||
$this->render('database/structure/empty_form', [
|
||||
'url_params' => $urlParams,
|
||||
'full_query' => $fullQuery,
|
||||
'is_foreign_key_check' => ForeignKey::isCheckEnabled(),
|
||||
]);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,118 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace PhpMyAdmin\Controllers\Database\Structure;
|
||||
|
||||
use PhpMyAdmin\ConfigStorage\Relation;
|
||||
use PhpMyAdmin\ConfigStorage\RelationCleanup;
|
||||
use PhpMyAdmin\Controllers\Database\AbstractController;
|
||||
use PhpMyAdmin\Controllers\Database\StructureController;
|
||||
use PhpMyAdmin\DatabaseInterface;
|
||||
use PhpMyAdmin\FlashMessages;
|
||||
use PhpMyAdmin\Message;
|
||||
use PhpMyAdmin\Operations;
|
||||
use PhpMyAdmin\ResponseRenderer;
|
||||
use PhpMyAdmin\Sql;
|
||||
use PhpMyAdmin\Template;
|
||||
use PhpMyAdmin\Transformations;
|
||||
use PhpMyAdmin\Util;
|
||||
use PhpMyAdmin\Utils\ForeignKey;
|
||||
|
||||
use function __;
|
||||
use function count;
|
||||
|
||||
final class EmptyTableController extends AbstractController
|
||||
{
|
||||
/** @var DatabaseInterface */
|
||||
private $dbi;
|
||||
|
||||
/** @var Relation */
|
||||
private $relation;
|
||||
|
||||
/** @var RelationCleanup */
|
||||
private $relationCleanup;
|
||||
|
||||
/** @var Operations */
|
||||
private $operations;
|
||||
|
||||
/** @var FlashMessages */
|
||||
private $flash;
|
||||
|
||||
/** @var StructureController */
|
||||
private $structureController;
|
||||
|
||||
public function __construct(
|
||||
ResponseRenderer $response,
|
||||
Template $template,
|
||||
string $db,
|
||||
DatabaseInterface $dbi,
|
||||
Relation $relation,
|
||||
RelationCleanup $relationCleanup,
|
||||
Operations $operations,
|
||||
FlashMessages $flash,
|
||||
StructureController $structureController
|
||||
) {
|
||||
parent::__construct($response, $template, $db);
|
||||
$this->dbi = $dbi;
|
||||
$this->relation = $relation;
|
||||
$this->relationCleanup = $relationCleanup;
|
||||
$this->operations = $operations;
|
||||
$this->flash = $flash;
|
||||
$this->structureController = $structureController;
|
||||
}
|
||||
|
||||
public function __invoke(): void
|
||||
{
|
||||
global $db, $table, $message, $sql_query;
|
||||
|
||||
$multBtn = $_POST['mult_btn'] ?? '';
|
||||
$selected = $_POST['selected'] ?? [];
|
||||
|
||||
if ($multBtn !== __('Yes')) {
|
||||
$this->flash->addMessage('success', __('No change'));
|
||||
$this->redirect('/database/structure', ['db' => $db]);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
$defaultFkCheckValue = ForeignKey::handleDisableCheckInit();
|
||||
|
||||
$sql_query = '';
|
||||
$selectedCount = count($selected);
|
||||
|
||||
for ($i = 0; $i < $selectedCount; $i++) {
|
||||
$aQuery = 'TRUNCATE ';
|
||||
$aQuery .= Util::backquote($selected[$i]);
|
||||
|
||||
$sql_query .= $aQuery . ';' . "\n";
|
||||
$this->dbi->selectDb($db);
|
||||
$this->dbi->query($aQuery);
|
||||
}
|
||||
|
||||
if (! empty($_REQUEST['pos'])) {
|
||||
$sql = new Sql(
|
||||
$this->dbi,
|
||||
$this->relation,
|
||||
$this->relationCleanup,
|
||||
$this->operations,
|
||||
new Transformations(),
|
||||
$this->template
|
||||
);
|
||||
|
||||
$_REQUEST['pos'] = $sql->calculatePosForLastPage($db, $table, $_REQUEST['pos']);
|
||||
}
|
||||
|
||||
ForeignKey::handleDisableCheckCleanup($defaultFkCheckValue);
|
||||
|
||||
$message = Message::success();
|
||||
|
||||
if (empty($_POST['message'])) {
|
||||
$_POST['message'] = $message;
|
||||
}
|
||||
|
||||
unset($_POST['mult_btn']);
|
||||
|
||||
($this->structureController)();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,184 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace PhpMyAdmin\Controllers\Database\Structure;
|
||||
|
||||
use PhpMyAdmin\ConfigStorage\Relation;
|
||||
use PhpMyAdmin\Controllers\Database\AbstractController;
|
||||
use PhpMyAdmin\RecentFavoriteTable;
|
||||
use PhpMyAdmin\ResponseRenderer;
|
||||
use PhpMyAdmin\Template;
|
||||
use PhpMyAdmin\Url;
|
||||
use PhpMyAdmin\Util;
|
||||
|
||||
use function __;
|
||||
use function count;
|
||||
use function json_decode;
|
||||
use function json_encode;
|
||||
use function md5;
|
||||
use function sha1;
|
||||
|
||||
final class FavoriteTableController extends AbstractController
|
||||
{
|
||||
/** @var Relation */
|
||||
private $relation;
|
||||
|
||||
public function __construct(ResponseRenderer $response, Template $template, string $db, Relation $relation)
|
||||
{
|
||||
parent::__construct($response, $template, $db);
|
||||
$this->relation = $relation;
|
||||
}
|
||||
|
||||
public function __invoke(): void
|
||||
{
|
||||
global $cfg, $db, $errorUrl;
|
||||
|
||||
$parameters = [
|
||||
'favorite_table' => $_REQUEST['favorite_table'] ?? null,
|
||||
'favoriteTables' => $_REQUEST['favoriteTables'] ?? null,
|
||||
'sync_favorite_tables' => $_REQUEST['sync_favorite_tables'] ?? null,
|
||||
];
|
||||
|
||||
Util::checkParameters(['db']);
|
||||
|
||||
$errorUrl = Util::getScriptNameForOption($cfg['DefaultTabDatabase'], 'database');
|
||||
$errorUrl .= Url::getCommon(['db' => $db], '&');
|
||||
|
||||
if (! $this->hasDatabase() || ! $this->response->isAjax()) {
|
||||
return;
|
||||
}
|
||||
|
||||
$favoriteInstance = RecentFavoriteTable::getInstance('favorite');
|
||||
if (isset($parameters['favoriteTables'])) {
|
||||
$favoriteTables = json_decode($parameters['favoriteTables'], true);
|
||||
} else {
|
||||
$favoriteTables = [];
|
||||
}
|
||||
|
||||
// Required to keep each user's preferences separate.
|
||||
$user = sha1($cfg['Server']['user']);
|
||||
|
||||
// Request for Synchronization of favorite tables.
|
||||
if (isset($parameters['sync_favorite_tables'])) {
|
||||
$relationParameters = $this->relation->getRelationParameters();
|
||||
if ($relationParameters->favoriteTablesFeature !== null) {
|
||||
$this->response->addJSON($this->synchronizeFavoriteTables(
|
||||
$favoriteInstance,
|
||||
$user,
|
||||
$favoriteTables
|
||||
));
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
$changes = true;
|
||||
$favoriteTable = $parameters['favorite_table'] ?? '';
|
||||
$alreadyFavorite = $this->checkFavoriteTable($favoriteTable);
|
||||
|
||||
if (isset($_REQUEST['remove_favorite'])) {
|
||||
if ($alreadyFavorite) {
|
||||
// If already in favorite list, remove it.
|
||||
$favoriteInstance->remove($this->db, $favoriteTable);
|
||||
$alreadyFavorite = false; // for favorite_anchor template
|
||||
}
|
||||
} elseif (isset($_REQUEST['add_favorite'])) {
|
||||
if (! $alreadyFavorite) {
|
||||
$numTables = count($favoriteInstance->getTables());
|
||||
if ($numTables == $cfg['NumFavoriteTables']) {
|
||||
$changes = false;
|
||||
} else {
|
||||
// Otherwise add to favorite list.
|
||||
$favoriteInstance->add($this->db, $favoriteTable);
|
||||
$alreadyFavorite = true; // for favorite_anchor template
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$favoriteTables[$user] = $favoriteInstance->getTables();
|
||||
|
||||
$json = [];
|
||||
$json['changes'] = $changes;
|
||||
if (! $changes) {
|
||||
$json['message'] = $this->template->render('components/error_message', [
|
||||
'msg' => __('Favorite List is full!'),
|
||||
]);
|
||||
$this->response->addJSON($json);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
// Check if current table is already in favorite list.
|
||||
$favoriteParams = [
|
||||
'db' => $this->db,
|
||||
'ajax_request' => true,
|
||||
'favorite_table' => $favoriteTable,
|
||||
($alreadyFavorite ? 'remove' : 'add') . '_favorite' => true,
|
||||
];
|
||||
|
||||
$json['user'] = $user;
|
||||
$json['favoriteTables'] = json_encode($favoriteTables);
|
||||
$json['list'] = $favoriteInstance->getHtmlList();
|
||||
$json['anchor'] = $this->template->render('database/structure/favorite_anchor', [
|
||||
'table_name_hash' => md5($favoriteTable),
|
||||
'db_table_name_hash' => md5($this->db . '.' . $favoriteTable),
|
||||
'fav_params' => $favoriteParams,
|
||||
'already_favorite' => $alreadyFavorite,
|
||||
]);
|
||||
|
||||
$this->response->addJSON($json);
|
||||
}
|
||||
|
||||
/**
|
||||
* Synchronize favorite tables
|
||||
*
|
||||
* @param RecentFavoriteTable $favoriteInstance Instance of this class
|
||||
* @param string $user The user hash
|
||||
* @param array $favoriteTables Existing favorites
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
private function synchronizeFavoriteTables(
|
||||
RecentFavoriteTable $favoriteInstance,
|
||||
string $user,
|
||||
array $favoriteTables
|
||||
): array {
|
||||
$favoriteInstanceTables = $favoriteInstance->getTables();
|
||||
|
||||
if (empty($favoriteInstanceTables) && isset($favoriteTables[$user])) {
|
||||
foreach ($favoriteTables[$user] as $value) {
|
||||
$favoriteInstance->add($value['db'], $value['table']);
|
||||
}
|
||||
}
|
||||
|
||||
$favoriteTables[$user] = $favoriteInstance->getTables();
|
||||
|
||||
// Set flag when localStorage and pmadb(if present) are in sync.
|
||||
$_SESSION['tmpval']['favorites_synced'][$GLOBALS['server']] = true;
|
||||
|
||||
return [
|
||||
'favoriteTables' => json_encode($favoriteTables),
|
||||
'list' => $favoriteInstance->getHtmlList(),
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Function to check if a table is already in favorite list.
|
||||
*
|
||||
* @param string $currentTable current table
|
||||
*/
|
||||
private function checkFavoriteTable(string $currentTable): bool
|
||||
{
|
||||
// ensure $_SESSION['tmpval']['favoriteTables'] is initialized
|
||||
RecentFavoriteTable::getInstance('favorite');
|
||||
$favoriteTables = $_SESSION['tmpval']['favoriteTables'][$GLOBALS['server']] ?? [];
|
||||
foreach ($favoriteTables as $value) {
|
||||
if ($value['db'] == $this->db && $value['table'] == $currentTable) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
|
@ -0,0 +1,79 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace PhpMyAdmin\Controllers\Database\Structure;
|
||||
|
||||
use PhpMyAdmin\Controllers\Database\AbstractController;
|
||||
use PhpMyAdmin\DatabaseInterface;
|
||||
use PhpMyAdmin\ResponseRenderer;
|
||||
use PhpMyAdmin\Template;
|
||||
use PhpMyAdmin\Url;
|
||||
use PhpMyAdmin\Util;
|
||||
|
||||
use function json_encode;
|
||||
|
||||
/**
|
||||
* Handles request for real row count on database level view page.
|
||||
*/
|
||||
final class RealRowCountController extends AbstractController
|
||||
{
|
||||
/** @var DatabaseInterface */
|
||||
private $dbi;
|
||||
|
||||
public function __construct(ResponseRenderer $response, Template $template, string $db, DatabaseInterface $dbi)
|
||||
{
|
||||
parent::__construct($response, $template, $db);
|
||||
$this->dbi = $dbi;
|
||||
}
|
||||
|
||||
public function __invoke(): void
|
||||
{
|
||||
global $cfg, $db, $errorUrl;
|
||||
|
||||
$parameters = [
|
||||
'real_row_count_all' => $_REQUEST['real_row_count_all'] ?? null,
|
||||
'table' => $_REQUEST['table'] ?? null,
|
||||
];
|
||||
|
||||
Util::checkParameters(['db']);
|
||||
|
||||
$errorUrl = Util::getScriptNameForOption($cfg['DefaultTabDatabase'], 'database');
|
||||
$errorUrl .= Url::getCommon(['db' => $db], '&');
|
||||
|
||||
if (! $this->hasDatabase() || ! $this->response->isAjax()) {
|
||||
return;
|
||||
}
|
||||
|
||||
[$tables] = Util::getDbInfo($this->db, '_structure');
|
||||
|
||||
// If there is a request to update all table's row count.
|
||||
if (! isset($parameters['real_row_count_all'])) {
|
||||
// Get the real row count for the table.
|
||||
$realRowCount = (int) $this->dbi
|
||||
->getTable($this->db, (string) $parameters['table'])
|
||||
->getRealRowCountTable();
|
||||
// Format the number.
|
||||
$realRowCount = Util::formatNumber($realRowCount, 0);
|
||||
|
||||
$this->response->addJSON(['real_row_count' => $realRowCount]);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
// Array to store the results.
|
||||
$realRowCountAll = [];
|
||||
// Iterate over each table and fetch real row count.
|
||||
foreach ($tables as $table) {
|
||||
$rowCount = $this->dbi
|
||||
->getTable($this->db, $table['TABLE_NAME'])
|
||||
->getRealRowCountTable();
|
||||
$realRowCountAll[] = [
|
||||
'table' => $table['TABLE_NAME'],
|
||||
'row_count' => $rowCount,
|
||||
];
|
||||
}
|
||||
|
||||
$this->response->addJSON(['real_row_count_all' => json_encode($realRowCountAll)]);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,76 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace PhpMyAdmin\Controllers\Database\Structure;
|
||||
|
||||
use PhpMyAdmin\Controllers\Database\AbstractController;
|
||||
use PhpMyAdmin\Controllers\Database\StructureController;
|
||||
use PhpMyAdmin\DatabaseInterface;
|
||||
use PhpMyAdmin\Message;
|
||||
use PhpMyAdmin\ResponseRenderer;
|
||||
use PhpMyAdmin\Template;
|
||||
use PhpMyAdmin\Util;
|
||||
|
||||
use function count;
|
||||
use function mb_strlen;
|
||||
use function mb_substr;
|
||||
|
||||
final class ReplacePrefixController extends AbstractController
|
||||
{
|
||||
/** @var DatabaseInterface */
|
||||
private $dbi;
|
||||
|
||||
/** @var StructureController */
|
||||
private $structureController;
|
||||
|
||||
public function __construct(
|
||||
ResponseRenderer $response,
|
||||
Template $template,
|
||||
string $db,
|
||||
DatabaseInterface $dbi,
|
||||
StructureController $structureController
|
||||
) {
|
||||
parent::__construct($response, $template, $db);
|
||||
$this->dbi = $dbi;
|
||||
$this->structureController = $structureController;
|
||||
}
|
||||
|
||||
public function __invoke(): void
|
||||
{
|
||||
global $db, $message, $sql_query;
|
||||
|
||||
$selected = $_POST['selected'] ?? [];
|
||||
$fromPrefix = $_POST['from_prefix'] ?? '';
|
||||
$toPrefix = $_POST['to_prefix'] ?? '';
|
||||
|
||||
$sql_query = '';
|
||||
$selectedCount = count($selected);
|
||||
|
||||
for ($i = 0; $i < $selectedCount; $i++) {
|
||||
$current = $selected[$i];
|
||||
$subFromPrefix = mb_substr($current, 0, mb_strlen((string) $fromPrefix));
|
||||
|
||||
if ($subFromPrefix === $fromPrefix) {
|
||||
$newTableName = $toPrefix . mb_substr($current, mb_strlen((string) $fromPrefix));
|
||||
} else {
|
||||
$newTableName = $current;
|
||||
}
|
||||
|
||||
$aQuery = 'ALTER TABLE ' . Util::backquote($selected[$i])
|
||||
. ' RENAME ' . Util::backquote($newTableName);
|
||||
|
||||
$sql_query .= $aQuery . ';' . "\n";
|
||||
$this->dbi->selectDb($db);
|
||||
$this->dbi->query($aQuery);
|
||||
}
|
||||
|
||||
$message = Message::success();
|
||||
|
||||
if (empty($_POST['message'])) {
|
||||
$_POST['message'] = $message;
|
||||
}
|
||||
|
||||
($this->structureController)();
|
||||
}
|
||||
}
|
|
@ -0,0 +1,64 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace PhpMyAdmin\Controllers\Database\Structure;
|
||||
|
||||
use PhpMyAdmin\Controllers\Database\AbstractController;
|
||||
use PhpMyAdmin\Core;
|
||||
use PhpMyAdmin\DatabaseInterface;
|
||||
use PhpMyAdmin\ResponseRenderer;
|
||||
use PhpMyAdmin\Template;
|
||||
|
||||
use function __;
|
||||
|
||||
final class ShowCreateController extends AbstractController
|
||||
{
|
||||
/** @var DatabaseInterface */
|
||||
private $dbi;
|
||||
|
||||
public function __construct(ResponseRenderer $response, Template $template, string $db, DatabaseInterface $dbi)
|
||||
{
|
||||
parent::__construct($response, $template, $db);
|
||||
$this->dbi = $dbi;
|
||||
}
|
||||
|
||||
public function __invoke(): void
|
||||
{
|
||||
$selected = $_POST['selected_tbl'] ?? [];
|
||||
|
||||
if (empty($selected)) {
|
||||
$this->response->setRequestStatus(false);
|
||||
$this->response->addJSON('message', __('No table selected.'));
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
$tables = $this->getShowCreateTables($selected);
|
||||
|
||||
$showCreate = $this->template->render('database/structure/show_create', ['tables' => $tables]);
|
||||
|
||||
$this->response->addJSON('message', $showCreate);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string[] $selected Selected tables.
|
||||
*
|
||||
* @return array<string, array<int, array<string, string>>>
|
||||
*/
|
||||
private function getShowCreateTables(array $selected): array
|
||||
{
|
||||
$tables = ['tables' => [], 'views' => []];
|
||||
|
||||
foreach ($selected as $table) {
|
||||
$object = $this->dbi->getTable($this->db, $table);
|
||||
|
||||
$tables[$object->isView() ? 'views' : 'tables'][] = [
|
||||
'name' => Core::mimeDefaultFunction($table),
|
||||
'show_create' => Core::mimeDefaultFunction($object->showCreate()),
|
||||
];
|
||||
}
|
||||
|
||||
return $tables;
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue