mirror of
https://github.com/silverstripe/silverstripe-framework
synced 2024-10-22 14:05:37 +02:00
Merge pull request #9456 from open-sausages/pulls/4/avoid-tempdatabase-infinite-loop
BUG Infinite loops in TempDatabase (fixes #8902)
This commit is contained in:
commit
3ad4b93daa
@ -24,6 +24,13 @@ class TempDatabase
|
||||
*/
|
||||
protected $name = null;
|
||||
|
||||
/**
|
||||
* Workaround to avoid infinite loops.
|
||||
*
|
||||
* @var Exception
|
||||
*/
|
||||
private $skippedException = null;
|
||||
|
||||
/**
|
||||
* Optionally remove the test DB when the PHP process exits
|
||||
*
|
||||
@ -232,9 +239,13 @@ class TempDatabase
|
||||
$dataClasses = ClassInfo::subclassesFor(DataObject::class);
|
||||
array_shift($dataClasses);
|
||||
|
||||
$oldCheckAndRepairOnBuild = Config::inst()->get(DBSchemaManager::class, 'check_and_repair_on_build');
|
||||
Config::modify()->set(DBSchemaManager::class, 'check_and_repair_on_build', false);
|
||||
|
||||
$schema = $this->getConn()->getSchemaManager();
|
||||
$schema->quiet();
|
||||
$schema->schemaUpdate(function () use ($dataClasses, $extraDataObjects) {
|
||||
$schema->schemaUpdate(
|
||||
function () use ($dataClasses, $extraDataObjects) {
|
||||
foreach ($dataClasses as $dataClass) {
|
||||
// Check if class exists before trying to instantiate - this sidesteps any manifest weirdness
|
||||
if (class_exists($dataClass)) {
|
||||
@ -254,7 +265,10 @@ class TempDatabase
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
);
|
||||
|
||||
Config::modify()->set(DBSchemaManager::class, 'check_and_repair_on_build', $oldCheckAndRepairOnBuild);
|
||||
|
||||
ClassInfo::reset_db_cache();
|
||||
DataObject::singleton()->flushCache();
|
||||
@ -293,6 +307,13 @@ class TempDatabase
|
||||
try {
|
||||
$this->rebuildTables($extraDataObjects);
|
||||
} catch (DatabaseException $ex) {
|
||||
// Avoid infinite loops
|
||||
if ($this->skippedException && $this->skippedException->getMessage() == $ex->getMessage()) {
|
||||
throw $ex;
|
||||
}
|
||||
|
||||
$this->skippedException = $ex;
|
||||
|
||||
// In case of error during build force a hard reset
|
||||
// e.g. pgsql doesn't allow schema updates inside transactions
|
||||
$this->kill();
|
||||
|
Loading…
Reference in New Issue
Block a user