diff --git a/phpstan-baseline.neon b/phpstan-baseline.neon index 1a2d240f6e..1a1e6550a4 100644 --- a/phpstan-baseline.neon +++ b/phpstan-baseline.neon @@ -8600,6 +8600,11 @@ parameters: count: 1 path: src/Import/Import.php + - + message: "#^Method PhpMyAdmin\\\\Import\\\\Import\\:\\:createDatabase\\(\\) should return array\\ but returns mixed\\.$#" + count: 1 + path: src/Import/Import.php + - message: "#^Method PhpMyAdmin\\\\Import\\\\Import\\:\\:detectSize\\(\\) should return int\\|string but returns mixed\\.$#" count: 3 @@ -11395,11 +11400,6 @@ parameters: count: 1 path: src/Plugins/Import/ImportCsv.php - - - message: "#^Parameter \\#1 \\$dbName of method PhpMyAdmin\\\\Import\\\\Import\\:\\:buildSql\\(\\) expects string, mixed given\\.$#" - count: 1 - path: src/Plugins/Import/ImportCsv.php - - message: "#^Parameter \\#1 \\$serverMessage of static method PhpMyAdmin\\\\Html\\\\Generator\\:\\:mysqlDie\\(\\) expects string, mixed given\\.$#" count: 1 @@ -11440,6 +11440,11 @@ parameters: count: 1 path: src/Plugins/Import/ImportCsv.php + - + message: "#^Parameter \\#4 \\$sqlData of method PhpMyAdmin\\\\Import\\\\Import\\:\\:createDatabase\\(\\) expects array\\, mixed given\\.$#" + count: 1 + path: src/Plugins/Import/ImportCsv.php + - message: "#^Cannot cast mixed to string\\.$#" count: 5 diff --git a/psalm-baseline.xml b/psalm-baseline.xml index 225fd8a6f2..4fb8769e09 100644 --- a/psalm-baseline.xml +++ b/psalm-baseline.xml @@ -6428,8 +6428,6 @@ - - @@ -6440,10 +6438,6 @@ - - - - getProperties()->getExtension()]]> @@ -8702,13 +8696,9 @@ - - - - diff --git a/src/Import/Import.php b/src/Import/Import.php index 65d49cc3bf..de32b3151c 100644 --- a/src/Import/Import.php +++ b/src/Import/Import.php @@ -888,7 +888,6 @@ class Import * @param ImportTable[] $tables * @param array{0:ColumnType[], 1:(int|string)[], 2?:true[]}[]|null $analyses Analyses of the tables * @param string[]|null $additionalSql Additional SQL to be executed - * @param mixed[]|null $options Associative array of options * @param string[] $sqlData List of SQL to be executed */ public function buildSql( @@ -896,24 +895,11 @@ class Import array $tables, array|null $analyses = null, array|null $additionalSql = null, - bool $createDb = true, - array|null $options = null, array &$sqlData = [], ): void { /* Needed to quell the beast that is Message */ ImportSettings::$importNotice = ''; - /* Take care of the options */ - $collation = $options['db_collation'] ?? 'utf8_general_ci'; - $charset = $options['db_charset'] ?? 'utf8'; - - if ($createDb) { - $sql = 'CREATE DATABASE IF NOT EXISTS ' . Util::backquote($dbName) - . ' DEFAULT CHARACTER SET ' . $charset . ' COLLATE ' . $collation - . ';'; - $this->runQuery($sql, $sqlData); - } - /* Run the $additional_sql statements supplied by the caller plug-in */ if ($additionalSql != null) { /* Clean the SQL first */ @@ -977,8 +963,7 @@ class Import $tempSQLStr .= ', '; } - $tempSQLStr .= ') DEFAULT CHARACTER SET ' . $charset - . ' COLLATE ' . $collation . ';'; + $tempSQLStr .= ')'; /** * Each SQL statement is executed immediately @@ -994,7 +979,6 @@ class Import * * Only one insert query is formed for each table */ - $tempSQLStr = ''; $colCount = 0; $dbi = DatabaseInterface::getInstance(); foreach ($tables as $i => $table) { @@ -1066,8 +1050,6 @@ class Import unset($table->rows[$j]); } - $tempSQLStr .= ';'; - /** * Each SQL statement is executed immediately * after it is formed so that we don't have @@ -1076,9 +1058,6 @@ class Import $this->runQuery($tempSQLStr, $sqlData); } - /* No longer needed */ - unset($tempSQLStr); - /** * A work in progress */ @@ -1404,4 +1383,18 @@ class Import return $importFileName; } + + /** + * @param string[] $sqlData List of SQL statements to be executed + * + * @return string[] + */ + public function createDatabase(string $dbName, string $charset, string $collation, array $sqlData): array + { + $sql = 'CREATE DATABASE IF NOT EXISTS ' . Util::backquote($dbName) + . ' DEFAULT CHARACTER SET ' . $charset . ' COLLATE ' . $collation; + $this->runQuery($sql, $sqlData); + + return $sqlData; + } } diff --git a/src/Plugins/Import/ImportCsv.php b/src/Plugins/Import/ImportCsv.php index bb0b153cd5..ac4ef05574 100644 --- a/src/Plugins/Import/ImportCsv.php +++ b/src/Plugins/Import/ImportCsv.php @@ -22,6 +22,7 @@ use PhpMyAdmin\Properties\Options\Items\NumberPropertyItem; use PhpMyAdmin\Properties\Options\Items\TextPropertyItem; use PhpMyAdmin\Properties\Plugins\ImportPluginProperties; use PhpMyAdmin\Util; +use Webmozart\Assert\Assert; use function __; use function array_pad; @@ -590,6 +591,7 @@ class ImportCsv extends AbstractImportCsv */ if (isset($_REQUEST['csv_new_db_name']) && (string) $_REQUEST['csv_new_db_name'] !== '') { $newDb = $_REQUEST['csv_new_db_name']; + Assert::string($newDb); } else { $result = $dbi->fetchResult('SHOW DATABASES'); @@ -599,7 +601,11 @@ class ImportCsv extends AbstractImportCsv $dbName = Current::$database !== '' ? Current::$database : $newDb; $createDb = Current::$database === ''; - $this->import->buildSql($dbName, [$table], [$analysis], createDb:$createDb, sqlData:$sqlStatements); + if ($createDb) { + $sqlStatements = $this->import->createDatabase($dbName, 'utf8', 'utf8_general_ci', $sqlStatements); + } + + $this->import->buildSql($dbName, [$table], [$analysis], sqlData: $sqlStatements); } // Commit any possible data in buffers diff --git a/src/Plugins/Import/ImportMediawiki.php b/src/Plugins/Import/ImportMediawiki.php index 79da81b120..b8d32535bf 100644 --- a/src/Plugins/Import/ImportMediawiki.php +++ b/src/Plugins/Import/ImportMediawiki.php @@ -305,11 +305,16 @@ class ImportMediawiki extends ImportPlugin // Obtain the best-fit MySQL types for each column $analysis = $this->import->analyzeTable($table); + $dbName = Current::$database !== '' ? Current::$database : 'mediawiki_DB'; + + if (Current::$database === '') { + $sqlStatements = $this->import->createDatabase($dbName, 'utf8', 'utf8_general_ci', $sqlStatements); + } + $this->import->buildSql( - Current::$database !== '' ? Current::$database : 'mediawiki_DB', + $dbName, [$table], [$analysis], - createDb: Current::$database === '', sqlData: $sqlStatements, ); } diff --git a/src/Plugins/Import/ImportOds.php b/src/Plugins/Import/ImportOds.php index 72cf767072..7916ccc98c 100644 --- a/src/Plugins/Import/ImportOds.php +++ b/src/Plugins/Import/ImportOds.php @@ -167,8 +167,12 @@ class ImportOds extends ImportPlugin $dbName = Current::$database !== '' ? Current::$database : 'ODS_DB'; $createDb = Current::$database === ''; + if ($createDb) { + $sqlStatements = $this->import->createDatabase($dbName, 'utf8', 'utf8_general_ci', $sqlStatements); + } + /* Created and execute necessary SQL statements from data */ - $this->import->buildSql($dbName, $tables, $analyses, createDb:$createDb, sqlData:$sqlStatements); + $this->import->buildSql($dbName, $tables, $analyses, sqlData: $sqlStatements); /* Commit any possible data in buffers */ $this->import->runQuery('', $sqlStatements); diff --git a/src/Plugins/Import/ImportShp.php b/src/Plugins/Import/ImportShp.php index c9ea0d4ba2..be43c79016 100644 --- a/src/Plugins/Import/ImportShp.php +++ b/src/Plugins/Import/ImportShp.php @@ -288,7 +288,11 @@ class ImportShp extends ImportPlugin // Created and execute necessary SQL statements from data $sqlStatements = []; - $this->import->buildSql($dbName, [$table], [$analysis], createDb:$createDb, sqlData:$sqlStatements); + if ($createDb) { + $sqlStatements = $this->import->createDatabase($dbName, 'utf8', 'utf8_general_ci', []); + } + + $this->import->buildSql($dbName, [$table], [$analysis], sqlData: $sqlStatements); ImportSettings::$finished = true; $GLOBALS['error'] = false; diff --git a/src/Plugins/Import/ImportXml.php b/src/Plugins/Import/ImportXml.php index ba3704e288..131164d89e 100644 --- a/src/Plugins/Import/ImportXml.php +++ b/src/Plugins/Import/ImportXml.php @@ -240,21 +240,23 @@ class ImportXml extends ImportPlugin $create = null; } + /* Created and execute necessary SQL statements from data */ + $sqlStatements = []; + /* Set database name to the currently selected one, if applicable */ if (Current::$database !== '') { /* Override the database name in the XML file, if one is selected */ $dbName = Current::$database; - $options = null; } else { - /* Set database collation/charset */ - $options = ['db_collation' => $collation, 'db_charset' => $charset]; + $sqlStatements = $this->import->createDatabase( + $dbName, + $charset ?? 'utf8', + $collation ?? 'utf8_general_ci', + [], + ); } - $createDb = Current::$database === ''; - - /* Created and execute necessary SQL statements from data */ - $sqlStatements = []; - $this->import->buildSql($dbName, $tables, $analyses, $create, $createDb, $options, $sqlStatements); + $this->import->buildSql($dbName, $tables, $analyses, $create, $sqlStatements); /* Commit any possible data in buffers */ $this->import->runQuery('', $sqlStatements); diff --git a/tests/unit/Plugins/Import/ImportCsvTest.php b/tests/unit/Plugins/Import/ImportCsvTest.php index 01a7ba4ba4..7a2ddbea6c 100644 --- a/tests/unit/Plugins/Import/ImportCsvTest.php +++ b/tests/unit/Plugins/Import/ImportCsvTest.php @@ -261,10 +261,10 @@ class ImportCsvTest extends AbstractTestCase $this->object->doImport(); self::assertSame( - 'CREATE DATABASE IF NOT EXISTS `CSV_DB 1` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;;' - . 'CREATE TABLE IF NOT EXISTS `CSV_DB 1`.`db_test` (`COL 1` varchar(5), `COL 2` varchar(5))' - . ' DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;;INSERT INTO `CSV_DB 1`.`db_test`' - . ' (`COL 1`, `COL 2`) VALUES (\'Row 1\', \'Row 2\'),' . "\n" . ' (\'123\', \'456\');;', + 'CREATE DATABASE IF NOT EXISTS `CSV_DB 1` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;' + . 'CREATE TABLE IF NOT EXISTS `CSV_DB 1`.`db_test` (`COL 1` varchar(5), `COL 2` varchar(5));' + . 'INSERT INTO `CSV_DB 1`.`db_test`' + . ' (`COL 1`, `COL 2`) VALUES (\'Row 1\', \'Row 2\'),' . "\n" . ' (\'123\', \'456\');', $GLOBALS['sql_query'], ); @@ -306,10 +306,10 @@ class ImportCsvTest extends AbstractTestCase $this->object->doImport(); self::assertSame( - 'CREATE DATABASE IF NOT EXISTS `CSV_DB 1` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;;' - . 'CREATE TABLE IF NOT EXISTS `CSV_DB 1`.`db_test` (`Row 1` int(3), `Row 2` int(3))' - . ' DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;;INSERT INTO `CSV_DB 1`.`db_test`' - . ' (`Row 1`, `Row 2`) VALUES (123, 456);;', + 'CREATE DATABASE IF NOT EXISTS `CSV_DB 1` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;' + . 'CREATE TABLE IF NOT EXISTS `CSV_DB 1`.`db_test` (`Row 1` int(3), `Row 2` int(3));' + . 'INSERT INTO `CSV_DB 1`.`db_test`' + . ' (`Row 1`, `Row 2`) VALUES (123, 456);', $GLOBALS['sql_query'], ); diff --git a/tests/unit/Plugins/Import/ImportOdsTest.php b/tests/unit/Plugins/Import/ImportOdsTest.php index bce87ebc44..9a7beee586 100644 --- a/tests/unit/Plugins/Import/ImportOdsTest.php +++ b/tests/unit/Plugins/Import/ImportOdsTest.php @@ -185,28 +185,26 @@ class ImportOdsTest extends AbstractTestCase // The process could probably detect that all the values for columns V to BL are empty // That would make the empty columns not needed and would create a cleaner structure - $endOfSql = ');;'; + $endOfSql = ');'; if (! $odsEmptyRowsMode) { $fullCols = 'NULL' . str_repeat(', NULL', 18);// 19 empty cells - $endOfSql = '),' . "\n" . ' (' . $fullCols . '),' . "\n" . ' (' . $fullCols . ');;'; + $endOfSql = '),' . "\n" . ' (' . $fullCols . '),' . "\n" . ' (' . $fullCols . ');'; } //Test function called $this->object->doImport($importHandle); self::assertSame( - 'CREATE DATABASE IF NOT EXISTS `ODS_DB` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;;' + 'CREATE DATABASE IF NOT EXISTS `ODS_DB` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;' . 'CREATE TABLE IF NOT EXISTS `ODS_DB`.`Shop` (' . '`Artikelnummer` varchar(7), `Name` varchar(41), `keywords` varchar(15), `EK_Preis` varchar(21),' . ' `Preis` varchar(23), `Details` varchar(10), `addInfo` varchar(22), `Einheit` varchar(3),' . ' `Wirkstoff` varchar(10), `verkuerztHaltbar` varchar(21), `kuehlkette` varchar(7),' . ' `Gebinde` varchar(71), `Verbrauchsnachweis` varchar(7), `Genehmigungspflichtig` varchar(7),' . ' `Gefahrstoff` varchar(11), `GefahrArbeitsbereich` varchar(14), `Verwendungszweck` varchar(10),' - . ' `Verbrauch` varchar(10), `showLagerbestand` varchar(7)) ' - . 'DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;;' - . 'CREATE TABLE IF NOT EXISTS `ODS_DB`.`Feuille 1` (`value` varchar(19)) ' - . 'DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;;' + . ' `Verbrauch` varchar(10), `showLagerbestand` varchar(7));' + . 'CREATE TABLE IF NOT EXISTS `ODS_DB`.`Feuille 1` (`value` varchar(19));' . 'INSERT INTO `ODS_DB`.`Shop` (' . '`Artikelnummer`, `Name`, `keywords`, `EK_Preis`, `Preis`, `Details`, `addInfo`, `Einheit`,' . ' `Wirkstoff`, `verkuerztHaltbar`, `kuehlkette`, `Gebinde`, `Verbrauchsnachweis`,' @@ -247,7 +245,7 @@ class ImportOdsTest extends AbstractTestCase . ' (\'true\'),' . "\n" . ' (\'12\')' . ($odsEmptyRowsMode ? '' : ',' . "\n" . ' (NULL)') - . ($odsEmptyRowsMode ? ';;' : ',' . "\n" . ' (NULL);;'), + . ($odsEmptyRowsMode ? ';' : ',' . "\n" . ' (NULL);'), $GLOBALS['sql_query'], ); diff --git a/tests/unit/Plugins/Import/ImportShpTest.php b/tests/unit/Plugins/Import/ImportShpTest.php index 56193ab6f4..0526b8978d 100644 --- a/tests/unit/Plugins/Import/ImportShpTest.php +++ b/tests/unit/Plugins/Import/ImportShpTest.php @@ -181,8 +181,7 @@ class ImportShpTest extends AbstractTestCase if (extension_loaded('dbase')) { self::assertStringContainsString( 'CREATE TABLE IF NOT EXISTS `SHP_DB`.`TBL_NAME` ' - . '(`SPATIAL` geometry, `ID` int(2), `AUTHORITY` varchar(25), `NAME` varchar(42)) ' - . 'DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;', + . '(`SPATIAL` geometry, `ID` int(2), `AUTHORITY` varchar(25), `NAME` varchar(42));', $GLOBALS['sql_query'], );