diff --git a/src/ORM/Connect/TableBuilder.php b/src/ORM/Connect/TableBuilder.php new file mode 100644 index 00000000000..3b3333a5e7a --- /dev/null +++ b/src/ORM/Connect/TableBuilder.php @@ -0,0 +1,69 @@ +schemaUpdate(function () use ($dataClasses, $extraDataObjects, $testMode, $quiet, $showRecordCounts) { + $dataObjectSchema = DataObject::getSchema(); + + foreach ($dataClasses as $dataClass) { + // Check if class exists before trying to instantiate - this sidesteps any manifest weirdness + if (!class_exists($dataClass)) { + continue; + } + + // Check if this class should be excluded as per testing conventions + /** @var DataObject $SNG */ + $SNG = new $dataClass([], DataObject::CREATE_SINGLETON); + if (!$testMode && $SNG instanceof TestOnly) { + continue; + } + + // Log data + if (!$quiet) { + $tableName = $dataObjectSchema->tableName($dataClass); + if ($showRecordCounts && DB::get_schema()->hasTable($tableName)) { + try { + $count = DB::query("SELECT COUNT(*) FROM \"$tableName\"")->value(); + $countSuffix = " ($count records)"; + } catch (\Exception $e) { + $countSuffix = " (error getting record count)"; + } + } else { + $countSuffix = ""; + } + + if (Director::is_cli()) { + echo " * $tableName$countSuffix\n"; + } else { + echo "
  • $tableName$countSuffix
  • \n"; + } + } + + // Instruct the class to apply its schema to the database + $SNG->requireTable(); + + // If we have additional dataobjects which need schema (i.e. for tests), do so here: + if ($extraDataObjects) { + foreach ($extraDataObjects as $dataClass) { + $SNG = new $dataClass([], DataObject::CREATE_SINGLETON); + if ($SNG instanceof DataObject) { + $SNG->requireTable(); + } + } + } + } + }); + } +} diff --git a/src/ORM/Connect/TempDatabase.php b/src/ORM/Connect/TempDatabase.php index a268adf8943..ced43d8469d 100644 --- a/src/ORM/Connect/TempDatabase.php +++ b/src/ORM/Connect/TempDatabase.php @@ -244,29 +244,9 @@ protected function rebuildTables($extraDataObjects = []) $schema = $this->getConn()->getSchemaManager(); $schema->quiet(); - $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 ?? '')) { - $SNG = singleton($dataClass); - if (!($SNG instanceof TestOnly)) { - $SNG->requireTable(); - } - } - } - // If we have additional dataobjects which need schema, do so here: - if ($extraDataObjects) { - foreach ($extraDataObjects as $dataClass) { - $SNG = singleton($dataClass); - if (singleton($dataClass) instanceof DataObject) { - $SNG->requireTable(); - } - } - } - } - ); + $tableBuilder = TableBuilder::singleton(); + $tableBuilder->buildTables($schema, $dataClasses, $extraDataObjects, true); Config::modify()->set(DBSchemaManager::class, 'check_and_repair_on_build', $oldCheckAndRepairOnBuild); diff --git a/src/ORM/DatabaseAdmin.php b/src/ORM/DatabaseAdmin.php index 30ca53b2520..c10ef679b45 100644 --- a/src/ORM/DatabaseAdmin.php +++ b/src/ORM/DatabaseAdmin.php @@ -14,6 +14,7 @@ use SilverStripe\Dev\DevelopmentAdmin; use SilverStripe\Dev\TestOnly; use SilverStripe\ORM\Connect\DatabaseException; +use SilverStripe\ORM\Connect\TableBuilder; use SilverStripe\ORM\FieldType\DBClassName; use SilverStripe\Security\Permission; use SilverStripe\Security\Security; @@ -304,46 +305,8 @@ public function doBuild($quiet = false, $populate = true, $testMode = false) // Initiate schema update $dbSchema = DB::get_schema(); - $dbSchema->schemaUpdate(function () use ($dataClasses, $testMode, $quiet, $showRecordCounts) { - $dataObjectSchema = DataObject::getSchema(); - - foreach ($dataClasses as $dataClass) { - // Check if class exists before trying to instantiate - this sidesteps any manifest weirdness - if (!class_exists($dataClass ?? '')) { - continue; - } - - // Check if this class should be excluded as per testing conventions - $SNG = new $dataClass([], DataObject::CREATE_SINGLETON); - if (!$testMode && $SNG instanceof TestOnly) { - continue; - } - $tableName = $dataObjectSchema->tableName($dataClass); - - // Log data - if (!$quiet) { - if ($showRecordCounts && DB::get_schema()->hasTable($tableName)) { - try { - $count = DB::query("SELECT COUNT(*) FROM \"$tableName\"")->value(); - $countSuffix = " ($count records)"; - } catch (Exception $e) { - $countSuffix = " (error getting record count)"; - } - } else { - $countSuffix = ""; - } - - if (Director::is_cli()) { - echo " * $tableName$countSuffix\n"; - } else { - echo "
  • $tableName$countSuffix
  • \n"; - } - } - - // Instruct the class to apply its schema to the database - $SNG->requireTable(); - } - }); + $tableBuilder = TableBuilder::singleton(); + $tableBuilder->buildTables($dbSchema, $dataClasses, [], $quiet, $testMode, $showRecordCounts); ClassInfo::reset_db_cache(); if (!$quiet && !Director::is_cli()) {