diff --git a/phpstan-baseline.neon b/phpstan-baseline.neon
index b74c9114f5..b9cc5443a5 100644
--- a/phpstan-baseline.neon
+++ b/phpstan-baseline.neon
@@ -12564,7 +12564,7 @@ parameters:
-
message: '#^Construct empty\(\) is not allowed\. Use more strict comparison\.$#'
identifier: empty.notAllowed
- count: 34
+ count: 27
path: src/Plugins/Export/ExportSql.php
-
@@ -12579,6 +12579,12 @@ parameters:
count: 1
path: src/Plugins/Export/ExportSql.php
+ -
+ message: '#^Method PhpMyAdmin\\Plugins\\Export\\ExportSql\:\:setMaxQuerySize\(\) should return int\<0, max\> but returns int\.$#'
+ identifier: return.type
+ count: 2
+ path: src/Plugins/Export/ExportSql.php
+
-
message: '#^Only booleans are allowed in &&, bool\|null given on the left side\.$#'
identifier: booleanAnd.leftNotBoolean
@@ -12591,12 +12597,6 @@ parameters:
count: 1
path: src/Plugins/Export/ExportSql.php
- -
- message: '#^Only booleans are allowed in &&, mixed given on the right side\.$#'
- identifier: booleanAnd.rightNotBoolean
- count: 4
- path: src/Plugins/Export/ExportSql.php
-
-
message: '#^Only booleans are allowed in an if condition, bool\|null given\.$#'
identifier: if.condNotBoolean
@@ -21699,7 +21699,7 @@ parameters:
-
message: '#^Parameter \#2 \$haystack of static method PHPUnit\\Framework\\Assert\:\:assertStringContainsString\(\) expects string, mixed given\.$#'
identifier: argument.type
- count: 4
+ count: 2
path: tests/unit/Plugins/Export/ExportSqlTest.php
-
diff --git a/psalm-baseline.xml b/psalm-baseline.xml
index 968ba1e2a1..6219e44165 100644
--- a/psalm-baseline.xml
+++ b/psalm-baseline.xml
@@ -1458,22 +1458,6 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
@@ -4866,10 +4850,6 @@
-
-
-
-
@@ -7172,31 +7152,15 @@
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
@@ -7220,8 +7184,6 @@
-
-
@@ -7234,7 +7196,6 @@
-
name->database]]>
name->table]]>
table->table]]>
@@ -7246,6 +7207,9 @@
key->columns]]>
references->columns]]>
+
+ ]]>
+
@@ -7282,20 +7246,11 @@
-
-
-
-
-
-
-
-
-
collation)]]>
selectedServer['port'])]]>
@@ -13118,15 +13073,11 @@
-
-
selectedServer]]>
-
-
diff --git a/src/Controllers/Export/ExportController.php b/src/Controllers/Export/ExportController.php
index c2d0a0650a..a9c6182570 100644
--- a/src/Controllers/Export/ExportController.php
+++ b/src/Controllers/Export/ExportController.php
@@ -510,70 +510,6 @@ final class ExportController implements InvocableController
$GLOBALS['excel_edition'] = $postParams['excel_edition'];
}
- if (isset($postParams['sql_create_trigger'])) {
- $GLOBALS['sql_create_trigger'] = $postParams['sql_create_trigger'];
- }
-
- if (isset($postParams['sql_view_current_user'])) {
- $GLOBALS['sql_view_current_user'] = $postParams['sql_view_current_user'];
- }
-
- if (isset($postParams['sql_simple_view_export'])) {
- $GLOBALS['sql_simple_view_export'] = $postParams['sql_simple_view_export'];
- }
-
- if (isset($postParams['sql_if_not_exists'])) {
- $GLOBALS['sql_if_not_exists'] = $postParams['sql_if_not_exists'];
- }
-
- if (isset($postParams['sql_or_replace_view'])) {
- $GLOBALS['sql_or_replace_view'] = $postParams['sql_or_replace_view'];
- }
-
- if (isset($postParams['sql_auto_increment'])) {
- $GLOBALS['sql_auto_increment'] = $postParams['sql_auto_increment'];
- }
-
- if (isset($postParams['sql_truncate'])) {
- $GLOBALS['sql_truncate'] = $postParams['sql_truncate'];
- }
-
- if (isset($postParams['sql_delayed'])) {
- $GLOBALS['sql_delayed'] = $postParams['sql_delayed'];
- }
-
- if (isset($postParams['sql_ignore'])) {
- $GLOBALS['sql_ignore'] = $postParams['sql_ignore'];
- }
-
- if (isset($postParams['sql_insert_syntax'])) {
- $GLOBALS['sql_insert_syntax'] = $postParams['sql_insert_syntax'];
- }
-
- if (isset($postParams['sql_max_query_size'])) {
- $GLOBALS['sql_max_query_size'] = $postParams['sql_max_query_size'];
- }
-
- if (isset($postParams['sql_hex_for_binary'])) {
- $GLOBALS['sql_hex_for_binary'] = $postParams['sql_hex_for_binary'];
- }
-
- if (isset($postParams['sql_utc_time'])) {
- $GLOBALS['sql_utc_time'] = $postParams['sql_utc_time'];
- }
-
- if (isset($postParams['sql_drop_database'])) {
- $GLOBALS['sql_drop_database'] = $postParams['sql_drop_database'];
- }
-
- if (isset($postParams['sql_views_as_tables'])) {
- $GLOBALS['sql_views_as_tables'] = $postParams['sql_views_as_tables'];
- }
-
- if (isset($postParams['sql_metadata'])) {
- $GLOBALS['sql_metadata'] = $postParams['sql_metadata'];
- }
-
if (isset($postParams['csv_separator'])) {
$GLOBALS['csv_separator'] = $postParams['csv_separator'];
}
diff --git a/src/Export/Export.php b/src/Export/Export.php
index a65d5ec325..6f00963889 100644
--- a/src/Export/Export.php
+++ b/src/Export/Export.php
@@ -659,7 +659,7 @@ class Export
// now export the triggers (needs to be done after the data because
// triggers can modify already imported tables)
if (
- ! isset($GLOBALS['sql_create_trigger'])
+ ! ($exportPlugin instanceof ExportSql && $exportPlugin->hasCreateTrigger())
|| $structureOrData === StructureOrData::Data
|| ! in_array($table, $tableStructure, true)
) {
@@ -701,7 +701,7 @@ class Export
}
// export metadata related to this db
- if (isset($GLOBALS['sql_metadata'])) {
+ if ($exportPlugin instanceof ExportSql && $exportPlugin->hasMetadata()) {
// Types of metadata to export.
// In the future these can be allowed to be selected by the user
$metadataTypes = $this->getMetadataTypes();
@@ -840,7 +840,10 @@ class Export
// now export the triggers (needs to be done after the data because
// triggers can modify already imported tables)
- if (isset($GLOBALS['sql_create_trigger']) && $structureOrData !== StructureOrData::Data) {
+ if (
+ $exportPlugin instanceof ExportSql && $exportPlugin->hasCreateTrigger()
+ && $structureOrData !== StructureOrData::Data
+ ) {
if (! $exportPlugin->exportStructure($db, $table, 'triggers', $aliases)) {
return;
}
@@ -850,7 +853,7 @@ class Export
return;
}
- if (! isset($GLOBALS['sql_metadata'])) {
+ if (! ($exportPlugin instanceof ExportSql && $exportPlugin->hasMetadata())) {
return;
}
diff --git a/src/Plugins/Export/ExportSql.php b/src/Plugins/Export/ExportSql.php
index 173ca1b0f0..034d55ad82 100644
--- a/src/Plugins/Export/ExportSql.php
+++ b/src/Plugins/Export/ExportSql.php
@@ -48,6 +48,7 @@ use function explode;
use function implode;
use function in_array;
use function is_array;
+use function is_numeric;
use function is_string;
use function mb_strlen;
use function mb_strpos;
@@ -101,6 +102,27 @@ class ExportSql extends ExportPlugin
private string $type = 'INSERT';
private bool $createView = false;
+ private bool $createTrigger = false;
+ private bool $viewCurrentUser = false;
+ private bool $simpleViewExport = false;
+ private bool $ifNotExists = false;
+ private bool $orReplaceView = false;
+ private bool $autoIncrement = false;
+ private bool $truncate = false;
+ private bool $delayed = false;
+ private bool $ignore = false;
+
+ /** @var 'complete'|'extended'|'both'|'none' */
+ private string $insertSyntax = 'both';
+
+ /** @var int<0, max> */
+ private int $maxQuerySize = 50000;
+
+ private bool $hexForBinary = false;
+ private bool $utcTime = false;
+ private bool $dropDatabase = false;
+ private bool $viewsAsTables = false;
+ private bool $metadata = false;
/** @psalm-return non-empty-lowercase-string */
public function getName(): string
@@ -703,7 +725,7 @@ class ExportSql extends ExportPlugin
}
/* Restore timezone */
- if (isset($GLOBALS['sql_utc_time']) && $GLOBALS['sql_utc_time']) {
+ if ($this->utcTime) {
DatabaseInterface::getInstance()->query('SET time_zone = "' . $GLOBALS['old_tz'] . '"');
}
@@ -768,7 +790,7 @@ class ExportSql extends ExportPlugin
}
/* Change timezone if we should export timestamps in UTC */
- if (isset($GLOBALS['sql_utc_time']) && $GLOBALS['sql_utc_time']) {
+ if ($this->utcTime) {
$head .= 'SET time_zone = "+00:00";' . "\n";
$GLOBALS['old_tz'] = $dbi
->fetchValue('SELECT @@session.time_zone');
@@ -819,7 +841,7 @@ class ExportSql extends ExportPlugin
$dbAlias = $db;
}
- if ($this->structureOrData !== StructureOrData::Data && isset($GLOBALS['sql_drop_database'])) {
+ if ($this->structureOrData !== StructureOrData::Data && $this->dropDatabase) {
if (
! $this->export->outputHandler(
'DROP DATABASE IF EXISTS '
@@ -1232,7 +1254,7 @@ class ExportSql extends ExportPlugin
$createQuery .= 'CREATE TABLE ';
- if (isset($GLOBALS['sql_if_not_exists']) && $GLOBALS['sql_if_not_exists']) {
+ if ($this->ifNotExists) {
$createQuery .= 'IF NOT EXISTS ';
}
@@ -1269,7 +1291,7 @@ class ExportSql extends ExportPlugin
$viewAlias = $view;
$this->initAlias($aliases, $dbAlias, $viewAlias);
$createQuery = 'CREATE TABLE';
- if (isset($GLOBALS['sql_if_not_exists'])) {
+ if ($this->ifNotExists) {
$createQuery .= ' IF NOT EXISTS ';
}
@@ -1345,9 +1367,6 @@ class ExportSql extends ExportPlugin
bool $updateIndexesIncrements = true,
array $aliases = [],
): string {
- $GLOBALS['sql_indexes_query'] ??= null;
- $GLOBALS['sql_drop_foreign_keys'] ??= null;
-
$dbAlias = $db;
$tableAlias = $table;
$this->initAlias($aliases, $dbAlias, $tableAlias);
@@ -1452,12 +1471,12 @@ class ExportSql extends ExportPlugin
// exclude definition of current user
if (
Config::getInstance()->settings['Export']['remove_definer_from_definitions']
- || isset($GLOBALS['sql_view_current_user'])
+ || $this->viewCurrentUser
) {
$statement->options->remove('DEFINER');
}
- if (isset($GLOBALS['sql_simple_view_export'])) {
+ if ($this->simpleViewExport) {
$statement->options->remove('SQL SECURITY');
$statement->options->remove('INVOKER');
$statement->options->remove('ALGORITHM');
@@ -1467,7 +1486,7 @@ class ExportSql extends ExportPlugin
$createQuery = $statement->build();
// whether to replace existing view or not
- if (isset($GLOBALS['sql_or_replace_view'])) {
+ if ($this->orReplaceView) {
$createQuery = preg_replace('/^CREATE/', 'CREATE OR REPLACE', $createQuery);
}
}
@@ -1488,7 +1507,7 @@ class ExportSql extends ExportPlugin
}
// Adding IF NOT EXISTS, if required.
- if (isset($GLOBALS['sql_if_not_exists'])) {
+ if ($this->ifNotExists) {
$createQuery = (string) preg_replace('/^CREATE TABLE/', 'CREATE TABLE IF NOT EXISTS', $createQuery);
}
@@ -1551,11 +1570,6 @@ class ExportSql extends ExportPlugin
*/
$indexesFulltext = [];
- /**
- * Fragments containing definition of each foreign key that will be dropped.
- */
- $dropped = [];
-
/**
* Fragment containing definition of the `AUTO_INCREMENT`.
*/
@@ -1578,7 +1592,7 @@ class ExportSql extends ExportPlugin
if ($field->key->type === 'FULLTEXT KEY') {
$indexesFulltext[] = $field->build();
unset($statement->fields[$key]);
- } elseif (empty($GLOBALS['sql_if_not_exists'])) {
+ } elseif (! $this->ifNotExists) {
$indexes[] = str_replace(
'COMMENT=\'',
'COMMENT \'',
@@ -1590,7 +1604,6 @@ class ExportSql extends ExportPlugin
// Creating the parts that drop foreign keys.
if ($field->key !== null && $field->key->type === 'FOREIGN KEY' && $field->name !== null) {
- $dropped[] = 'FOREIGN KEY ' . Context::escape($field->name);
unset($statement->fields[$key]);
}
@@ -1599,7 +1612,7 @@ class ExportSql extends ExportPlugin
continue;
}
- if (! $field->options->has('AUTO_INCREMENT') || ! empty($GLOBALS['sql_if_not_exists'])) {
+ if (! $field->options->has('AUTO_INCREMENT') || $this->ifNotExists) {
continue;
}
@@ -1637,10 +1650,9 @@ class ExportSql extends ExportPlugin
}
// Generating indexes-related query.
- $GLOBALS['sql_indexes_query'] = '';
-
+ $indexesQuery = '';
if ($indexes !== []) {
- $GLOBALS['sql_indexes_query'] .= $alterHeader . "\n" . ' ADD '
+ $indexesQuery .= $alterHeader . "\n" . ' ADD '
. implode(',' . "\n" . ' ADD ', $indexes)
. $alterFooter;
}
@@ -1649,7 +1661,7 @@ class ExportSql extends ExportPlugin
// InnoDB supports one FULLTEXT index creation at a time.
// So FULLTEXT indexes are created one-by-one after other
// indexes where created.
- $GLOBALS['sql_indexes_query'] .= $alterHeader
+ $indexesQuery .= $alterHeader
. ' ADD ' . implode($alterFooter . $alterHeader . ' ADD ', $indexesFulltext)
. $alterFooter;
}
@@ -1661,14 +1673,7 @@ class ExportSql extends ExportPlugin
__('Indexes for table'),
$tableAlias,
$this->compatibility,
- ) . $GLOBALS['sql_indexes_query'];
- }
-
- // Generating drop foreign keys-related query.
- if ($dropped !== []) {
- $GLOBALS['sql_drop_foreign_keys'] = $alterHeader . "\n" . ' DROP '
- . implode(',' . "\n" . ' DROP ', $dropped)
- . $alterFooter;
+ ) . $indexesQuery;
}
// Generating auto-increment-related query.
@@ -1676,7 +1681,7 @@ class ExportSql extends ExportPlugin
$sqlAutoIncrementsQuery = $alterHeader . "\n" . ' MODIFY '
. implode(',' . "\n" . ' MODIFY ', $autoIncrement);
if (
- isset($GLOBALS['sql_auto_increment'])
+ $this->autoIncrement
&& $statement->entityOptions->has('AUTO_INCREMENT')
&& (! isset($GLOBALS['table_data']) || in_array($table, $GLOBALS['table_data']))
) {
@@ -1699,8 +1704,7 @@ class ExportSql extends ExportPlugin
// too.
if (
$statement->entityOptions !== null
- && (empty($GLOBALS['sql_if_not_exists'])
- || empty($GLOBALS['sql_auto_increment']))
+ && (! $this->ifNotExists || ! $this->autoIncrement)
) {
$statement->entityOptions->remove('AUTO_INCREMENT');
}
@@ -1939,7 +1943,7 @@ class ExportSql extends ExportPlugin
break;
case 'create_view':
- if (empty($GLOBALS['sql_views_as_tables'])) {
+ if (! $this->viewsAsTables) {
$dump .= $this->exportComment(
__('Structure for view')
. ' '
@@ -1970,7 +1974,7 @@ class ExportSql extends ExportPlugin
$dump .= $this->getTableDefForView($db, $table, $aliases);
}
- if (empty($GLOBALS['sql_views_as_tables'])) {
+ if (! $this->viewsAsTables) {
// Save views, to be inserted after indexes
// in case the view uses USE INDEX syntax
$this->sqlViews .= $dump;
@@ -2025,7 +2029,7 @@ class ExportSql extends ExportPlugin
// Do not export data for a VIEW, unless asked to export the view as a table
// (For a VIEW, this is called only when exporting a single VIEW)
- if ($dbi->getTable($db, $table)->isView() && empty($GLOBALS['sql_views_as_tables'])) {
+ if ($dbi->getTable($db, $table)->isView() && ! $this->viewsAsTables) {
$head = $this->possibleCRLF()
. $this->exportComment()
. $this->exportComment('VIEW ' . $formattedTableName)
@@ -2074,7 +2078,7 @@ class ExportSql extends ExportPlugin
if ($this->type === 'UPDATE') {
// update
$schemaInsert = 'UPDATE ';
- if (isset($GLOBALS['sql_ignore'])) {
+ if ($this->ignore) {
$schemaInsert .= 'IGNORE ';
}
@@ -2089,19 +2093,19 @@ class ExportSql extends ExportPlugin
}
// delayed inserts?
- if (isset($GLOBALS['sql_delayed'])) {
+ if ($this->delayed) {
$insertDelayed = ' DELAYED';
} else {
$insertDelayed = '';
}
// insert ignore?
- if (isset($GLOBALS['sql_ignore']) && $this->type === 'INSERT') {
+ if ($this->ignore && $this->type === 'INSERT') {
$insertDelayed .= ' IGNORE';
}
//truncate table before insert
- if (isset($GLOBALS['sql_truncate']) && $GLOBALS['sql_truncate'] && $sqlCommand === 'INSERT') {
+ if ($this->truncate && $sqlCommand === 'INSERT') {
$truncate = 'TRUNCATE TABLE '
. Util::backquoteCompat($tableAlias, $this->compatibility, $this->useSqlBackquotes) . ';';
$truncatehead = $this->possibleCRLF()
@@ -2117,7 +2121,7 @@ class ExportSql extends ExportPlugin
}
// scheme for inserting fields
- if ($GLOBALS['sql_insert_syntax'] === 'complete' || $GLOBALS['sql_insert_syntax'] === 'both') {
+ if ($this->insertSyntax === 'complete' || $this->insertSyntax === 'both') {
$fields = implode(', ', $fieldSet);
$schemaInsert = $sqlCommand . $insertDelayed . ' INTO '
. Util::backquoteCompat($tableAlias, $this->compatibility, $this->useSqlBackquotes)
@@ -2132,11 +2136,7 @@ class ExportSql extends ExportPlugin
//\x08\\x09, not required
$currentRow = 0;
$querySize = 0;
- if (
- ($GLOBALS['sql_insert_syntax'] === 'extended'
- || $GLOBALS['sql_insert_syntax'] === 'both')
- && $this->type !== 'UPDATE'
- ) {
+ if (($this->insertSyntax === 'extended' || $this->insertSyntax === 'both') && $this->type !== 'UPDATE') {
$separator = ',';
$schemaInsert .= "\n";
} else {
@@ -2186,7 +2186,7 @@ class ExportSql extends ExportPlugin
) {
// a number
$values[] = $row[$j];
- } elseif ($metaInfo->isBinary && isset($GLOBALS['sql_hex_for_binary'])) {
+ } elseif ($metaInfo->isBinary && $this->hexForBinary) {
// a true BLOB
// - mysqldump only generates hex data when the --hex-blob
// option is used, for fields having the binary attribute
@@ -2235,7 +2235,7 @@ class ExportSql extends ExportPlugin
}
$insertLine .= ' WHERE ' . (new UniqueCondition($fieldsMeta, $row))->getWhereClause();
- } elseif ($GLOBALS['sql_insert_syntax'] === 'extended' || $GLOBALS['sql_insert_syntax'] === 'both') {
+ } elseif ($this->insertSyntax === 'extended' || $this->insertSyntax === 'both') {
// Extended inserts case
if ($currentRow === 1) {
$insertLine = $schemaInsert . '('
@@ -2243,8 +2243,7 @@ class ExportSql extends ExportPlugin
} else {
$insertLine = '(' . implode(', ', $values) . ')';
$insertLineSize = mb_strlen($insertLine);
- $sqlMaxSize = $GLOBALS['sql_max_query_size'];
- if ($sqlMaxSize > 0 && $querySize + $insertLineSize > $sqlMaxSize) {
+ if ($this->maxQuerySize > 0 && $querySize + $insertLineSize > $this->maxQuerySize) {
if (! $this->export->outputHandler(';' . "\n")) {
return false;
}
@@ -2714,6 +2713,42 @@ class ExportSql extends ExportPlugin
));
$this->createView = (bool) ($request->getParsedBodyParam('sql_create_view')
?? $exportConfig['sql_create_view'] ?? false);
+ $this->createTrigger = (bool) ($request->getParsedBodyParam('sql_create_trigger')
+ ?? $exportConfig['sql_create_trigger'] ?? false);
+ $this->viewCurrentUser = (bool) ($request->getParsedBodyParam('sql_view_current_user')
+ ?? $exportConfig['sql_view_current_user'] ?? false);
+ $this->simpleViewExport = (bool) ($request->getParsedBodyParam('sql_simple_view_export')
+ ?? $exportConfig['sql_simple_view_export'] ?? false);
+ $this->ifNotExists = (bool) ($request->getParsedBodyParam('sql_if_not_exists')
+ ?? $exportConfig['sql_if_not_exists'] ?? false);
+ $this->orReplaceView = (bool) ($request->getParsedBodyParam('sql_or_replace_view')
+ ?? $exportConfig['sql_or_replace_view'] ?? false);
+ $this->autoIncrement = (bool) ($request->getParsedBodyParam('sql_auto_increment')
+ ?? $exportConfig['sql_auto_increment'] ?? false);
+ $this->truncate = (bool) ($request->getParsedBodyParam('sql_truncate')
+ ?? $exportConfig['sql_truncate'] ?? false);
+ $this->delayed = (bool) ($request->getParsedBodyParam('sql_delayed')
+ ?? $exportConfig['sql_delayed'] ?? false);
+ $this->ignore = (bool) ($request->getParsedBodyParam('sql_ignore')
+ ?? $exportConfig['sql_ignore'] ?? false);
+ $this->insertSyntax = $this->setInsertSyntax($this->setStringValue(
+ $request->getParsedBodyParam('sql_insert_syntax'),
+ $exportConfig['sql_insert_syntax'] ?? null,
+ ));
+ $this->maxQuerySize = $this->setMaxQuerySize(
+ $request->getParsedBodyParam('sql_max_query_size'),
+ $exportConfig['sql_max_query_size'] ?? null,
+ );
+ $this->hexForBinary = (bool) ($request->getParsedBodyParam('sql_hex_for_binary')
+ ?? $exportConfig['sql_hex_for_binary'] ?? false);
+ $this->utcTime = (bool) ($request->getParsedBodyParam('sql_utc_time')
+ ?? $exportConfig['sql_utc_time'] ?? false);
+ $this->dropDatabase = (bool) ($request->getParsedBodyParam('sql_drop_database')
+ ?? $exportConfig['sql_drop_database'] ?? false);
+ $this->viewsAsTables = (bool) ($request->getParsedBodyParam('sql_views_as_tables')
+ ?? $exportConfig['sql_views_as_tables'] ?? false);
+ $this->metadata = (bool) ($request->getParsedBodyParam('sql_metadata')
+ ?? $exportConfig['sql_metadata'] ?? false);
}
private function setStringValue(mixed $fromRequest, mixed $fromConfig): string
@@ -2763,4 +2798,43 @@ class ExportSql extends ExportPlugin
{
return $this->createView;
}
+
+ public function hasCreateTrigger(): bool
+ {
+ return $this->createTrigger;
+ }
+
+ public function setAutoIncrement(bool $autoIncrement): void
+ {
+ $this->autoIncrement = $autoIncrement;
+ }
+
+ /** @return 'complete'|'extended'|'both'|'none' */
+ private function setInsertSyntax(string $syntax): string
+ {
+ if (in_array($syntax, ['complete', 'extended', 'none'], true)) {
+ return $syntax;
+ }
+
+ return 'both';
+ }
+
+ /** @return int<0, max> */
+ private function setMaxQuerySize(mixed $fromRequest, mixed $fromConfig): int
+ {
+ if (is_numeric($fromRequest) && $fromRequest >= 0) {
+ return (int) $fromRequest;
+ }
+
+ if (is_numeric($fromConfig) && $fromConfig >= 0) {
+ return (int) $fromConfig;
+ }
+
+ return 50000;
+ }
+
+ public function hasMetadata(): bool
+ {
+ return $this->metadata;
+ }
}
diff --git a/src/Table/TableMover.php b/src/Table/TableMover.php
index 1ed0acadb2..7f7148231f 100644
--- a/src/Table/TableMover.php
+++ b/src/Table/TableMover.php
@@ -468,10 +468,7 @@ class TableMover
$exportSqlPlugin->useSqlBackquotes(true);
$GLOBALS['no_constraints_comments'] = true;
- // set the value of global sql_auto_increment variable
- if (isset($_POST['sql_auto_increment'])) {
- $GLOBALS['sql_auto_increment'] = $_POST['sql_auto_increment'];
- }
+ $exportSqlPlugin->setAutoIncrement(isset($_POST['sql_auto_increment']) && (bool) $_POST['sql_auto_increment']);
$isView = (new Table($sourceTable, $sourceDb, $this->dbi))->isView();
/**
diff --git a/tests/unit/Export/ExportTest.php b/tests/unit/Export/ExportTest.php
index a24e882c5c..0205225baf 100644
--- a/tests/unit/Export/ExportTest.php
+++ b/tests/unit/Export/ExportTest.php
@@ -102,8 +102,6 @@ class ExportTest extends AbstractTestCase
$GLOBALS['buffer_needed'] = false;
$GLOBALS['asfile'] = false;
Config::getInstance()->selectedServer['DisableIS'] = false;
- $GLOBALS['sql_insert_syntax'] = 'both';
- $GLOBALS['sql_max_query_size'] = '50000';
// phpcs:disable Generic.Files.LineLength.TooLong
$dbiDummy = $this->createDbiDummy();
@@ -163,8 +161,6 @@ SQL;
$config = Config::getInstance();
$config->selectedServer['DisableIS'] = false;
$config->selectedServer['only_db'] = '';
- $GLOBALS['sql_insert_syntax'] = 'both';
- $GLOBALS['sql_max_query_size'] = '50000';
ExportPlugin::$exportType = ExportType::Server;
// phpcs:disable Generic.Files.LineLength.TooLong
diff --git a/tests/unit/Plugins/Export/ExportSqlTest.php b/tests/unit/Plugins/Export/ExportSqlTest.php
index 7ce465e623..010c5904b7 100644
--- a/tests/unit/Plugins/Export/ExportSqlTest.php
+++ b/tests/unit/Plugins/Export/ExportSqlTest.php
@@ -386,7 +386,6 @@ class ExportSqlTest extends AbstractTestCase
public function testExportFooter(): void
{
$GLOBALS['charset'] = 'utf-8';
- $GLOBALS['sql_utc_time'] = true;
$GLOBALS['old_tz'] = 'GMT';
$GLOBALS['asfile'] = 'yes';
$GLOBALS['output_charset_conversion'] = 'utf-8';
@@ -402,7 +401,7 @@ class ExportSqlTest extends AbstractTestCase
DatabaseInterface::$instance = $dbi;
$request = ServerRequestFactory::create()->createServerRequest('POST', 'https://example.com/')
- ->withParsedBody(['sql_use_transaction' => 'On', 'sql_disable_fk' => 'On']);
+ ->withParsedBody(['sql_use_transaction' => 'On', 'sql_disable_fk' => 'On', 'sql_utc_time' => 'On']);
$this->object->setExportOptions($request, []);
@@ -418,7 +417,6 @@ class ExportSqlTest extends AbstractTestCase
$config = Config::getInstance();
$config->selectedServer['host'] = 'localhost';
$config->selectedServer['port'] = 80;
- $GLOBALS['sql_utc_time'] = true;
$GLOBALS['old_tz'] = 'GMT';
$GLOBALS['asfile'] = 'yes';
$GLOBALS['output_charset_conversion'] = 'utf-8';
@@ -449,6 +447,7 @@ class ExportSqlTest extends AbstractTestCase
'sql_header_comment' => "h1C\nh2C",
'sql_use_transaction' => 'On',
'sql_disable_fk' => 'On',
+ 'sql_utc_time' => 'On',
]);
$this->object->setExportOptions($request, []);
@@ -480,8 +479,6 @@ class ExportSqlTest extends AbstractTestCase
public function testExportDBCreate(): void
{
- $GLOBALS['sql_drop_database'] = true;
-
$dbi = $this->getMockBuilder(DatabaseInterface::class)
->disableOriginalConstructor()
->getMock();
@@ -494,7 +491,11 @@ class ExportSqlTest extends AbstractTestCase
DatabaseInterface::$instance = $dbi;
$request = ServerRequestFactory::create()->createServerRequest('POST', 'https://example.com/')
- ->withParsedBody(['sql_structure_or_data' => 'structure_and_data', 'sql_backquotes' => 'true']);
+ ->withParsedBody([
+ 'sql_structure_or_data' => 'structure_and_data',
+ 'sql_backquotes' => 'true',
+ 'sql_drop_database' => 'On',
+ ]);
$this->object->setExportOptions($request, []);
@@ -644,8 +645,6 @@ class ExportSqlTest extends AbstractTestCase
public function testGetTableDefStandIn(): void
{
- $GLOBALS['sql_if_not_exists'] = true;
-
$dbi = $this->getMockBuilder(DatabaseInterface::class)
->disableOriginalConstructor()
->getMock();
@@ -658,7 +657,7 @@ class ExportSqlTest extends AbstractTestCase
DatabaseInterface::$instance = $dbi;
$request = ServerRequestFactory::create()->createServerRequest('POST', 'https://example.com/')
- ->withParsedBody(['sql_drop_table' => 'On']);
+ ->withParsedBody(['sql_drop_table' => 'On', 'sql_if_not_exists' => 'On']);
$this->object->setExportOptions($request, []);
@@ -674,8 +673,6 @@ class ExportSqlTest extends AbstractTestCase
public function testGetTableDefForView(): void
{
- $GLOBALS['sql_if_not_exists'] = true;
-
$dbi = $this->getMockBuilder(DatabaseInterface::class)
->disableOriginalConstructor()
->getMock();
@@ -702,7 +699,7 @@ class ExportSqlTest extends AbstractTestCase
DatabaseInterface::$instance = $dbi;
$request = ServerRequestFactory::create()->createServerRequest('POST', 'https://example.com/')
- ->withParsedBody(['sql_compatibility' => 'MSSQL']);
+ ->withParsedBody(['sql_compatibility' => 'MSSQL', 'sql_if_not_exists' => 'On']);
$this->object->setExportOptions($request, []);
@@ -742,7 +739,7 @@ class ExportSqlTest extends AbstractTestCase
DatabaseInterface::$instance = $dbi;
$request = ServerRequestFactory::create()->createServerRequest('POST', 'https://example.com/')
- ->withParsedBody([]);
+ ->withParsedBody(['sql_if_not_exists' => 'On']);
$this->object->setExportOptions($request, []);
@@ -758,8 +755,6 @@ class ExportSqlTest extends AbstractTestCase
public function testGetTableDef(): void
{
- $GLOBALS['sql_auto_increment'] = true;
- $GLOBALS['sql_if_not_exists'] = true;
$this->object->sqlConstraints = null;
if (isset($GLOBALS['no_constraints_comments'])) {
@@ -836,15 +831,10 @@ SQL;
self::assertStringContainsString('ADD CONSTRAINT', $this->object->sqlConstraints);
self::assertStringContainsString('ALTER TABLE "table"', $this->object->sqlConstraintsQuery);
self::assertStringContainsString('ADD CONSTRAINT', $this->object->sqlConstraintsQuery);
- self::assertStringContainsString('ALTER TABLE "table"', $GLOBALS['sql_drop_foreign_keys']);
- self::assertStringContainsString('DROP FOREIGN KEY', $GLOBALS['sql_drop_foreign_keys']);
}
public function testGetTableDefWithError(): void
{
- $GLOBALS['sql_auto_increment'] = true;
- $GLOBALS['sql_if_not_exists'] = true;
-
$this->object->sqlConstraints = null;
if (isset($GLOBALS['no_constraints_comments'])) {
@@ -946,8 +936,6 @@ SQL;
self::assertStringContainsString('CREATE TABLE `test_table`', $result);
// case 2
- $GLOBALS['sql_create_trigger'] = true;
-
$this->object->useSqlBackquotes(false);
ob_start();
@@ -961,11 +949,7 @@ SQL;
$result,
);
- unset($GLOBALS['sql_create_trigger']);
-
// case 3
- $GLOBALS['sql_views_as_tables'] = false;
-
$this->object->useSqlBackquotes(false);
ExportPlugin::$exportType = ExportType::Raw;
@@ -982,8 +966,10 @@ SQL;
self::assertStringContainsString('CREATE TABLE `test_table`', $sqlViews);
// case 4
- $GLOBALS['sql_views_as_tables'] = true;
- unset($GLOBALS['sql_if_not_exists']);
+ $request = ServerRequestFactory::create()->createServerRequest('POST', 'https://example.com/')
+ ->withParsedBody(['sql_include_comments' => 'On', 'sql_views_as_tables' => 'On']);
+
+ $this->object->setExportOptions($request, []);
ob_start();
self::assertTrue($this->object->exportStructure('test_db', 'test_table', 'create_view'));
@@ -1079,17 +1065,17 @@ SQL;
->willReturn($tableObj);
DatabaseInterface::$instance = $dbi;
- $GLOBALS['sql_max_query_size'] = 50000;
- $GLOBALS['sql_views_as_tables'] = true;
- $GLOBALS['sql_delayed'] = ' DELAYED';
- $GLOBALS['sql_ignore'] = true;
- $GLOBALS['sql_truncate'] = true;
- $GLOBALS['sql_insert_syntax'] = 'both';
- $GLOBALS['sql_hex_for_binary'] = true;
Config::getInstance()->selectedServer['DisableIS'] = false;
$request = ServerRequestFactory::create()->createServerRequest('POST', 'https://example.com/')
- ->withParsedBody(['sql_backquotes' => 'true', 'sql_compatibility' => 'MSSQL']);
+ ->withParsedBody([
+ 'sql_backquotes' => 'true',
+ 'sql_compatibility' => 'MSSQL',
+ 'sql_truncate' => 'On',
+ 'sql_delayed' => 'On',
+ 'sql_ignore' => 'On',
+ 'sql_hex_for_binary' => 'On',
+ ]);
$this->object->setExportOptions($request, []);
@@ -1177,16 +1163,15 @@ SQL;
->willReturn($tableObj);
DatabaseInterface::$instance = $dbi;
- $GLOBALS['sql_views_as_tables'] = true;
- $GLOBALS['sql_delayed'] = ' DELAYED';
- $GLOBALS['sql_ignore'] = true;
- $GLOBALS['sql_truncate'] = true;
- $GLOBALS['sql_insert_syntax'] = 'both';
- $GLOBALS['sql_hex_for_binary'] = true;
Config::getInstance()->selectedServer['DisableIS'] = false;
$request = ServerRequestFactory::create()->createServerRequest('POST', 'https://example.com/')
- ->withParsedBody(['sql_backquotes' => 'true', 'sql_compatibility' => 'MSSQL', 'sql_type' => 'UPDATE']);
+ ->withParsedBody([
+ 'sql_backquotes' => 'true',
+ 'sql_compatibility' => 'MSSQL',
+ 'sql_type' => 'UPDATE',
+ 'sql_ignore' => 'On',
+ ]);
$this->object->setExportOptions($request, []);
@@ -1225,7 +1210,6 @@ SQL;
DatabaseInterface::$instance = $dbi;
Config::getInstance()->selectedServer['DisableIS'] = false;
- $GLOBALS['sql_views_as_tables'] = false;
$request = ServerRequestFactory::create()->createServerRequest('POST', 'https://example.com/')
->withParsedBody(['sql_backquotes' => 'true', 'sql_include_comments' => 'On']);
@@ -1271,7 +1255,6 @@ SQL;
DatabaseInterface::$instance = $dbi;
Config::getInstance()->selectedServer['DisableIS'] = false;
- $GLOBALS['sql_views_as_tables'] = true;
$request = ServerRequestFactory::create()->createServerRequest('POST', 'https://example.com/')
->withParsedBody(['sql_include_comments' => 'On']);
diff --git a/tests/unit/Table/TableTest.php b/tests/unit/Table/TableTest.php
index a7e9d2fe7a..c5e20e331e 100644
--- a/tests/unit/Table/TableTest.php
+++ b/tests/unit/Table/TableTest.php
@@ -49,8 +49,6 @@ class TableTest extends AbstractTestCase
$config->settings['MaxExactCount'] = 100;
$config->settings['MaxExactCountViews'] = 100;
$config->selectedServer['pmadb'] = 'pmadb';
- $GLOBALS['sql_auto_increment'] = true;
- $GLOBALS['sql_if_not_exists'] = true;
$config->selectedServer['table_uiprefs'] = 'pma__table_uiprefs';
$sqlIsViewTrue = 'SELECT 1'