Skip to content
Snippets Groups Projects
Verified Commit d3f1a82c authored by Alex Pott's avatar Alex Pott
Browse files

Issue #3284502 by effulgentsia, alexpott: [regression] Drupal 9.4 breaks BC...

Issue #3284502 by effulgentsia, alexpott: [regression] Drupal 9.4 breaks BC via incorrect autoloading of \Drupal\Driver\* overrides of core db drivers
parent 6d6ab587
No related branches found
No related tags found
37 merge requests!7471uncessary 5 files are moved from media-library folder to misc folder,!7452Issue #1797438. HTML5 validation is preventing form submit and not fully...,!54479.5.x SF update,!5014Issue #3071143: Table Render Array Example Is Incorrect,!4868Issue #1428520: Improve menu parent link selection,!4289Issue #1344552 by marcingy, Niklas Fiekas, Ravi.J, aleevas, Eduardo Morales...,!4114Issue #2707291: Disable body-level scrolling when a dialog is open as a modal,!3630Issue #2815301 by Chi, DanielVeza, kostyashupenko, smustgrave: Allow to create...,!3291Issue #3336463: Rewrite rules for gzipped CSS and JavaScript aggregates never match,!3143Issue #3313342: [PHP 8.1] Deprecated function: strpos(): Passing null to parameter #1 LayoutBuilderUiCacheContext.php on line 28,!3102Issue #3164428 by DonAtt, longwave, sahil.goyal, Anchal_gupta, alexpott: Use...,!2853#3274419 Makes BaseFieldOverride inherit the internal property from the base field.,!2719Issue #3110137: Remove Classy from core.,!2437Issue #3238257 by hooroomoo, Wim Leers: Fragment link pointing to <textarea>...,!2378Issue #2875033: Optimize joins and table selection in SQL entity query implementation,!2074Issue #2707689: NodeForm::actions() checks for delete access on new entities,!2062Issue #3246454: Add weekly granularity to views date sort,!1591Issue #3199697: Add JSON:API Translation experimental module,!1484Exposed filters get values from URL when Ajax is on,!1255Issue #3238922: Refactor (if feasible) uses of the jQuery serialize function to use vanillaJS,!1254Issue #3238915: Refactor (if feasible) uses of the jQuery ready function to use VanillaJS,!1162Issue #3100350: Unable to save '/' root path alias,!1073issue #3191727: Focus states on mobile second level navigation items fixed,!10223132456: Fix issue where views instances are emptied before an ajax request is complete,!957Added throwing of InvalidPluginDefinitionException from getDefinition().,!925Issue #2339235: Remove taxonomy hard dependency on node module,!877Issue #2708101: Default value for link text is not saved,!873Issue #2875228: Site install not using batch API service,!872Draft: Issue #3221319: Race condition when creating menu links and editing content deletes menu links,!844Resolve #3036010 "Updaters",!712Issue #2909128: Autocomplete intermittent on Chrome Android,!617Issue #3043725: Provide a Entity Handler for user cancelation,!579Issue #2230909: Simple decimals fail to pass validation,!560Move callback classRemove outside of the loop,!555Issue #3202493,!485Sets the autocomplete attribute for username/password input field on login form.,!30Issue #3182188: Updates composer usage to point at ./vendor/bin/composer
...@@ -146,38 +146,44 @@ public static function initialize($app_root, $site_path, &$class_loader) { ...@@ -146,38 +146,44 @@ public static function initialize($app_root, $site_path, &$class_loader) {
foreach ($databases as $key => $targets) { foreach ($databases as $key => $targets) {
foreach ($targets as $target => $info) { foreach ($targets as $target => $info) {
// Backwards compatibility layer for Drupal 8 style database connection // Backwards compatibility layer for Drupal 8 style database connection
// arrays. Those do not have the 'autoload' key set for core database // arrays. Those have the wrong 'namespace' key set, or not set at all
// drivers. // for core supported database drivers.
if (empty($info['autoload'])) { if (empty($info['namespace']) || (strpos($info['namespace'], 'Drupal\\Core\\Database\\Driver\\') === 0)) {
switch (strtolower($info['driver'])) { switch (strtolower($info['driver'])) {
case 'mysql': case 'mysql':
$info['autoload'] = 'core/modules/mysql/src/Driver/Database/mysql/'; $info['namespace'] = 'Drupal\\mysql\\Driver\\Database\\mysql';
break; break;
case 'pgsql': case 'pgsql':
$info['autoload'] = 'core/modules/pgsql/src/Driver/Database/pgsql/'; $info['namespace'] = 'Drupal\\pgsql\\Driver\\Database\\pgsql';
break; break;
case 'sqlite': case 'sqlite':
$info['autoload'] = 'core/modules/sqlite/src/Driver/Database/sqlite/'; $info['namespace'] = 'Drupal\\sqlite\\Driver\\Database\\sqlite';
break; break;
} }
} }
// Backwards compatibility layer for Drupal 8 style database connection // Backwards compatibility layer for Drupal 8 style database connection
// arrays. Those have the wrong 'namespace' key set, or not set at all // arrays. Those do not have the 'autoload' key set for core database
// for core supported database drivers. // drivers.
if (empty($info['namespace']) || (strpos($info['namespace'], 'Drupal\\Core\\Database\\Driver\\') === 0)) { if (empty($info['autoload'])) {
switch (strtolower($info['driver'])) { switch (strtolower($info['driver'])) {
case 'mysql': case 'mysql':
$info['namespace'] = 'Drupal\\mysql\\Driver\\Database\\mysql'; if (trim($info['namespace'], '\\') === "Drupal\\mysql\\Driver\\Database\\mysql") {
$info['autoload'] = "core/modules/mysql/src/Driver/Database/mysql/";
}
break; break;
case 'pgsql': case 'pgsql':
$info['namespace'] = 'Drupal\\pgsql\\Driver\\Database\\pgsql'; if (trim($info['namespace'], '\\') === "Drupal\\pgsql\\Driver\\Database\\pgsql") {
$info['autoload'] = "core/modules/pgsql/src/Driver/Database/pgsql/";
}
break; break;
case 'sqlite': case 'sqlite':
$info['namespace'] = 'Drupal\\sqlite\\Driver\\Database\\sqlite'; if (trim($info['namespace'], '\\') === "Drupal\\sqlite\\Driver\\Database\\sqlite") {
$info['autoload'] = "core/modules/sqlite/src/Driver/Database/sqlite/";
}
break; break;
} }
} }
......
...@@ -2,6 +2,8 @@ ...@@ -2,6 +2,8 @@
namespace Drupal\Tests\Core\Site; namespace Drupal\Tests\Core\Site;
use Composer\Autoload\ClassLoader;
use Drupal\Core\Database\Database;
use Drupal\Core\Site\Settings; use Drupal\Core\Site\Settings;
use Drupal\Tests\UnitTestCase; use Drupal\Tests\UnitTestCase;
use org\bovigo\vfs\vfsStream; use org\bovigo\vfs\vfsStream;
...@@ -306,4 +308,82 @@ public function providerTestRealDeprecatedSettings(): array { ...@@ -306,4 +308,82 @@ public function providerTestRealDeprecatedSettings(): array {
return []; return [];
} }
/**
* Tests initialization performed for the $databases variable.
*
* @dataProvider providerTestDatabaseInfoInitialization
*/
public function testDatabaseInfoInitialization(string $driver, ?string $namespace, ?string $autoload, string $expected_namespace, ?string $expected_autoload): void {
$databases['mock'][$driver] = [
'driver' => $driver,
'prefix' => '',
];
if (!is_null($namespace)) {
$databases['mock'][$driver]['namespace'] = $namespace;
}
if (!is_null($autoload)) {
$databases['mock'][$driver]['autoload'] = $autoload;
}
$settings_file_content = "<?php\n\$databases = " . var_export($databases, TRUE) . ";\n";
$vfs_root = vfsStream::setup('root');
$sites_directory = vfsStream::newDirectory('sites')->at($vfs_root);
vfsStream::newFile('settings.php')
->at($sites_directory)
->setContent($settings_file_content);
$class_loader = $this->createMock(ClassLoader::class);
if (!empty($expected_autoload)) {
$class_loader->expects($this->once())
->method('addPsr4')
->with($expected_namespace . '\\', $expected_autoload);
}
else {
$class_loader->expects($this->never())
->method('addPsr4');
}
Settings::initialize(vfsStream::url('root'), 'sites', $class_loader);
$expected = [
$driver => [
'driver' => $driver,
'namespace' => $expected_namespace,
'prefix' => '',
],
];
if (!is_null($expected_autoload)) {
$expected[$driver]['autoload'] = $expected_autoload;
}
$this->assertEquals($expected, Database::getConnectionInfo('mock'));
}
/**
* Provides data for testDatabaseInfoInitialization().
*/
public function providerTestDatabaseInfoInitialization(): array {
return [
['mysql', NULL, NULL, 'Drupal\\mysql\\Driver\\Database\\mysql', 'core/modules/mysql/src/Driver/Database/mysql/'],
['mysql', '', NULL, 'Drupal\\mysql\\Driver\\Database\\mysql', 'core/modules/mysql/src/Driver/Database/mysql/'],
['mysql', 'Drupal\\Core\\Database\\Driver\\mysql', NULL, 'Drupal\\mysql\\Driver\\Database\\mysql', 'core/modules/mysql/src/Driver/Database/mysql/'],
['mysql', 'Drupal\\mysql\\Driver\\Database\\mysql', NULL, 'Drupal\\mysql\\Driver\\Database\\mysql', 'core/modules/mysql/src/Driver/Database/mysql/'],
['mysql', 'Drupal\\Driver\\Database\\mysql', NULL, 'Drupal\\Driver\\Database\\mysql', NULL],
['mysql', 'Drupal\\mysql\\Driver\\Database\\mysql', 'modules/custom/mysql/src/Driver/Database/mysql/', 'Drupal\\mysql\\Driver\\Database\\mysql', 'modules/custom/mysql/src/Driver/Database/mysql/'],
['pgsql', NULL, NULL, 'Drupal\\pgsql\\Driver\\Database\\pgsql', 'core/modules/pgsql/src/Driver/Database/pgsql/'],
['pgsql', '', NULL, 'Drupal\\pgsql\\Driver\\Database\\pgsql', 'core/modules/pgsql/src/Driver/Database/pgsql/'],
['pgsql', 'Drupal\\Core\\Database\\Driver\\pgsql', NULL, 'Drupal\\pgsql\\Driver\\Database\\pgsql', 'core/modules/pgsql/src/Driver/Database/pgsql/'],
['pgsql', 'Drupal\\pgsql\\Driver\\Database\\pgsql', NULL, 'Drupal\\pgsql\\Driver\\Database\\pgsql', 'core/modules/pgsql/src/Driver/Database/pgsql/'],
['pgsql', 'Drupal\\Driver\\Database\\pgsql', NULL, 'Drupal\\Driver\\Database\\pgsql', NULL],
['pgsql', 'Drupal\\pgsql\\Driver\\Database\\pgsql', 'modules/custom/pgsql/src/Driver/Database/pgsql/', 'Drupal\\pgsql\\Driver\\Database\\pgsql', 'modules/custom/pgsql/src/Driver/Database/pgsql/'],
['sqlite', NULL, NULL, 'Drupal\\sqlite\\Driver\\Database\\sqlite', 'core/modules/sqlite/src/Driver/Database/sqlite/'],
['sqlite', '', NULL, 'Drupal\\sqlite\\Driver\\Database\\sqlite', 'core/modules/sqlite/src/Driver/Database/sqlite/'],
['sqlite', 'Drupal\\Core\\Database\\Driver\\sqlite', NULL, 'Drupal\\sqlite\\Driver\\Database\\sqlite', 'core/modules/sqlite/src/Driver/Database/sqlite/'],
['sqlite', 'Drupal\\sqlite\\Driver\\Database\\sqlite', NULL, 'Drupal\\sqlite\\Driver\\Database\\sqlite', 'core/modules/sqlite/src/Driver/Database/sqlite/'],
['sqlite', 'Drupal\\Driver\\Database\\sqlite', NULL, 'Drupal\\Driver\\Database\\sqlite', NULL],
['sqlite', 'Drupal\\sqlite\\Driver\\Database\\sqlite', 'modules/custom/sqlite/src/Driver/Database/sqlite/', 'Drupal\\sqlite\\Driver\\Database\\sqlite', 'modules/custom/sqlite/src/Driver/Database/sqlite/'],
];
}
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment