Source of file DatabaseAdminCleaner.php
Size: 7,512 Bytes - Last Modified: 2021-12-23T10:51:13+00:00
/var/www/docs.ssmods.com/process/src/code/DatabaseAdminCleaner.php
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249 | <?php class DatabaseAdminCleaner extends Extension { public static $allowed_actions = array( "scrub", "FormDeleteCruft" ); public function scrub($request) { if(!Director::is_cli()) { $renderer = DebugView::create(); $renderer->writeHeader(); $renderer->writeInfo("Environment Builder", Director::absoluteBaseURL()); echo "<div class=\"scrub\">"; } $cruft = array(); $tableList = DB::getConn()->tableList(); $dataClasses = ClassInfo::subclassesFor('DataObject'); array_shift($dataClasses); foreach($tableList as $table) { if(!in_array($table, $dataClasses)) $cruftTables[$table] = array( "DataClass" => $table, "WholeTable" => true ); } foreach($dataClasses as $dataClass) { if(class_exists($dataClass)) { $SNG = singleton($dataClass); if(!($SNG instanceof TestOnly)) { $classCruft = $SNG->Cruft(); if(!empty($classCruft)) $cruft[] = $classCruft; foreach($SNG->many_many() as $relationship => $childClass) { unset($cruftTables["{$dataClass}_{$relationship}"]); } } if($SNG->hasExtension("Versioned")) { unset($cruftTables["{$dataClass}_versions"]); unset($cruftTables["{$dataClass}_Live"]); unset($cruftTables["{$dataClass}_Stage"]); } } } $cruft = array_merge(array_values($cruftTables), $cruft); $form = $this->FormDeleteCruft(); $form->setFormAction("/DatabaseAdmin/FormDeleteCruft"); $fields = $form->Fields(); foreach($cruft as $classCruft) { $group = new CompositeField(array( new HeaderField($classCruft["DataClass"]) )); if(!empty($classCruft["WholeTable"]) && $classCruft["WholeTable"]) { $group->push(new CompositeField(array( new CheckboxField("DeleteSpec[{$classCruft["DataClass"]}][WholeTable]", "Whole {$classCruft["DataClass"]} Table") ))); } if(!empty($classCruft["Fields"])) { $fieldsGroup = new CompositeField(array( new HeaderField("DeleteSpec[{$classCruft["DataClass"]}][Fields]", "Fields", 3) )); foreach($classCruft["Fields"] as $fieldName => $field) { $fieldsGroup->push(new CheckboxField("DeleteSpec[{$classCruft["DataClass"]}][Fields][{$fieldName}]", "{$fieldName} ({$field["Type"]})")); } $group->push($fieldsGroup); } if(!empty($classCruft["Indexes"])) { $indexesGroup = new CompositeField(array( new HeaderField("DeleteSpec[{$classCruft["DataClass"]}][Indexes]", "Indexes", 3) )); foreach($classCruft["Indexes"] as $indexName => $index) { $indexesGroup->push(new CheckboxField("DeleteSpec[{$classCruft["DataClass"]}][Indexes][{$indexName}]", "{$indexName} ({$index["Column_name"]})")); } $group->push($indexesGroup); } if(!empty($classCruft["ManyManyFields"]) || !empty($classCruft["ManyManyIndexes"])) { $relationships = array_unique(array_merge( array_keys( isset($classCruft["ManyManyFields"])?$classCruft["ManyManyFields"]:array() ), array_keys( isset($classCruft["ManyManyIndexes"])?$classCruft["ManyManyIndexes"]:array() ) )); foreach($relationships as $relationship) { $manyManyGroup = new CompositeField(array( new HeaderField("DeleteSpec[{$classCruft["DataClass"]}][ManyMany][{$relationship}]", "Many-Many: {$relationship}", 4) )); if(!empty($classCruft["ManyManyFields"][$relationship])) { $manyManyGroup->push($fieldsGroup = new CompositeField(array( new HeaderField("DeleteSpec[{$classCruft["DataClass"]}][ManyMany][{$relationship}][Fields]", "Fields", 5) ))); foreach($classCruft["ManyManyFields"][$relationship] as $fieldName => $field) { $fieldsGroup->push(new CheckboxField("DeleteSpec[{$classCruft["DataClass"]}][ManyMany][{$relationship}][Fields][{$fieldName}]", "{$fieldName} ({$field["Type"]})")); } } if(!empty($classCruft["ManyManyIndexes"][$relationship])) { $manyManyGroup->push($fieldsGroup = new CompositeField(array( new HeaderField("DeleteSpec[{$classCruft["DataClass"]}][ManyMany][{$relationship}][Indexes]", "Indexes", 5) ))); foreach($classCruft["ManyManyIndexes"][$relationship] as $indexName => $index) { $fieldsGroup->push(new CheckboxField("DeleteSpec[{$classCruft["DataClass"]}][ManyMany][{$relationship}][Indexes][{$indexName}]", "{$indexName} ({$index["Column_name"]})")); } } $group->push($manyManyGroup); } } $fields->push($group); } echo $this->owner->renderWith(array("DatabaseAdminCleaner", "ContentController"), array( "FormDeleteCruft" => $form )); if(!Director::is_cli()) { echo "</div>"; $renderer->writeFooter(); } } public function FormDeleteCruft($request = null) { $fields = new FieldList(); $actions = new FieldList( new FormAction("ActionDeleteCruft", "Delete Cruft") ); return new Form($this->owner, __FUNCTION__, $fields, $actions); } public function ActionDeleteCruft($data, $form) { if(!Director::is_cli()) { $renderer = DebugView::create(); $renderer->writeHeader(); $renderer->writeInfo("Environment Builder", Director::absoluteBaseURL()); echo "<div class=\"scrub\">"; } if(!empty($data["DeleteSpec"])) foreach($data["DeleteSpec"] as $table => $spec) { if(!empty($spec["WholeTable"]) && $spec["WholeTable"] === "1") { $this->deleteTable($table); continue; } if(!empty($spec["Fields"])) foreach($spec["Fields"] as $fieldName => $delete) { if($delete !== "1") continue; $this->deleteField($table, $fieldName); } if(!empty($spec["Indexes"])) foreach($spec["Indexes"] as $indexName => $delete) { if($delete !== "1") continue; $this->deleteIndex($table, $indexName); } if(!empty($spec["ManyMany"])) foreach($spec["ManyMany"] as $relationship => $manyManySpec) { if(!empty($manyManySpec["Fields"])) foreach($manyManySpec["Fields"] as $fieldName => $delete) { if($delete !== "1") continue; $this->deleteField("{$table}_{$relationship}", $fieldName); } if(!empty($manyManySpec["Indexes"])) foreach($manyManySpec["Indexes"] as $indexName => $delete) { if($delete !== "1") continue; $this->deleteIndex("{$table}_{$relationship}", $indexName); } } } if(!Director::is_cli()) { echo "</div>"; $renderer->writeFooter(); } } public function deleteTable($table) { Debug::message("Deleting Table: {$table}"); $conn = DB::getConn(); switch(true) { case $conn instanceof MySQLDatabase: $conn->query("DROP TABLE `{$table}`"); break; } } public function deleteField($table, $field) { Debug::message("Deleting Field: {$table}, {$field}"); $conn = DB::getConn(); switch(true) { case $conn instanceof MySQLDatabase: $conn->query("ALTER TABLE `{$table}` DROP COLUMN `{$field}`"); break; } } public function deleteIndex($table, $index) { Debug::message("Deleting Index: {$table}, {$index}"); $conn = DB::getConn(); switch(true) { case $conn instanceof MySQLDatabase: $conn->query("ALTER TABLE `{$table}` DROP INDEX `{$index}`"); break; } } } class DevelopmentAdminCleaner extends Extension { public static $allowed_actions = array( "scrub" ); public function scrub($request) { return $this->owner->redirect("DatabaseAdmin/scrub"); } } |