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" ); } }