47 $this->
output(
"Use --delete to actually confirm this script\n" );
51 # Data should come off the master, wrapped in a transaction
56 # Get "active" revisions from the filearchive table
57 $this->
output(
"Searching for and deleting archived files...\n" );
58 $res = $dbw->newSelectQueryBuilder()
59 ->select( [
'fa_id',
'fa_storage_group',
'fa_storage_key',
'fa_sha1',
'fa_name' ] )
60 ->from(
'filearchive' )
61 ->caller( __METHOD__ )
65 foreach ( $res as $row ) {
66 $key = $row->fa_storage_key;
68 $this->
output(
"Entry with ID {$row->fa_id} has empty key, skipping\n" );
72 $file = $repo->newFile( $row->fa_name );
73 $status = $file->acquireFileLock( 10 );
74 if ( !$status->isOK() ) {
75 $this->
error(
"Could not acquire lock on '{$row->fa_name}', skipping\n" );
79 $group = $row->fa_storage_group;
81 $path = $repo->getZonePath(
'deleted' ) .
82 '/' . $repo->getDeletedHashPath( $key ) . $key;
83 if ( isset( $row->fa_sha1 ) ) {
84 $sha1 = $row->fa_sha1;
87 $sha1 = LocalRepo::getHashFromKey( $key );
91 $inuse = (bool)$dbw->newSelectQueryBuilder()
96 $dbw->bitAnd(
'oi_deleted', File::DELETED_FILE ) => File::DELETED_FILE
98 ->caller( __METHOD__ )
103 if ( !$repo->fileExists(
$path ) ) {
104 $this->
output(
"Notice - file '$key' not found in group '$group'\n" );
105 } elseif ( $inuse ) {
106 $this->
output(
"Notice - file '$key' is still in use\n" );
107 } elseif ( !$repo->quickPurge(
$path ) ) {
108 $this->
output(
"Unable to remove file $path, skipping\n" );
109 $file->releaseFileLock();
119 $this->
output(
"Got --force, deleting DB entry\n" );
121 $file->releaseFileLock();
127 $dbw->newDeleteQueryBuilder()
128 ->deleteFrom(
'filearchive' )
129 ->where( [
'fa_id' => $id ] )
130 ->caller( __METHOD__ )->execute();
131 $file->releaseFileLock();
135 $this->
output(
"Done! [$count file(s)]\n" );