X-Git-Url: https://git.heureux-cyclage.org/?a=blobdiff_plain;f=maintenance%2FdeleteArchivedFiles.inc;h=68394b4aadefad5aa49dce3a31e7a7a89ba97c36;hb=8775ac3b20b03b1b446217d637b3aad3019f1cad;hp=b42d6f5b599d55cc8de73e4f7e20d382256f8ef0;hpb=dbe6cb07ed1a584236f41f135686f6b74524c462;p=lhc%2Fweb%2Fwiklou.git diff --git a/maintenance/deleteArchivedFiles.inc b/maintenance/deleteArchivedFiles.inc index b42d6f5b59..68394b4aad 100644 --- a/maintenance/deleteArchivedFiles.inc +++ b/maintenance/deleteArchivedFiles.inc @@ -1,46 +1,65 @@ begin(); - $tbl_arch = $dbw->tableName( 'filearchive' ); - $repo = RepoGroup::singleton()->getLocalRepo(); - # Get "active" revisions from the filearchive table - echo( "Searching for and deleting archived files...\n" ); - $res = $dbw->query( "SELECT fa_id,fa_storage_group,fa_storage_key FROM $tbl_arch" ); - $count = 0; - while( $row = $dbw->fetchObject( $res ) ) { - $key = $row->fa_storage_key; - $group = $row->fa_storage_group; - $id = $row->fa_id; - $path = $repo->getZonePath( 'deleted' ).'/'.$repo->getDeletedHashPath($key).$key; - $sha1 = substr( $key, 0, strcspn( $key, '.' ) ); - // Check if the file is used anywhere... - $inuse = $dbw->selectField( 'oldimage', '1', - array( 'oi_sha1' => $sha1, - 'oi_deleted & '.File::DELETED_FILE => File::DELETED_FILE ), - __METHOD__, - array( 'FOR UPDATE' ) - ); - if ( $path && file_exists($path) && !$inuse ) { - unlink($path); // delete - $count++; - $dbw->query( "DELETE FROM $tbl_arch WHERE fa_id = $id" ); - } else { - echo( "Notice - file '$key' not found in group '$group'\n" ); +class DeleteArchivedFilesImplementation { + static public function doDelete( $output, $force ) { + # Data should come off the master, wrapped in a transaction + $dbw = wfGetDB( DB_MASTER ); + $dbw->begin(); + $tbl_arch = $dbw->tableName( 'filearchive' ); + $repo = RepoGroup::singleton()->getLocalRepo(); + # Get "active" revisions from the filearchive table + $output->handleOutput( "Searching for and deleting archived files...\n" ); + $res = $dbw->query( "SELECT fa_id,fa_storage_group,fa_storage_key FROM $tbl_arch" ); + $count = 0; + foreach ( $res as $row ) { + $key = $row->fa_storage_key; + $group = $row->fa_storage_group; + $id = $row->fa_id; + $path = $repo->getZonePath( 'deleted' ) . '/' . $repo->getDeletedHashPath( $key ) . $key; + $sha1 = substr( $key, 0, strcspn( $key, '.' ) ); + // Check if the file is used anywhere... + $inuse = $dbw->selectField( 'oldimage', '1', + array( 'oi_sha1' => $sha1, + 'oi_deleted & ' . File::DELETED_FILE => File::DELETED_FILE ), + __METHOD__, + array( 'FOR UPDATE' ) + ); + if ( $path && file_exists( $path ) && !$inuse ) { + if( unlink( $path ) ) { // delete + $count++; + $dbw->query( "DELETE FROM $tbl_arch WHERE fa_id = $id" ); + } else { + $output->handleOutput( "Unable to remove file $path, skipping\n" ); + } + } else { + $output->handleOutput( "Notice - file '$key' not found in group '$group'\n" ); + if ( $force ) { + $output->handleOutput( "Got --force, deleting DB entry\n" ); + $dbw->query( "DELETE FROM $tbl_arch WHERE fa_id = $id" ); + } + } } + $dbw->commit(); + $output->handleOutput( "Done! [$count file(s)]\n" ); } - $dbw->commit(); - echo( "Done! [$count file(s)]\n" ); -} +} \ No newline at end of file