Update website
This commit is contained in:
parent
bb4b0f9be8
commit
011b183e28
4263 changed files with 3014 additions and 720369 deletions
|
@ -1,26 +0,0 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace PhpMyAdmin\ConfigStorage\Features;
|
||||
|
||||
use PhpMyAdmin\Dbal\DatabaseName;
|
||||
use PhpMyAdmin\Dbal\TableName;
|
||||
|
||||
/**
|
||||
* @psalm-immutable
|
||||
*/
|
||||
final class BookmarkFeature
|
||||
{
|
||||
/** @var DatabaseName */
|
||||
public $database;
|
||||
|
||||
/** @var TableName */
|
||||
public $bookmark;
|
||||
|
||||
public function __construct(DatabaseName $database, TableName $bookmark)
|
||||
{
|
||||
$this->database = $database;
|
||||
$this->bookmark = $bookmark;
|
||||
}
|
||||
}
|
|
@ -1,26 +0,0 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace PhpMyAdmin\ConfigStorage\Features;
|
||||
|
||||
use PhpMyAdmin\Dbal\DatabaseName;
|
||||
use PhpMyAdmin\Dbal\TableName;
|
||||
|
||||
/**
|
||||
* @psalm-immutable
|
||||
*/
|
||||
final class BrowserTransformationFeature
|
||||
{
|
||||
/** @var DatabaseName */
|
||||
public $database;
|
||||
|
||||
/** @var TableName */
|
||||
public $columnInfo;
|
||||
|
||||
public function __construct(DatabaseName $database, TableName $columnInfo)
|
||||
{
|
||||
$this->database = $database;
|
||||
$this->columnInfo = $columnInfo;
|
||||
}
|
||||
}
|
|
@ -1,26 +0,0 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace PhpMyAdmin\ConfigStorage\Features;
|
||||
|
||||
use PhpMyAdmin\Dbal\DatabaseName;
|
||||
use PhpMyAdmin\Dbal\TableName;
|
||||
|
||||
/**
|
||||
* @psalm-immutable
|
||||
*/
|
||||
final class CentralColumnsFeature
|
||||
{
|
||||
/** @var DatabaseName */
|
||||
public $database;
|
||||
|
||||
/** @var TableName */
|
||||
public $centralColumns;
|
||||
|
||||
public function __construct(DatabaseName $database, TableName $centralColumns)
|
||||
{
|
||||
$this->database = $database;
|
||||
$this->centralColumns = $centralColumns;
|
||||
}
|
||||
}
|
|
@ -1,26 +0,0 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace PhpMyAdmin\ConfigStorage\Features;
|
||||
|
||||
use PhpMyAdmin\Dbal\DatabaseName;
|
||||
use PhpMyAdmin\Dbal\TableName;
|
||||
|
||||
/**
|
||||
* @psalm-immutable
|
||||
*/
|
||||
final class ColumnCommentsFeature
|
||||
{
|
||||
/** @var DatabaseName */
|
||||
public $database;
|
||||
|
||||
/** @var TableName */
|
||||
public $columnInfo;
|
||||
|
||||
public function __construct(DatabaseName $database, TableName $columnInfo)
|
||||
{
|
||||
$this->database = $database;
|
||||
$this->columnInfo = $columnInfo;
|
||||
}
|
||||
}
|
|
@ -1,30 +0,0 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace PhpMyAdmin\ConfigStorage\Features;
|
||||
|
||||
use PhpMyAdmin\Dbal\DatabaseName;
|
||||
use PhpMyAdmin\Dbal\TableName;
|
||||
|
||||
/**
|
||||
* @psalm-immutable
|
||||
*/
|
||||
final class ConfigurableMenusFeature
|
||||
{
|
||||
/** @var DatabaseName */
|
||||
public $database;
|
||||
|
||||
/** @var TableName */
|
||||
public $userGroups;
|
||||
|
||||
/** @var TableName */
|
||||
public $users;
|
||||
|
||||
public function __construct(DatabaseName $database, TableName $userGroups, TableName $users)
|
||||
{
|
||||
$this->database = $database;
|
||||
$this->userGroups = $userGroups;
|
||||
$this->users = $users;
|
||||
}
|
||||
}
|
|
@ -1,26 +0,0 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace PhpMyAdmin\ConfigStorage\Features;
|
||||
|
||||
use PhpMyAdmin\Dbal\DatabaseName;
|
||||
use PhpMyAdmin\Dbal\TableName;
|
||||
|
||||
/**
|
||||
* @psalm-immutable
|
||||
*/
|
||||
final class DatabaseDesignerSettingsFeature
|
||||
{
|
||||
/** @var DatabaseName */
|
||||
public $database;
|
||||
|
||||
/** @var TableName */
|
||||
public $designerSettings;
|
||||
|
||||
public function __construct(DatabaseName $database, TableName $designerSettings)
|
||||
{
|
||||
$this->database = $database;
|
||||
$this->designerSettings = $designerSettings;
|
||||
}
|
||||
}
|
|
@ -1,30 +0,0 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace PhpMyAdmin\ConfigStorage\Features;
|
||||
|
||||
use PhpMyAdmin\Dbal\DatabaseName;
|
||||
use PhpMyAdmin\Dbal\TableName;
|
||||
|
||||
/**
|
||||
* @psalm-immutable
|
||||
*/
|
||||
final class DisplayFeature
|
||||
{
|
||||
/** @var DatabaseName */
|
||||
public $database;
|
||||
|
||||
/** @var TableName */
|
||||
public $relation;
|
||||
|
||||
/** @var TableName */
|
||||
public $tableInfo;
|
||||
|
||||
public function __construct(DatabaseName $database, TableName $relation, TableName $tableInfo)
|
||||
{
|
||||
$this->database = $database;
|
||||
$this->relation = $relation;
|
||||
$this->tableInfo = $tableInfo;
|
||||
}
|
||||
}
|
|
@ -1,26 +0,0 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace PhpMyAdmin\ConfigStorage\Features;
|
||||
|
||||
use PhpMyAdmin\Dbal\DatabaseName;
|
||||
use PhpMyAdmin\Dbal\TableName;
|
||||
|
||||
/**
|
||||
* @psalm-immutable
|
||||
*/
|
||||
final class ExportTemplatesFeature
|
||||
{
|
||||
/** @var DatabaseName */
|
||||
public $database;
|
||||
|
||||
/** @var TableName */
|
||||
public $exportTemplates;
|
||||
|
||||
public function __construct(DatabaseName $database, TableName $exportTemplates)
|
||||
{
|
||||
$this->database = $database;
|
||||
$this->exportTemplates = $exportTemplates;
|
||||
}
|
||||
}
|
|
@ -1,26 +0,0 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace PhpMyAdmin\ConfigStorage\Features;
|
||||
|
||||
use PhpMyAdmin\Dbal\DatabaseName;
|
||||
use PhpMyAdmin\Dbal\TableName;
|
||||
|
||||
/**
|
||||
* @psalm-immutable
|
||||
*/
|
||||
final class FavoriteTablesFeature
|
||||
{
|
||||
/** @var DatabaseName */
|
||||
public $database;
|
||||
|
||||
/** @var TableName */
|
||||
public $favorite;
|
||||
|
||||
public function __construct(DatabaseName $database, TableName $favorite)
|
||||
{
|
||||
$this->database = $database;
|
||||
$this->favorite = $favorite;
|
||||
}
|
||||
}
|
|
@ -1,26 +0,0 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace PhpMyAdmin\ConfigStorage\Features;
|
||||
|
||||
use PhpMyAdmin\Dbal\DatabaseName;
|
||||
use PhpMyAdmin\Dbal\TableName;
|
||||
|
||||
/**
|
||||
* @psalm-immutable
|
||||
*/
|
||||
final class NavigationItemsHidingFeature
|
||||
{
|
||||
/** @var DatabaseName */
|
||||
public $database;
|
||||
|
||||
/** @var TableName */
|
||||
public $navigationHiding;
|
||||
|
||||
public function __construct(DatabaseName $database, TableName $navigationHiding)
|
||||
{
|
||||
$this->database = $database;
|
||||
$this->navigationHiding = $navigationHiding;
|
||||
}
|
||||
}
|
|
@ -1,30 +0,0 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace PhpMyAdmin\ConfigStorage\Features;
|
||||
|
||||
use PhpMyAdmin\Dbal\DatabaseName;
|
||||
use PhpMyAdmin\Dbal\TableName;
|
||||
|
||||
/**
|
||||
* @psalm-immutable
|
||||
*/
|
||||
final class PdfFeature
|
||||
{
|
||||
/** @var DatabaseName */
|
||||
public $database;
|
||||
|
||||
/** @var TableName */
|
||||
public $pdfPages;
|
||||
|
||||
/** @var TableName */
|
||||
public $tableCoords;
|
||||
|
||||
public function __construct(DatabaseName $database, TableName $pdfPages, TableName $tableCoords)
|
||||
{
|
||||
$this->database = $database;
|
||||
$this->pdfPages = $pdfPages;
|
||||
$this->tableCoords = $tableCoords;
|
||||
}
|
||||
}
|
|
@ -1,26 +0,0 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace PhpMyAdmin\ConfigStorage\Features;
|
||||
|
||||
use PhpMyAdmin\Dbal\DatabaseName;
|
||||
use PhpMyAdmin\Dbal\TableName;
|
||||
|
||||
/**
|
||||
* @psalm-immutable
|
||||
*/
|
||||
final class RecentlyUsedTablesFeature
|
||||
{
|
||||
/** @var DatabaseName */
|
||||
public $database;
|
||||
|
||||
/** @var TableName */
|
||||
public $recent;
|
||||
|
||||
public function __construct(DatabaseName $database, TableName $recent)
|
||||
{
|
||||
$this->database = $database;
|
||||
$this->recent = $recent;
|
||||
}
|
||||
}
|
|
@ -1,26 +0,0 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace PhpMyAdmin\ConfigStorage\Features;
|
||||
|
||||
use PhpMyAdmin\Dbal\DatabaseName;
|
||||
use PhpMyAdmin\Dbal\TableName;
|
||||
|
||||
/**
|
||||
* @psalm-immutable
|
||||
*/
|
||||
final class RelationFeature
|
||||
{
|
||||
/** @var DatabaseName */
|
||||
public $database;
|
||||
|
||||
/** @var TableName */
|
||||
public $relation;
|
||||
|
||||
public function __construct(DatabaseName $database, TableName $relation)
|
||||
{
|
||||
$this->database = $database;
|
||||
$this->relation = $relation;
|
||||
}
|
||||
}
|
|
@ -1,26 +0,0 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace PhpMyAdmin\ConfigStorage\Features;
|
||||
|
||||
use PhpMyAdmin\Dbal\DatabaseName;
|
||||
use PhpMyAdmin\Dbal\TableName;
|
||||
|
||||
/**
|
||||
* @psalm-immutable
|
||||
*/
|
||||
final class SavedQueryByExampleSearchesFeature
|
||||
{
|
||||
/** @var DatabaseName */
|
||||
public $database;
|
||||
|
||||
/** @var TableName */
|
||||
public $savedSearches;
|
||||
|
||||
public function __construct(DatabaseName $database, TableName $savedSearches)
|
||||
{
|
||||
$this->database = $database;
|
||||
$this->savedSearches = $savedSearches;
|
||||
}
|
||||
}
|
|
@ -1,26 +0,0 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace PhpMyAdmin\ConfigStorage\Features;
|
||||
|
||||
use PhpMyAdmin\Dbal\DatabaseName;
|
||||
use PhpMyAdmin\Dbal\TableName;
|
||||
|
||||
/**
|
||||
* @psalm-immutable
|
||||
*/
|
||||
final class SqlHistoryFeature
|
||||
{
|
||||
/** @var DatabaseName */
|
||||
public $database;
|
||||
|
||||
/** @var TableName */
|
||||
public $history;
|
||||
|
||||
public function __construct(DatabaseName $database, TableName $history)
|
||||
{
|
||||
$this->database = $database;
|
||||
$this->history = $history;
|
||||
}
|
||||
}
|
|
@ -1,26 +0,0 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace PhpMyAdmin\ConfigStorage\Features;
|
||||
|
||||
use PhpMyAdmin\Dbal\DatabaseName;
|
||||
use PhpMyAdmin\Dbal\TableName;
|
||||
|
||||
/**
|
||||
* @psalm-immutable
|
||||
*/
|
||||
final class TrackingFeature
|
||||
{
|
||||
/** @var DatabaseName */
|
||||
public $database;
|
||||
|
||||
/** @var TableName */
|
||||
public $tracking;
|
||||
|
||||
public function __construct(DatabaseName $database, TableName $tracking)
|
||||
{
|
||||
$this->database = $database;
|
||||
$this->tracking = $tracking;
|
||||
}
|
||||
}
|
|
@ -1,26 +0,0 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace PhpMyAdmin\ConfigStorage\Features;
|
||||
|
||||
use PhpMyAdmin\Dbal\DatabaseName;
|
||||
use PhpMyAdmin\Dbal\TableName;
|
||||
|
||||
/**
|
||||
* @psalm-immutable
|
||||
*/
|
||||
final class UiPreferencesFeature
|
||||
{
|
||||
/** @var DatabaseName */
|
||||
public $database;
|
||||
|
||||
/** @var TableName */
|
||||
public $tableUiPrefs;
|
||||
|
||||
public function __construct(DatabaseName $database, TableName $tableUiPrefs)
|
||||
{
|
||||
$this->database = $database;
|
||||
$this->tableUiPrefs = $tableUiPrefs;
|
||||
}
|
||||
}
|
|
@ -1,26 +0,0 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace PhpMyAdmin\ConfigStorage\Features;
|
||||
|
||||
use PhpMyAdmin\Dbal\DatabaseName;
|
||||
use PhpMyAdmin\Dbal\TableName;
|
||||
|
||||
/**
|
||||
* @psalm-immutable
|
||||
*/
|
||||
final class UserPreferencesFeature
|
||||
{
|
||||
/** @var DatabaseName */
|
||||
public $database;
|
||||
|
||||
/** @var TableName */
|
||||
public $userConfig;
|
||||
|
||||
public function __construct(DatabaseName $database, TableName $userConfig)
|
||||
{
|
||||
$this->database = $database;
|
||||
$this->userConfig = $userConfig;
|
||||
}
|
||||
}
|
File diff suppressed because it is too large
Load diff
|
@ -1,384 +0,0 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace PhpMyAdmin\ConfigStorage;
|
||||
|
||||
use PhpMyAdmin\DatabaseInterface;
|
||||
use PhpMyAdmin\Util;
|
||||
|
||||
/**
|
||||
* Set of functions used for cleaning up phpMyAdmin tables
|
||||
*/
|
||||
class RelationCleanup
|
||||
{
|
||||
/** @var Relation */
|
||||
public $relation;
|
||||
|
||||
/** @var DatabaseInterface */
|
||||
public $dbi;
|
||||
|
||||
/**
|
||||
* @param DatabaseInterface $dbi DatabaseInterface object
|
||||
* @param Relation $relation Relation object
|
||||
*/
|
||||
public function __construct($dbi, Relation $relation)
|
||||
{
|
||||
$this->dbi = $dbi;
|
||||
$this->relation = $relation;
|
||||
}
|
||||
|
||||
/**
|
||||
* Cleanup column related relation stuff
|
||||
*
|
||||
* @param string $db database name
|
||||
* @param string $table table name
|
||||
* @param string $column column name
|
||||
*/
|
||||
public function column($db, $table, $column): void
|
||||
{
|
||||
$relationParameters = $this->relation->getRelationParameters();
|
||||
|
||||
if ($relationParameters->columnCommentsFeature !== null) {
|
||||
$remove_query = 'DELETE FROM '
|
||||
. Util::backquote($relationParameters->columnCommentsFeature->database)
|
||||
. '.' . Util::backquote($relationParameters->columnCommentsFeature->columnInfo)
|
||||
. ' WHERE db_name = \'' . $this->dbi->escapeString($db) . '\''
|
||||
. ' AND table_name = \'' . $this->dbi->escapeString($table)
|
||||
. '\''
|
||||
. ' AND column_name = \'' . $this->dbi->escapeString($column)
|
||||
. '\'';
|
||||
$this->dbi->queryAsControlUser($remove_query);
|
||||
}
|
||||
|
||||
if ($relationParameters->displayFeature !== null) {
|
||||
$remove_query = 'DELETE FROM '
|
||||
. Util::backquote($relationParameters->displayFeature->database)
|
||||
. '.' . Util::backquote($relationParameters->displayFeature->tableInfo)
|
||||
. ' WHERE db_name = \'' . $this->dbi->escapeString($db) . '\''
|
||||
. ' AND table_name = \'' . $this->dbi->escapeString($table)
|
||||
. '\''
|
||||
. ' AND display_field = \'' . $this->dbi->escapeString($column)
|
||||
. '\'';
|
||||
$this->dbi->queryAsControlUser($remove_query);
|
||||
}
|
||||
|
||||
if ($relationParameters->relationFeature === null) {
|
||||
return;
|
||||
}
|
||||
|
||||
$remove_query = 'DELETE FROM '
|
||||
. Util::backquote($relationParameters->relationFeature->database)
|
||||
. '.' . Util::backquote($relationParameters->relationFeature->relation)
|
||||
. ' WHERE master_db = \'' . $this->dbi->escapeString($db)
|
||||
. '\''
|
||||
. ' AND master_table = \'' . $this->dbi->escapeString($table)
|
||||
. '\''
|
||||
. ' AND master_field = \'' . $this->dbi->escapeString($column)
|
||||
. '\'';
|
||||
$this->dbi->queryAsControlUser($remove_query);
|
||||
|
||||
$remove_query = 'DELETE FROM '
|
||||
. Util::backquote($relationParameters->relationFeature->database)
|
||||
. '.' . Util::backquote($relationParameters->relationFeature->relation)
|
||||
. ' WHERE foreign_db = \'' . $this->dbi->escapeString($db)
|
||||
. '\''
|
||||
. ' AND foreign_table = \'' . $this->dbi->escapeString($table)
|
||||
. '\''
|
||||
. ' AND foreign_field = \'' . $this->dbi->escapeString($column)
|
||||
. '\'';
|
||||
$this->dbi->queryAsControlUser($remove_query);
|
||||
}
|
||||
|
||||
/**
|
||||
* Cleanup table related relation stuff
|
||||
*
|
||||
* @param string $db database name
|
||||
* @param string $table table name
|
||||
*/
|
||||
public function table($db, $table): void
|
||||
{
|
||||
$relationParameters = $this->relation->getRelationParameters();
|
||||
|
||||
if ($relationParameters->columnCommentsFeature !== null) {
|
||||
$remove_query = 'DELETE FROM '
|
||||
. Util::backquote($relationParameters->columnCommentsFeature->database)
|
||||
. '.' . Util::backquote($relationParameters->columnCommentsFeature->columnInfo)
|
||||
. ' WHERE db_name = \'' . $this->dbi->escapeString($db) . '\''
|
||||
. ' AND table_name = \'' . $this->dbi->escapeString($table)
|
||||
. '\'';
|
||||
$this->dbi->queryAsControlUser($remove_query);
|
||||
}
|
||||
|
||||
if ($relationParameters->displayFeature !== null) {
|
||||
$remove_query = 'DELETE FROM '
|
||||
. Util::backquote($relationParameters->displayFeature->database)
|
||||
. '.' . Util::backquote($relationParameters->displayFeature->tableInfo)
|
||||
. ' WHERE db_name = \'' . $this->dbi->escapeString($db) . '\''
|
||||
. ' AND table_name = \'' . $this->dbi->escapeString($table)
|
||||
. '\'';
|
||||
$this->dbi->queryAsControlUser($remove_query);
|
||||
}
|
||||
|
||||
if ($relationParameters->pdfFeature !== null) {
|
||||
$remove_query = 'DELETE FROM '
|
||||
. Util::backquote($relationParameters->pdfFeature->database)
|
||||
. '.' . Util::backquote($relationParameters->pdfFeature->tableCoords)
|
||||
. ' WHERE db_name = \'' . $this->dbi->escapeString($db) . '\''
|
||||
. ' AND table_name = \'' . $this->dbi->escapeString($table)
|
||||
. '\'';
|
||||
$this->dbi->queryAsControlUser($remove_query);
|
||||
}
|
||||
|
||||
if ($relationParameters->relationFeature !== null) {
|
||||
$remove_query = 'DELETE FROM '
|
||||
. Util::backquote($relationParameters->relationFeature->database)
|
||||
. '.' . Util::backquote($relationParameters->relationFeature->relation)
|
||||
. ' WHERE master_db = \'' . $this->dbi->escapeString($db)
|
||||
. '\''
|
||||
. ' AND master_table = \'' . $this->dbi->escapeString($table)
|
||||
. '\'';
|
||||
$this->dbi->queryAsControlUser($remove_query);
|
||||
|
||||
$remove_query = 'DELETE FROM '
|
||||
. Util::backquote($relationParameters->relationFeature->database)
|
||||
. '.' . Util::backquote($relationParameters->relationFeature->relation)
|
||||
. ' WHERE foreign_db = \'' . $this->dbi->escapeString($db)
|
||||
. '\''
|
||||
. ' AND foreign_table = \'' . $this->dbi->escapeString($table)
|
||||
. '\'';
|
||||
$this->dbi->queryAsControlUser($remove_query);
|
||||
}
|
||||
|
||||
if ($relationParameters->uiPreferencesFeature !== null) {
|
||||
$remove_query = 'DELETE FROM '
|
||||
. Util::backquote($relationParameters->uiPreferencesFeature->database)
|
||||
. '.' . Util::backquote($relationParameters->uiPreferencesFeature->tableUiPrefs)
|
||||
. ' WHERE db_name = \'' . $this->dbi->escapeString($db) . '\''
|
||||
. ' AND table_name = \'' . $this->dbi->escapeString($table)
|
||||
. '\'';
|
||||
$this->dbi->queryAsControlUser($remove_query);
|
||||
}
|
||||
|
||||
if ($relationParameters->navigationItemsHidingFeature === null) {
|
||||
return;
|
||||
}
|
||||
|
||||
$remove_query = 'DELETE FROM '
|
||||
. Util::backquote($relationParameters->navigationItemsHidingFeature->database)
|
||||
. '.' . Util::backquote($relationParameters->navigationItemsHidingFeature->navigationHiding)
|
||||
. ' WHERE db_name = \'' . $this->dbi->escapeString($db) . '\''
|
||||
. ' AND (table_name = \'' . $this->dbi->escapeString($table)
|
||||
. '\''
|
||||
. ' OR (item_name = \'' . $this->dbi->escapeString($table)
|
||||
. '\''
|
||||
. ' AND item_type = \'table\'))';
|
||||
$this->dbi->queryAsControlUser($remove_query);
|
||||
}
|
||||
|
||||
/**
|
||||
* Cleanup database related relation stuff
|
||||
*
|
||||
* @param string $db database name
|
||||
*/
|
||||
public function database($db): void
|
||||
{
|
||||
$relationParameters = $this->relation->getRelationParameters();
|
||||
if ($relationParameters->db === null) {
|
||||
return;
|
||||
}
|
||||
|
||||
if ($relationParameters->columnCommentsFeature !== null) {
|
||||
$remove_query = 'DELETE FROM '
|
||||
. Util::backquote($relationParameters->columnCommentsFeature->database)
|
||||
. '.' . Util::backquote($relationParameters->columnCommentsFeature->columnInfo)
|
||||
. ' WHERE db_name = \'' . $this->dbi->escapeString($db) . '\'';
|
||||
$this->dbi->queryAsControlUser($remove_query);
|
||||
}
|
||||
|
||||
if ($relationParameters->bookmarkFeature !== null) {
|
||||
$remove_query = 'DELETE FROM '
|
||||
. Util::backquote($relationParameters->bookmarkFeature->database)
|
||||
. '.' . Util::backquote($relationParameters->bookmarkFeature->bookmark)
|
||||
. ' WHERE dbase = \'' . $this->dbi->escapeString($db) . '\'';
|
||||
$this->dbi->queryAsControlUser($remove_query);
|
||||
}
|
||||
|
||||
if ($relationParameters->displayFeature !== null) {
|
||||
$remove_query = 'DELETE FROM '
|
||||
. Util::backquote($relationParameters->displayFeature->database)
|
||||
. '.' . Util::backquote($relationParameters->displayFeature->tableInfo)
|
||||
. ' WHERE db_name = \'' . $this->dbi->escapeString($db) . '\'';
|
||||
$this->dbi->queryAsControlUser($remove_query);
|
||||
}
|
||||
|
||||
if ($relationParameters->pdfFeature !== null) {
|
||||
$remove_query = 'DELETE FROM '
|
||||
. Util::backquote($relationParameters->pdfFeature->database)
|
||||
. '.' . Util::backquote($relationParameters->pdfFeature->pdfPages)
|
||||
. ' WHERE db_name = \'' . $this->dbi->escapeString($db) . '\'';
|
||||
$this->dbi->queryAsControlUser($remove_query);
|
||||
|
||||
$remove_query = 'DELETE FROM '
|
||||
. Util::backquote($relationParameters->pdfFeature->database)
|
||||
. '.' . Util::backquote($relationParameters->pdfFeature->tableCoords)
|
||||
. ' WHERE db_name = \'' . $this->dbi->escapeString($db) . '\'';
|
||||
$this->dbi->queryAsControlUser($remove_query);
|
||||
}
|
||||
|
||||
if ($relationParameters->relationFeature !== null) {
|
||||
$remove_query = 'DELETE FROM '
|
||||
. Util::backquote($relationParameters->relationFeature->database)
|
||||
. '.' . Util::backquote($relationParameters->relationFeature->relation)
|
||||
. ' WHERE master_db = \''
|
||||
. $this->dbi->escapeString($db) . '\'';
|
||||
$this->dbi->queryAsControlUser($remove_query);
|
||||
|
||||
$remove_query = 'DELETE FROM '
|
||||
. Util::backquote($relationParameters->relationFeature->database)
|
||||
. '.' . Util::backquote($relationParameters->relationFeature->relation)
|
||||
. ' WHERE foreign_db = \'' . $this->dbi->escapeString($db)
|
||||
. '\'';
|
||||
$this->dbi->queryAsControlUser($remove_query);
|
||||
}
|
||||
|
||||
if ($relationParameters->uiPreferencesFeature !== null) {
|
||||
$remove_query = 'DELETE FROM '
|
||||
. Util::backquote($relationParameters->uiPreferencesFeature->database)
|
||||
. '.' . Util::backquote($relationParameters->uiPreferencesFeature->tableUiPrefs)
|
||||
. ' WHERE db_name = \'' . $this->dbi->escapeString($db) . '\'';
|
||||
$this->dbi->queryAsControlUser($remove_query);
|
||||
}
|
||||
|
||||
if ($relationParameters->navigationItemsHidingFeature !== null) {
|
||||
$remove_query = 'DELETE FROM '
|
||||
. Util::backquote($relationParameters->navigationItemsHidingFeature->database)
|
||||
. '.' . Util::backquote($relationParameters->navigationItemsHidingFeature->navigationHiding)
|
||||
. ' WHERE db_name = \'' . $this->dbi->escapeString($db) . '\'';
|
||||
$this->dbi->queryAsControlUser($remove_query);
|
||||
}
|
||||
|
||||
if ($relationParameters->savedQueryByExampleSearchesFeature !== null) {
|
||||
$remove_query = 'DELETE FROM '
|
||||
. Util::backquote($relationParameters->savedQueryByExampleSearchesFeature->database)
|
||||
. '.' . Util::backquote($relationParameters->savedQueryByExampleSearchesFeature->savedSearches)
|
||||
. ' WHERE db_name = \'' . $this->dbi->escapeString($db) . '\'';
|
||||
$this->dbi->queryAsControlUser($remove_query);
|
||||
}
|
||||
|
||||
if ($relationParameters->centralColumnsFeature === null) {
|
||||
return;
|
||||
}
|
||||
|
||||
$remove_query = 'DELETE FROM '
|
||||
. Util::backquote($relationParameters->centralColumnsFeature->database)
|
||||
. '.' . Util::backquote($relationParameters->centralColumnsFeature->centralColumns)
|
||||
. ' WHERE db_name = \'' . $this->dbi->escapeString($db) . '\'';
|
||||
$this->dbi->queryAsControlUser($remove_query);
|
||||
}
|
||||
|
||||
/**
|
||||
* Cleanup user related relation stuff
|
||||
*
|
||||
* @param string $username username
|
||||
*/
|
||||
public function user($username): void
|
||||
{
|
||||
$relationParameters = $this->relation->getRelationParameters();
|
||||
if ($relationParameters->db === null) {
|
||||
return;
|
||||
}
|
||||
|
||||
if ($relationParameters->bookmarkFeature !== null) {
|
||||
$remove_query = 'DELETE FROM '
|
||||
. Util::backquote($relationParameters->bookmarkFeature->database)
|
||||
. '.' . Util::backquote($relationParameters->bookmarkFeature->bookmark)
|
||||
. " WHERE `user` = '" . $this->dbi->escapeString($username)
|
||||
. "'";
|
||||
$this->dbi->queryAsControlUser($remove_query);
|
||||
}
|
||||
|
||||
if ($relationParameters->sqlHistoryFeature !== null) {
|
||||
$remove_query = 'DELETE FROM '
|
||||
. Util::backquote($relationParameters->sqlHistoryFeature->database)
|
||||
. '.' . Util::backquote($relationParameters->sqlHistoryFeature->history)
|
||||
. " WHERE `username` = '" . $this->dbi->escapeString($username)
|
||||
. "'";
|
||||
$this->dbi->queryAsControlUser($remove_query);
|
||||
}
|
||||
|
||||
if ($relationParameters->recentlyUsedTablesFeature !== null) {
|
||||
$remove_query = 'DELETE FROM '
|
||||
. Util::backquote($relationParameters->recentlyUsedTablesFeature->database)
|
||||
. '.' . Util::backquote($relationParameters->recentlyUsedTablesFeature->recent)
|
||||
. " WHERE `username` = '" . $this->dbi->escapeString($username)
|
||||
. "'";
|
||||
$this->dbi->queryAsControlUser($remove_query);
|
||||
}
|
||||
|
||||
if ($relationParameters->favoriteTablesFeature !== null) {
|
||||
$remove_query = 'DELETE FROM '
|
||||
. Util::backquote($relationParameters->favoriteTablesFeature->database)
|
||||
. '.' . Util::backquote($relationParameters->favoriteTablesFeature->favorite)
|
||||
. " WHERE `username` = '" . $this->dbi->escapeString($username)
|
||||
. "'";
|
||||
$this->dbi->queryAsControlUser($remove_query);
|
||||
}
|
||||
|
||||
if ($relationParameters->uiPreferencesFeature !== null) {
|
||||
$remove_query = 'DELETE FROM '
|
||||
. Util::backquote($relationParameters->uiPreferencesFeature->database)
|
||||
. '.' . Util::backquote($relationParameters->uiPreferencesFeature->tableUiPrefs)
|
||||
. " WHERE `username` = '" . $this->dbi->escapeString($username)
|
||||
. "'";
|
||||
$this->dbi->queryAsControlUser($remove_query);
|
||||
}
|
||||
|
||||
if ($relationParameters->userPreferencesFeature !== null) {
|
||||
$remove_query = 'DELETE FROM '
|
||||
. Util::backquote($relationParameters->userPreferencesFeature->database)
|
||||
. '.' . Util::backquote($relationParameters->userPreferencesFeature->userConfig)
|
||||
. " WHERE `username` = '" . $this->dbi->escapeString($username)
|
||||
. "'";
|
||||
$this->dbi->queryAsControlUser($remove_query);
|
||||
}
|
||||
|
||||
if ($relationParameters->configurableMenusFeature !== null) {
|
||||
$remove_query = 'DELETE FROM '
|
||||
. Util::backquote($relationParameters->configurableMenusFeature->database)
|
||||
. '.' . Util::backquote($relationParameters->configurableMenusFeature->users)
|
||||
. " WHERE `username` = '" . $this->dbi->escapeString($username)
|
||||
. "'";
|
||||
$this->dbi->queryAsControlUser($remove_query);
|
||||
}
|
||||
|
||||
if ($relationParameters->navigationItemsHidingFeature !== null) {
|
||||
$remove_query = 'DELETE FROM '
|
||||
. Util::backquote($relationParameters->navigationItemsHidingFeature->database)
|
||||
. '.' . Util::backquote($relationParameters->navigationItemsHidingFeature->navigationHiding)
|
||||
. " WHERE `username` = '" . $this->dbi->escapeString($username)
|
||||
. "'";
|
||||
$this->dbi->queryAsControlUser($remove_query);
|
||||
}
|
||||
|
||||
if ($relationParameters->savedQueryByExampleSearchesFeature !== null) {
|
||||
$remove_query = 'DELETE FROM '
|
||||
. Util::backquote($relationParameters->savedQueryByExampleSearchesFeature->database)
|
||||
. '.' . Util::backquote($relationParameters->savedQueryByExampleSearchesFeature->savedSearches)
|
||||
. " WHERE `username` = '" . $this->dbi->escapeString($username)
|
||||
. "'";
|
||||
$this->dbi->queryAsControlUser($remove_query);
|
||||
}
|
||||
|
||||
if ($relationParameters->databaseDesignerSettingsFeature === null) {
|
||||
return;
|
||||
}
|
||||
|
||||
$remove_query = 'DELETE FROM '
|
||||
. Util::backquote($relationParameters->databaseDesignerSettingsFeature->database)
|
||||
. '.' . Util::backquote($relationParameters->databaseDesignerSettingsFeature->designerSettings)
|
||||
. " WHERE `username` = '" . $this->dbi->escapeString($username)
|
||||
. "'";
|
||||
$this->dbi->queryAsControlUser($remove_query);
|
||||
}
|
||||
}
|
|
@ -1,472 +0,0 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace PhpMyAdmin\ConfigStorage;
|
||||
|
||||
use PhpMyAdmin\ConfigStorage\Features\BookmarkFeature;
|
||||
use PhpMyAdmin\ConfigStorage\Features\BrowserTransformationFeature;
|
||||
use PhpMyAdmin\ConfigStorage\Features\CentralColumnsFeature;
|
||||
use PhpMyAdmin\ConfigStorage\Features\ColumnCommentsFeature;
|
||||
use PhpMyAdmin\ConfigStorage\Features\ConfigurableMenusFeature;
|
||||
use PhpMyAdmin\ConfigStorage\Features\DatabaseDesignerSettingsFeature;
|
||||
use PhpMyAdmin\ConfigStorage\Features\DisplayFeature;
|
||||
use PhpMyAdmin\ConfigStorage\Features\ExportTemplatesFeature;
|
||||
use PhpMyAdmin\ConfigStorage\Features\FavoriteTablesFeature;
|
||||
use PhpMyAdmin\ConfigStorage\Features\NavigationItemsHidingFeature;
|
||||
use PhpMyAdmin\ConfigStorage\Features\PdfFeature;
|
||||
use PhpMyAdmin\ConfigStorage\Features\RecentlyUsedTablesFeature;
|
||||
use PhpMyAdmin\ConfigStorage\Features\RelationFeature;
|
||||
use PhpMyAdmin\ConfigStorage\Features\SavedQueryByExampleSearchesFeature;
|
||||
use PhpMyAdmin\ConfigStorage\Features\SqlHistoryFeature;
|
||||
use PhpMyAdmin\ConfigStorage\Features\TrackingFeature;
|
||||
use PhpMyAdmin\ConfigStorage\Features\UiPreferencesFeature;
|
||||
use PhpMyAdmin\ConfigStorage\Features\UserPreferencesFeature;
|
||||
use PhpMyAdmin\Dbal\DatabaseName;
|
||||
use PhpMyAdmin\Dbal\TableName;
|
||||
use PhpMyAdmin\Version;
|
||||
use Webmozart\Assert\Assert;
|
||||
use Webmozart\Assert\InvalidArgumentException;
|
||||
|
||||
use function is_string;
|
||||
|
||||
/**
|
||||
* @psalm-immutable
|
||||
*/
|
||||
final class RelationParameters
|
||||
{
|
||||
/**
|
||||
* @var string|null
|
||||
* @psalm-var non-empty-string|null
|
||||
*/
|
||||
public $user;
|
||||
/** @var DatabaseName|null */
|
||||
public $db;
|
||||
|
||||
/** @var BookmarkFeature|null */
|
||||
public $bookmarkFeature;
|
||||
/** @var BrowserTransformationFeature|null */
|
||||
public $browserTransformationFeature;
|
||||
/** @var CentralColumnsFeature|null */
|
||||
public $centralColumnsFeature;
|
||||
/** @var ColumnCommentsFeature|null */
|
||||
public $columnCommentsFeature;
|
||||
/** @var ConfigurableMenusFeature|null */
|
||||
public $configurableMenusFeature;
|
||||
/** @var DatabaseDesignerSettingsFeature|null */
|
||||
public $databaseDesignerSettingsFeature;
|
||||
/** @var DisplayFeature|null */
|
||||
public $displayFeature;
|
||||
/** @var ExportTemplatesFeature|null */
|
||||
public $exportTemplatesFeature;
|
||||
/** @var FavoriteTablesFeature|null */
|
||||
public $favoriteTablesFeature;
|
||||
/** @var NavigationItemsHidingFeature|null */
|
||||
public $navigationItemsHidingFeature;
|
||||
/** @var PdfFeature|null */
|
||||
public $pdfFeature;
|
||||
/** @var RecentlyUsedTablesFeature|null */
|
||||
public $recentlyUsedTablesFeature;
|
||||
/** @var RelationFeature|null */
|
||||
public $relationFeature;
|
||||
/** @var SavedQueryByExampleSearchesFeature|null */
|
||||
public $savedQueryByExampleSearchesFeature;
|
||||
/** @var SqlHistoryFeature|null */
|
||||
public $sqlHistoryFeature;
|
||||
/** @var TrackingFeature|null */
|
||||
public $trackingFeature;
|
||||
/** @var UiPreferencesFeature|null */
|
||||
public $uiPreferencesFeature;
|
||||
/** @var UserPreferencesFeature|null */
|
||||
public $userPreferencesFeature;
|
||||
|
||||
/**
|
||||
* @psalm-param non-empty-string|null $user
|
||||
*/
|
||||
public function __construct(
|
||||
?string $user,
|
||||
?DatabaseName $db,
|
||||
?BookmarkFeature $bookmarkFeature = null,
|
||||
?BrowserTransformationFeature $browserTransformationFeature = null,
|
||||
?CentralColumnsFeature $centralColumnsFeature = null,
|
||||
?ColumnCommentsFeature $columnCommentsFeature = null,
|
||||
?ConfigurableMenusFeature $configurableMenusFeature = null,
|
||||
?DatabaseDesignerSettingsFeature $databaseDesignerSettingsFeature = null,
|
||||
?DisplayFeature $displayFeature = null,
|
||||
?ExportTemplatesFeature $exportTemplatesFeature = null,
|
||||
?FavoriteTablesFeature $favoriteTablesFeature = null,
|
||||
?NavigationItemsHidingFeature $navigationItemsHidingFeature = null,
|
||||
?PdfFeature $pdfFeature = null,
|
||||
?RecentlyUsedTablesFeature $recentlyUsedTablesFeature = null,
|
||||
?RelationFeature $relationFeature = null,
|
||||
?SavedQueryByExampleSearchesFeature $savedQueryByExampleSearchesFeature = null,
|
||||
?SqlHistoryFeature $sqlHistoryFeature = null,
|
||||
?TrackingFeature $trackingFeature = null,
|
||||
?UiPreferencesFeature $uiPreferencesFeature = null,
|
||||
?UserPreferencesFeature $userPreferencesFeature = null
|
||||
) {
|
||||
$this->user = $user;
|
||||
$this->db = $db;
|
||||
$this->bookmarkFeature = $bookmarkFeature;
|
||||
$this->browserTransformationFeature = $browserTransformationFeature;
|
||||
$this->centralColumnsFeature = $centralColumnsFeature;
|
||||
$this->columnCommentsFeature = $columnCommentsFeature;
|
||||
$this->configurableMenusFeature = $configurableMenusFeature;
|
||||
$this->databaseDesignerSettingsFeature = $databaseDesignerSettingsFeature;
|
||||
$this->displayFeature = $displayFeature;
|
||||
$this->exportTemplatesFeature = $exportTemplatesFeature;
|
||||
$this->favoriteTablesFeature = $favoriteTablesFeature;
|
||||
$this->navigationItemsHidingFeature = $navigationItemsHidingFeature;
|
||||
$this->pdfFeature = $pdfFeature;
|
||||
$this->recentlyUsedTablesFeature = $recentlyUsedTablesFeature;
|
||||
$this->relationFeature = $relationFeature;
|
||||
$this->savedQueryByExampleSearchesFeature = $savedQueryByExampleSearchesFeature;
|
||||
$this->sqlHistoryFeature = $sqlHistoryFeature;
|
||||
$this->trackingFeature = $trackingFeature;
|
||||
$this->uiPreferencesFeature = $uiPreferencesFeature;
|
||||
$this->userPreferencesFeature = $userPreferencesFeature;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param mixed[] $params
|
||||
*/
|
||||
public static function fromArray(array $params): self
|
||||
{
|
||||
$user = null;
|
||||
if (isset($params['user']) && is_string($params['user']) && $params['user'] !== '') {
|
||||
$user = $params['user'];
|
||||
}
|
||||
|
||||
try {
|
||||
Assert::keyExists($params, 'db');
|
||||
$db = DatabaseName::fromValue($params['db']);
|
||||
} catch (InvalidArgumentException $exception) {
|
||||
return new self($user, null);
|
||||
}
|
||||
|
||||
$bookmarkFeature = null;
|
||||
if (isset($params['bookmarkwork'], $params['bookmark']) && $params['bookmarkwork']) {
|
||||
$bookmark = self::getTableName($params['bookmark']);
|
||||
if ($bookmark !== null) {
|
||||
$bookmarkFeature = new BookmarkFeature($db, $bookmark);
|
||||
}
|
||||
}
|
||||
|
||||
$columnInfo = self::getTableName($params['column_info'] ?? null);
|
||||
$browserTransformationFeature = null;
|
||||
if (isset($params['mimework']) && $params['mimework'] && $columnInfo !== null) {
|
||||
$browserTransformationFeature = new BrowserTransformationFeature($db, $columnInfo);
|
||||
}
|
||||
|
||||
$columnCommentsFeature = null;
|
||||
if (isset($params['commwork']) && $params['commwork'] && $columnInfo !== null) {
|
||||
$columnCommentsFeature = new ColumnCommentsFeature($db, $columnInfo);
|
||||
}
|
||||
|
||||
$centralColumnsFeature = null;
|
||||
if (isset($params['centralcolumnswork'], $params['central_columns']) && $params['centralcolumnswork']) {
|
||||
$centralColumns = self::getTableName($params['central_columns']);
|
||||
if ($centralColumns !== null) {
|
||||
$centralColumnsFeature = new CentralColumnsFeature($db, $centralColumns);
|
||||
}
|
||||
}
|
||||
|
||||
$configurableMenusFeature = null;
|
||||
if (isset($params['menuswork'], $params['usergroups'], $params['users']) && $params['menuswork']) {
|
||||
$userGroups = self::getTableName($params['usergroups']);
|
||||
$users = self::getTableName($params['users']);
|
||||
if ($userGroups !== null && $users !== null) {
|
||||
$configurableMenusFeature = new ConfigurableMenusFeature($db, $userGroups, $users);
|
||||
}
|
||||
}
|
||||
|
||||
$databaseDesignerSettingsFeature = null;
|
||||
if (isset($params['designersettingswork'], $params['designer_settings']) && $params['designersettingswork']) {
|
||||
$designerSettings = self::getTableName($params['designer_settings']);
|
||||
if ($designerSettings !== null) {
|
||||
$databaseDesignerSettingsFeature = new DatabaseDesignerSettingsFeature($db, $designerSettings);
|
||||
}
|
||||
}
|
||||
|
||||
$relation = self::getTableName($params['relation'] ?? null);
|
||||
$displayFeature = null;
|
||||
if (isset($params['displaywork'], $params['table_info']) && $params['displaywork'] && $relation !== null) {
|
||||
$tableInfo = self::getTableName($params['table_info']);
|
||||
if ($tableInfo !== null) {
|
||||
$displayFeature = new DisplayFeature($db, $relation, $tableInfo);
|
||||
}
|
||||
}
|
||||
|
||||
$exportTemplatesFeature = null;
|
||||
if (isset($params['exporttemplateswork'], $params['export_templates']) && $params['exporttemplateswork']) {
|
||||
$exportTemplates = self::getTableName($params['export_templates']);
|
||||
if ($exportTemplates !== null) {
|
||||
$exportTemplatesFeature = new ExportTemplatesFeature($db, $exportTemplates);
|
||||
}
|
||||
}
|
||||
|
||||
$favoriteTablesFeature = null;
|
||||
if (isset($params['favoritework'], $params['favorite']) && $params['favoritework']) {
|
||||
$favorite = self::getTableName($params['favorite']);
|
||||
if ($favorite !== null) {
|
||||
$favoriteTablesFeature = new FavoriteTablesFeature($db, $favorite);
|
||||
}
|
||||
}
|
||||
|
||||
$navigationItemsHidingFeature = null;
|
||||
if (isset($params['navwork'], $params['navigationhiding']) && $params['navwork']) {
|
||||
$navigationHiding = self::getTableName($params['navigationhiding']);
|
||||
if ($navigationHiding !== null) {
|
||||
$navigationItemsHidingFeature = new NavigationItemsHidingFeature($db, $navigationHiding);
|
||||
}
|
||||
}
|
||||
|
||||
$pdfFeature = null;
|
||||
if (isset($params['pdfwork'], $params['pdf_pages'], $params['table_coords']) && $params['pdfwork']) {
|
||||
$pdfPages = self::getTableName($params['pdf_pages']);
|
||||
$tableCoords = self::getTableName($params['table_coords']);
|
||||
if ($pdfPages !== null && $tableCoords !== null) {
|
||||
$pdfFeature = new PdfFeature($db, $pdfPages, $tableCoords);
|
||||
}
|
||||
}
|
||||
|
||||
$recentlyUsedTablesFeature = null;
|
||||
if (isset($params['recentwork'], $params['recent']) && $params['recentwork']) {
|
||||
$recent = self::getTableName($params['recent']);
|
||||
if ($recent !== null) {
|
||||
$recentlyUsedTablesFeature = new RecentlyUsedTablesFeature($db, $recent);
|
||||
}
|
||||
}
|
||||
|
||||
$relationFeature = null;
|
||||
if (isset($params['relwork']) && $params['relwork'] && $relation !== null) {
|
||||
$relationFeature = new RelationFeature($db, $relation);
|
||||
}
|
||||
|
||||
$savedQueryByExampleSearchesFeature = null;
|
||||
if (isset($params['savedsearcheswork'], $params['savedsearches']) && $params['savedsearcheswork']) {
|
||||
$savedSearches = self::getTableName($params['savedsearches']);
|
||||
if ($savedSearches !== null) {
|
||||
$savedQueryByExampleSearchesFeature = new SavedQueryByExampleSearchesFeature($db, $savedSearches);
|
||||
}
|
||||
}
|
||||
|
||||
$sqlHistoryFeature = null;
|
||||
if (isset($params['historywork'], $params['history']) && $params['historywork']) {
|
||||
$history = self::getTableName($params['history']);
|
||||
if ($history !== null) {
|
||||
$sqlHistoryFeature = new SqlHistoryFeature($db, $history);
|
||||
}
|
||||
}
|
||||
|
||||
$trackingFeature = null;
|
||||
if (isset($params['trackingwork'], $params['tracking']) && $params['trackingwork']) {
|
||||
$tracking = self::getTableName($params['tracking']);
|
||||
if ($tracking !== null) {
|
||||
$trackingFeature = new TrackingFeature($db, $tracking);
|
||||
}
|
||||
}
|
||||
|
||||
$uiPreferencesFeature = null;
|
||||
if (isset($params['uiprefswork'], $params['table_uiprefs']) && $params['uiprefswork']) {
|
||||
$tableUiPrefs = self::getTableName($params['table_uiprefs']);
|
||||
if ($tableUiPrefs !== null) {
|
||||
$uiPreferencesFeature = new UiPreferencesFeature($db, $tableUiPrefs);
|
||||
}
|
||||
}
|
||||
|
||||
$userPreferencesFeature = null;
|
||||
if (isset($params['userconfigwork'], $params['userconfig']) && $params['userconfigwork']) {
|
||||
$userConfig = self::getTableName($params['userconfig']);
|
||||
if ($userConfig !== null) {
|
||||
$userPreferencesFeature = new UserPreferencesFeature($db, $userConfig);
|
||||
}
|
||||
}
|
||||
|
||||
return new self(
|
||||
$user,
|
||||
$db,
|
||||
$bookmarkFeature,
|
||||
$browserTransformationFeature,
|
||||
$centralColumnsFeature,
|
||||
$columnCommentsFeature,
|
||||
$configurableMenusFeature,
|
||||
$databaseDesignerSettingsFeature,
|
||||
$displayFeature,
|
||||
$exportTemplatesFeature,
|
||||
$favoriteTablesFeature,
|
||||
$navigationItemsHidingFeature,
|
||||
$pdfFeature,
|
||||
$recentlyUsedTablesFeature,
|
||||
$relationFeature,
|
||||
$savedQueryByExampleSearchesFeature,
|
||||
$sqlHistoryFeature,
|
||||
$trackingFeature,
|
||||
$uiPreferencesFeature,
|
||||
$userPreferencesFeature
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array<string, bool|string|null>
|
||||
* @psalm-return array{
|
||||
* version: string,
|
||||
* user: (string|null),
|
||||
* db: (string|null),
|
||||
* bookmark: (string|null),
|
||||
* central_columns: (string|null),
|
||||
* column_info: (string|null),
|
||||
* designer_settings: (string|null),
|
||||
* export_templates: (string|null),
|
||||
* favorite: (string|null),
|
||||
* history: (string|null),
|
||||
* navigationhiding: (string|null),
|
||||
* pdf_pages: (string|null),
|
||||
* recent: (string|null),
|
||||
* relation: (string|null),
|
||||
* savedsearches: (string|null),
|
||||
* table_coords: (string|null),
|
||||
* table_info: (string|null),
|
||||
* table_uiprefs: (string|null),
|
||||
* tracking: (string|null),
|
||||
* userconfig: (string|null),
|
||||
* usergroups: (string|null),
|
||||
* users: (string|null),
|
||||
* bookmarkwork: bool,
|
||||
* mimework: bool,
|
||||
* centralcolumnswork: bool,
|
||||
* commwork: bool,
|
||||
* menuswork: bool,
|
||||
* designersettingswork: bool,
|
||||
* displaywork: bool,
|
||||
* exporttemplateswork: bool,
|
||||
* favoritework: bool,
|
||||
* navwork: bool,
|
||||
* pdfwork: bool,
|
||||
* recentwork: bool,
|
||||
* relwork: bool,
|
||||
* savedsearcheswork: bool,
|
||||
* historywork: bool,
|
||||
* trackingwork: bool,
|
||||
* uiprefswork: bool,
|
||||
* userconfigwork: bool,
|
||||
* allworks: bool
|
||||
* }
|
||||
*/
|
||||
public function toArray(): array
|
||||
{
|
||||
$columnInfo = null;
|
||||
if ($this->columnCommentsFeature !== null) {
|
||||
$columnInfo = $this->columnCommentsFeature->columnInfo->getName();
|
||||
} elseif ($this->browserTransformationFeature !== null) {
|
||||
$columnInfo = $this->browserTransformationFeature->columnInfo->getName();
|
||||
}
|
||||
|
||||
$relation = null;
|
||||
if ($this->relationFeature !== null) {
|
||||
$relation = $this->relationFeature->relation->getName();
|
||||
} elseif ($this->displayFeature !== null) {
|
||||
$relation = $this->displayFeature->relation->getName();
|
||||
}
|
||||
|
||||
return [
|
||||
'version' => Version::VERSION,
|
||||
'user' => $this->user,
|
||||
'db' => $this->db !== null ? $this->db->getName() : null,
|
||||
'bookmark' => $this->bookmarkFeature !== null ? $this->bookmarkFeature->bookmark->getName() : null,
|
||||
'central_columns' => $this->centralColumnsFeature !== null
|
||||
? $this->centralColumnsFeature->centralColumns->getName()
|
||||
: null,
|
||||
'column_info' => $columnInfo,
|
||||
'designer_settings' => $this->databaseDesignerSettingsFeature !== null
|
||||
? $this->databaseDesignerSettingsFeature->designerSettings->getName()
|
||||
: null,
|
||||
'export_templates' => $this->exportTemplatesFeature !== null
|
||||
? $this->exportTemplatesFeature->exportTemplates->getName()
|
||||
: null,
|
||||
'favorite' => $this->favoriteTablesFeature !== null
|
||||
? $this->favoriteTablesFeature->favorite->getName()
|
||||
: null,
|
||||
'history' => $this->sqlHistoryFeature !== null ? $this->sqlHistoryFeature->history->getName() : null,
|
||||
'navigationhiding' => $this->navigationItemsHidingFeature !== null
|
||||
? $this->navigationItemsHidingFeature->navigationHiding->getName()
|
||||
: null,
|
||||
'pdf_pages' => $this->pdfFeature !== null ? $this->pdfFeature->pdfPages->getName() : null,
|
||||
'recent' => $this->recentlyUsedTablesFeature !== null
|
||||
? $this->recentlyUsedTablesFeature->recent->getName()
|
||||
: null,
|
||||
'relation' => $relation,
|
||||
'savedsearches' => $this->savedQueryByExampleSearchesFeature !== null
|
||||
? $this->savedQueryByExampleSearchesFeature->savedSearches->getName()
|
||||
: null,
|
||||
'table_coords' => $this->pdfFeature !== null ? $this->pdfFeature->tableCoords->getName() : null,
|
||||
'table_info' => $this->displayFeature !== null ? $this->displayFeature->tableInfo->getName() : null,
|
||||
'table_uiprefs' => $this->uiPreferencesFeature !== null
|
||||
? $this->uiPreferencesFeature->tableUiPrefs->getName()
|
||||
: null,
|
||||
'tracking' => $this->trackingFeature !== null ? $this->trackingFeature->tracking->getName() : null,
|
||||
'userconfig' => $this->userPreferencesFeature !== null
|
||||
? $this->userPreferencesFeature->userConfig->getName()
|
||||
: null,
|
||||
'usergroups' => $this->configurableMenusFeature !== null
|
||||
? $this->configurableMenusFeature->userGroups->getName()
|
||||
: null,
|
||||
'users' => $this->configurableMenusFeature !== null
|
||||
? $this->configurableMenusFeature->users->getName()
|
||||
: null,
|
||||
'bookmarkwork' => $this->bookmarkFeature !== null,
|
||||
'mimework' => $this->browserTransformationFeature !== null,
|
||||
'centralcolumnswork' => $this->centralColumnsFeature !== null,
|
||||
'commwork' => $this->columnCommentsFeature !== null,
|
||||
'menuswork' => $this->configurableMenusFeature !== null,
|
||||
'designersettingswork' => $this->databaseDesignerSettingsFeature !== null,
|
||||
'displaywork' => $this->displayFeature !== null,
|
||||
'exporttemplateswork' => $this->exportTemplatesFeature !== null,
|
||||
'favoritework' => $this->favoriteTablesFeature !== null,
|
||||
'navwork' => $this->navigationItemsHidingFeature !== null,
|
||||
'pdfwork' => $this->pdfFeature !== null,
|
||||
'recentwork' => $this->recentlyUsedTablesFeature !== null,
|
||||
'relwork' => $this->relationFeature !== null,
|
||||
'savedsearcheswork' => $this->savedQueryByExampleSearchesFeature !== null,
|
||||
'historywork' => $this->sqlHistoryFeature !== null,
|
||||
'trackingwork' => $this->trackingFeature !== null,
|
||||
'uiprefswork' => $this->uiPreferencesFeature !== null,
|
||||
'userconfigwork' => $this->userPreferencesFeature !== null,
|
||||
'allworks' => $this->hasAllFeatures(),
|
||||
];
|
||||
}
|
||||
|
||||
public function hasAllFeatures(): bool
|
||||
{
|
||||
return $this->bookmarkFeature !== null
|
||||
&& $this->browserTransformationFeature !== null
|
||||
&& $this->centralColumnsFeature !== null
|
||||
&& $this->columnCommentsFeature !== null
|
||||
&& $this->configurableMenusFeature !== null
|
||||
&& $this->databaseDesignerSettingsFeature !== null
|
||||
&& $this->displayFeature !== null
|
||||
&& $this->exportTemplatesFeature !== null
|
||||
&& $this->favoriteTablesFeature !== null
|
||||
&& $this->navigationItemsHidingFeature !== null
|
||||
&& $this->pdfFeature !== null
|
||||
&& $this->recentlyUsedTablesFeature !== null
|
||||
&& $this->relationFeature !== null
|
||||
&& $this->savedQueryByExampleSearchesFeature !== null
|
||||
&& $this->sqlHistoryFeature !== null
|
||||
&& $this->trackingFeature !== null
|
||||
&& $this->uiPreferencesFeature !== null
|
||||
&& $this->userPreferencesFeature !== null;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param mixed $tableName
|
||||
*/
|
||||
private static function getTableName($tableName): ?TableName
|
||||
{
|
||||
try {
|
||||
return TableName::fromValue($tableName);
|
||||
} catch (InvalidArgumentException $exception) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,350 +0,0 @@
|
|||
<?php
|
||||
/**
|
||||
* set of functions for user group handling
|
||||
*/
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace PhpMyAdmin\ConfigStorage;
|
||||
|
||||
use PhpMyAdmin\ConfigStorage\Features\ConfigurableMenusFeature;
|
||||
use PhpMyAdmin\Html\Generator;
|
||||
use PhpMyAdmin\Template;
|
||||
use PhpMyAdmin\Url;
|
||||
use PhpMyAdmin\Util;
|
||||
|
||||
use function __;
|
||||
use function array_keys;
|
||||
use function htmlspecialchars;
|
||||
use function implode;
|
||||
use function in_array;
|
||||
use function mb_substr;
|
||||
use function substr;
|
||||
|
||||
/**
|
||||
* PhpMyAdmin\Server\UserGroups class
|
||||
*/
|
||||
class UserGroups
|
||||
{
|
||||
/**
|
||||
* Return HTML to list the users belonging to a given user group
|
||||
*
|
||||
* @param string $userGroup user group name
|
||||
*
|
||||
* @return string HTML to list the users belonging to a given user group
|
||||
*/
|
||||
public static function getHtmlForListingUsersofAGroup(
|
||||
ConfigurableMenusFeature $configurableMenusFeature,
|
||||
string $userGroup
|
||||
): string {
|
||||
global $dbi;
|
||||
|
||||
$users = [];
|
||||
$numRows = 0;
|
||||
|
||||
$userGroupSpecialChars = htmlspecialchars($userGroup);
|
||||
$usersTable = Util::backquote($configurableMenusFeature->database)
|
||||
. '.' . Util::backquote($configurableMenusFeature->users);
|
||||
$sql_query = 'SELECT `username` FROM ' . $usersTable
|
||||
. " WHERE `usergroup`='" . $dbi->escapeString($userGroup)
|
||||
. "'";
|
||||
$result = $dbi->tryQueryAsControlUser($sql_query);
|
||||
if ($result) {
|
||||
$i = 0;
|
||||
while ($row = $result->fetchRow()) {
|
||||
$users[] = [
|
||||
'count' => ++$i,
|
||||
'user' => $row[0],
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
$template = new Template();
|
||||
|
||||
return $template->render('server/user_groups/user_listings', [
|
||||
'user_group_special_chars' => $userGroupSpecialChars,
|
||||
'num_rows' => $numRows,
|
||||
'users' => $users,
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns HTML for the 'user groups' table
|
||||
*
|
||||
* @return string HTML for the 'user groups' table
|
||||
*/
|
||||
public static function getHtmlForUserGroupsTable(ConfigurableMenusFeature $configurableMenusFeature): string
|
||||
{
|
||||
global $dbi;
|
||||
|
||||
$groupTable = Util::backquote($configurableMenusFeature->database)
|
||||
. '.' . Util::backquote($configurableMenusFeature->userGroups);
|
||||
$sql_query = 'SELECT * FROM ' . $groupTable . ' ORDER BY `usergroup` ASC';
|
||||
$result = $dbi->tryQueryAsControlUser($sql_query);
|
||||
$userGroups = [];
|
||||
$userGroupsValues = [];
|
||||
$action = Url::getFromRoute('/server/privileges');
|
||||
$hidden_inputs = null;
|
||||
if ($result && $result->numRows()) {
|
||||
$hidden_inputs = Url::getHiddenInputs();
|
||||
foreach ($result as $row) {
|
||||
$groupName = $row['usergroup'];
|
||||
if (! isset($userGroups[$groupName])) {
|
||||
$userGroups[$groupName] = [];
|
||||
}
|
||||
|
||||
$userGroups[$groupName][$row['tab']] = $row['allowed'];
|
||||
}
|
||||
|
||||
foreach ($userGroups as $groupName => $tabs) {
|
||||
$userGroupVal = [];
|
||||
$userGroupVal['name'] = htmlspecialchars((string) $groupName);
|
||||
$userGroupVal['serverTab'] = self::getAllowedTabNames($tabs, 'server');
|
||||
$userGroupVal['dbTab'] = self::getAllowedTabNames($tabs, 'db');
|
||||
$userGroupVal['tableTab'] = self::getAllowedTabNames($tabs, 'table');
|
||||
$userGroupVal['userGroupUrl'] = Url::getFromRoute('/server/user-groups');
|
||||
$userGroupVal['viewUsersUrl'] = Url::getCommon(
|
||||
[
|
||||
'viewUsers' => 1,
|
||||
'userGroup' => $groupName,
|
||||
],
|
||||
'',
|
||||
false
|
||||
);
|
||||
$userGroupVal['viewUsersIcon'] = Generator::getIcon('b_usrlist', __('View users'));
|
||||
|
||||
$userGroupVal['editUsersUrl'] = Url::getCommon(
|
||||
[
|
||||
'editUserGroup' => 1,
|
||||
'userGroup' => $groupName,
|
||||
],
|
||||
'',
|
||||
false
|
||||
);
|
||||
$userGroupVal['editUsersIcon'] = Generator::getIcon('b_edit', __('Edit'));
|
||||
$userGroupsValues[] = $userGroupVal;
|
||||
}
|
||||
}
|
||||
|
||||
$addUserUrl = Url::getFromRoute('/server/user-groups', ['addUserGroup' => 1]);
|
||||
$addUserIcon = Generator::getIcon('b_usradd');
|
||||
$template = new Template();
|
||||
|
||||
return $template->render('server/user_groups/user_groups', [
|
||||
'action' => $action,
|
||||
'hidden_inputs' => $hidden_inputs ?? '',
|
||||
'has_rows' => $userGroups !== [],
|
||||
'user_groups_values' => $userGroupsValues,
|
||||
'add_user_url' => $addUserUrl,
|
||||
'add_user_icon' => $addUserIcon,
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the list of allowed menu tab names
|
||||
* based on a data row from usergroup table.
|
||||
*
|
||||
* @param array $row row of usergroup table
|
||||
* @param string $level 'server', 'db' or 'table'
|
||||
*
|
||||
* @return string comma separated list of allowed menu tab names
|
||||
*/
|
||||
public static function getAllowedTabNames(array $row, string $level): string
|
||||
{
|
||||
$tabNames = [];
|
||||
$tabs = Util::getMenuTabList($level);
|
||||
foreach ($tabs as $tab => $tabName) {
|
||||
if (isset($row[$level . '_' . $tab]) && $row[$level . '_' . $tab] !== 'Y') {
|
||||
continue;
|
||||
}
|
||||
|
||||
$tabNames[] = $tabName;
|
||||
}
|
||||
|
||||
return implode(', ', $tabNames);
|
||||
}
|
||||
|
||||
/**
|
||||
* Deletes a user group
|
||||
*
|
||||
* @param string $userGroup user group name
|
||||
*/
|
||||
public static function delete(ConfigurableMenusFeature $configurableMenusFeature, string $userGroup): void
|
||||
{
|
||||
global $dbi;
|
||||
|
||||
$userTable = Util::backquote($configurableMenusFeature->database)
|
||||
. '.' . Util::backquote($configurableMenusFeature->users);
|
||||
$groupTable = Util::backquote($configurableMenusFeature->database)
|
||||
. '.' . Util::backquote($configurableMenusFeature->userGroups);
|
||||
$sql_query = 'DELETE FROM ' . $userTable
|
||||
. " WHERE `usergroup`='" . $dbi->escapeString($userGroup)
|
||||
. "'";
|
||||
$dbi->queryAsControlUser($sql_query);
|
||||
$sql_query = 'DELETE FROM ' . $groupTable
|
||||
. " WHERE `usergroup`='" . $dbi->escapeString($userGroup)
|
||||
. "'";
|
||||
$dbi->queryAsControlUser($sql_query);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns HTML for add/edit user group dialog
|
||||
*
|
||||
* @param string|null $userGroup name of the user group in case of editing
|
||||
*
|
||||
* @return string HTML for add/edit user group dialog
|
||||
*/
|
||||
public static function getHtmlToEditUserGroup(
|
||||
ConfigurableMenusFeature $configurableMenusFeature,
|
||||
?string $userGroup = null
|
||||
): string {
|
||||
global $dbi;
|
||||
|
||||
$urlParams = [];
|
||||
|
||||
$editUserGroupSpecialChars = '';
|
||||
if ($userGroup !== null) {
|
||||
$editUserGroupSpecialChars = htmlspecialchars($userGroup);
|
||||
}
|
||||
|
||||
if ($userGroup !== null) {
|
||||
$urlParams['userGroup'] = $userGroup;
|
||||
$urlParams['editUserGroupSubmit'] = '1';
|
||||
} else {
|
||||
$urlParams['addUserGroupSubmit'] = '1';
|
||||
}
|
||||
|
||||
$allowedTabs = [
|
||||
'server' => [],
|
||||
'db' => [],
|
||||
'table' => [],
|
||||
];
|
||||
if ($userGroup !== null) {
|
||||
$groupTable = Util::backquote($configurableMenusFeature->database)
|
||||
. '.' . Util::backquote($configurableMenusFeature->userGroups);
|
||||
$sql_query = 'SELECT * FROM ' . $groupTable
|
||||
. " WHERE `usergroup`='" . $dbi->escapeString($userGroup)
|
||||
. "'";
|
||||
$result = $dbi->tryQueryAsControlUser($sql_query);
|
||||
if ($result) {
|
||||
foreach ($result as $row) {
|
||||
$key = $row['tab'];
|
||||
$value = $row['allowed'];
|
||||
if (substr($key, 0, 7) === 'server_' && $value === 'Y') {
|
||||
$allowedTabs['server'][] = mb_substr($key, 7);
|
||||
} elseif (substr($key, 0, 3) === 'db_' && $value === 'Y') {
|
||||
$allowedTabs['db'][] = mb_substr($key, 3);
|
||||
} elseif (substr($key, 0, 6) === 'table_' && $value === 'Y') {
|
||||
$allowedTabs['table'][] = mb_substr($key, 6);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
unset($result);
|
||||
}
|
||||
|
||||
$tabList = self::getTabList(
|
||||
__('Server-level tabs'),
|
||||
'server',
|
||||
$allowedTabs['server']
|
||||
);
|
||||
$tabList .= self::getTabList(
|
||||
__('Database-level tabs'),
|
||||
'db',
|
||||
$allowedTabs['db']
|
||||
);
|
||||
$tabList .= self::getTabList(
|
||||
__('Table-level tabs'),
|
||||
'table',
|
||||
$allowedTabs['table']
|
||||
);
|
||||
|
||||
$template = new Template();
|
||||
|
||||
return $template->render('server/user_groups/edit_user_groups', [
|
||||
'user_group' => $userGroup,
|
||||
'edit_user_group_special_chars' => $editUserGroupSpecialChars,
|
||||
'user_group_url' => Url::getFromRoute('/server/user-groups'),
|
||||
'hidden_inputs' => Url::getHiddenInputs($urlParams),
|
||||
'tab_list' => $tabList,
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns HTML for checkbox groups to choose
|
||||
* tabs of 'server', 'db' or 'table' levels.
|
||||
*
|
||||
* @param string $title title of the checkbox group
|
||||
* @param string $level 'server', 'db' or 'table'
|
||||
* @param array $selected array of selected allowed tabs
|
||||
*
|
||||
* @return string HTML for checkbox groups
|
||||
*/
|
||||
public static function getTabList(string $title, string $level, array $selected): string
|
||||
{
|
||||
$tabs = Util::getMenuTabList($level);
|
||||
$tabDetails = [];
|
||||
foreach ($tabs as $tab => $tabName) {
|
||||
$tabDetail = [];
|
||||
$tabDetail['in_array'] = (in_array($tab, $selected) ? ' checked="checked"' : '');
|
||||
$tabDetail['tab'] = $tab;
|
||||
$tabDetail['tab_name'] = $tabName;
|
||||
$tabDetails[] = $tabDetail;
|
||||
}
|
||||
|
||||
$template = new Template();
|
||||
|
||||
return $template->render('server/user_groups/tab_list', [
|
||||
'title' => $title,
|
||||
'level' => $level,
|
||||
'tab_details' => $tabDetails,
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Add/update a user group with allowed menu tabs.
|
||||
*
|
||||
* @param string $userGroup user group name
|
||||
* @param bool $new whether this is a new user group
|
||||
*/
|
||||
public static function edit(
|
||||
ConfigurableMenusFeature $configurableMenusFeature,
|
||||
string $userGroup,
|
||||
bool $new = false
|
||||
): void {
|
||||
global $dbi;
|
||||
|
||||
$tabs = Util::getMenuTabList();
|
||||
$groupTable = Util::backquote($configurableMenusFeature->database)
|
||||
. '.' . Util::backquote($configurableMenusFeature->userGroups);
|
||||
|
||||
if (! $new) {
|
||||
$sql_query = 'DELETE FROM ' . $groupTable
|
||||
. " WHERE `usergroup`='" . $dbi->escapeString($userGroup)
|
||||
. "';";
|
||||
$dbi->queryAsControlUser($sql_query);
|
||||
}
|
||||
|
||||
$sql_query = 'INSERT INTO ' . $groupTable
|
||||
. '(`usergroup`, `tab`, `allowed`)'
|
||||
. ' VALUES ';
|
||||
$first = true;
|
||||
/** @var array<string, string> $tabGroup */
|
||||
foreach ($tabs as $tabGroupName => $tabGroup) {
|
||||
foreach (array_keys($tabGroup) as $tab) {
|
||||
if (! $first) {
|
||||
$sql_query .= ', ';
|
||||
}
|
||||
|
||||
$tabName = $tabGroupName . '_' . $tab;
|
||||
$allowed = isset($_POST[$tabName]) && $_POST[$tabName] === 'Y';
|
||||
$sql_query .= "('" . $dbi->escapeString($userGroup) . "', '" . $tabName . "', '"
|
||||
. ($allowed ? 'Y' : 'N') . "')";
|
||||
$first = false;
|
||||
}
|
||||
}
|
||||
|
||||
$sql_query .= ';';
|
||||
$dbi->queryAsControlUser($sql_query);
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue