From 7b0329284eeccae670f149b3287ffbf5675cbbb5 Mon Sep 17 00:00:00 2001 From: Zack Galbreath Date: Thu, 21 Nov 2024 15:12:25 -0500 Subject: [PATCH] Move deleteUnusedRows to DatabaseCleanupUtils --- app/Console/Commands/CleanDatabase.php | 72 ++++++-------------------- app/Utils/DatabaseCleanupUtils.php | 45 ++++++++++++++++ 2 files changed, 62 insertions(+), 55 deletions(-) diff --git a/app/Console/Commands/CleanDatabase.php b/app/Console/Commands/CleanDatabase.php index 7498337c9e..8fe0bbf3d2 100644 --- a/app/Console/Commands/CleanDatabase.php +++ b/app/Console/Commands/CleanDatabase.php @@ -2,8 +2,10 @@ namespace App\Console\Commands; +use App\Utils\DatabaseCleanupUtils; use Illuminate\Console\Command; use Illuminate\Support\Facades\DB; +use Illuminate\Support\Facades\Log; class CleanDatabase extends Command { @@ -22,68 +24,28 @@ class CleanDatabase extends Command */ public function handle(): void { + // Reconfigure laravel to log to stderr for the rest of this command. + config(['logging.default' => 'stderr']); + + Log::info("Deleting unused rows from `banner`"); $num_deleted = DB::delete("DELETE FROM banner WHERE projectid != 0 AND NOT EXISTS (SELECT 1 FROM project WHERE project.id = banner.projectid)"); - echo "{$num_deleted} rows deleted from `banner`\n"; + Log::info("{$num_deleted} rows deleted from `banner`"); - self::delete_unused_rows('dailyupdate', 'projectid', 'project'); + DatabaseCleanupUtils::deleteUnusedRows('dailyupdate', 'projectid', 'project'); - self::delete_unused_rows('buildfailuredetails', 'id', 'buildfailure', 'detailsid'); - self::delete_unused_rows('configure', 'id', 'build2configure', 'configureid'); - self::delete_unused_rows('coveragefile', 'id', 'coverage', 'fileid'); - self::delete_unused_rows('dailyupdatefile', 'dailyupdateid', 'dailyupdate'); - self::delete_unused_rows('note', 'id', 'build2note', 'noteid'); - self::delete_unused_rows('testoutput', 'id', 'build2test', 'outputid'); - self::delete_unused_rows('uploadfile', 'id', 'build2uploadfile', 'fileid'); + DatabaseCleanupUtils::deleteUnusedRows('buildfailuredetails', 'id', 'buildfailure', 'detailsid'); + DatabaseCleanupUtils::deleteUnusedRows('configure', 'id', 'build2configure', 'configureid'); + DatabaseCleanupUtils::deleteUnusedRows('coveragefile', 'id', 'coverage', 'fileid'); + DatabaseCleanupUtils::deleteUnusedRows('dailyupdatefile', 'dailyupdateid', 'dailyupdate'); + DatabaseCleanupUtils::deleteUnusedRows('note', 'id', 'build2note', 'noteid'); + DatabaseCleanupUtils::deleteUnusedRows('testoutput', 'id', 'build2test', 'outputid'); + DatabaseCleanupUtils::deleteUnusedRows('uploadfile', 'id', 'build2uploadfile', 'fileid'); + Log::info("Deleting unused rows from `image`"); $num_deleted = DB::delete("DELETE FROM image WHERE NOT EXISTS (SELECT 1 FROM project WHERE project.imageid = image.id) AND NOT EXISTS (SELECT 1 FROM test2image WHERE test2image.imgid = image.id)"); - echo "{$num_deleted} rows deleted from `image`\n"; - } - - /** Delete unused rows in batches */ - private static function delete_unused_rows(string $table, string $field, string $targettable, string $selectfield = 'id'): void - { - $start = DB::table($table)->min($field); - $max = DB::table($table)->max($field); - if (!is_numeric($start) || !is_numeric($max)) { - echo "Could not determine min and max for `{$field}` on `{$table}`\n"; - return; - } - - $start = intval($start); - $max = intval($max); - - $total = $max - $start; - if ($total < 1) { - return; - } - $num_done = 0; - $num_deleted = 0; - $next_report = 10; - $done = false; - echo "Deleting unused rows from `{$table}`\n"; - while (!$done) { - $end = $start + 49999; - $num_deleted += DB::delete(" - DELETE FROM $table - WHERE $field BETWEEN $start AND $end - AND $field NOT IN (SELECT $selectfield FROM $targettable)"); - $num_done += 50000; - if ($end >= $max) { - $done = true; - } else { - usleep(1); - $start += 50000; - // Calculate percentage of work completed so far. - $percent = round(($num_done / $total) * 100, -1); - if ($percent > $next_report) { - echo "{$next_report}%\n"; - $next_report = $next_report + 10; - } - } - } - echo "{$num_deleted} rows deleted from `{$table}`\n"; + Log::info("{$num_deleted} rows deleted from `image`"); } } diff --git a/app/Utils/DatabaseCleanupUtils.php b/app/Utils/DatabaseCleanupUtils.php index b12dc4d936..9efb64ec04 100644 --- a/app/Utils/DatabaseCleanupUtils.php +++ b/app/Utils/DatabaseCleanupUtils.php @@ -366,4 +366,49 @@ private static function deleteRowsChunked(string $query, array $ids): void usleep(1); } } + + /** Delete unused rows in batches */ + public static function deleteUnusedRows(string $table, string $field, string $targettable, string $selectfield = 'id'): void + { + $start = DB::table($table)->min($field); + $max = DB::table($table)->max($field); + if (!is_numeric($start) || !is_numeric($max)) { + Log::info("Could not determine min and max for `{$field}` on `{$table}`"); + return; + } + + $start = intval($start); + $max = intval($max); + + $total = $max - $start; + if ($total < 1) { + return; + } + $num_done = 0; + $num_deleted = 0; + $next_report = 10; + $done = false; + Log::info("Deleting unused rows from `{$table}`"); + while (!$done) { + $end = $start + 49999; + $num_deleted += DB::delete(" + DELETE FROM $table + WHERE $field BETWEEN $start AND $end + AND $field NOT IN (SELECT $selectfield FROM $targettable)"); + $num_done += 50000; + if ($end >= $max) { + $done = true; + } else { + usleep(1); + $start += 50000; + // Calculate percentage of work completed so far. + $percent = round(($num_done / $total) * 100, -1); + if ($percent > $next_report) { + Log::info("Cleaning `{$table}`: {$next_report}%"); + $next_report = $next_report + 10; + } + } + } + Log::info("{$num_deleted} rows deleted from `{$table}`"); + } }