MediaWiki master
eraseArchivedFile.php
Go to the documentation of this file.
1<?php
26
27// @codeCoverageIgnoreStart
28require_once __DIR__ . '/Maintenance.php';
29// @codeCoverageIgnoreEnd
30
40 public function __construct() {
41 parent::__construct();
42 $this->addDescription( 'Erases traces of deleted files.' );
43 $this->addOption( 'delete', 'Perform the deletion' );
44 $this->addOption( 'filename', 'File name', false, true );
45 $this->addOption( 'filekey', 'File storage key (with extension) or "*"', true, true );
46 }
47
48 public function execute() {
49 if ( !$this->hasOption( 'delete' ) ) {
50 $this->output( "Use --delete to actually confirm this script\n" );
51 }
52
53 $filekey = $this->getOption( 'filekey' );
54 $filename = $this->getOption( 'filename' );
55
56 if ( $filekey === '*' ) {
57 // all versions by name
58 if ( $filename === null || $filename === '' ) {
59 $this->fatalError( "Missing --filename parameter." );
60 }
61 $afile = false;
62 } else {
63 // specified version
64 $dbw = $this->getPrimaryDB();
65 $queryBuilder = FileSelectQueryBuilder::newForArchivedFile( $dbw );
66 $queryBuilder->where( [ 'fa_storage_group' => 'deleted', 'fa_storage_key' => $filekey ] );
67 $row = $queryBuilder->caller( __METHOD__ )->fetchRow();
68
69 if ( !$row ) {
70 $this->fatalError( "No deleted file exists with key '$filekey'." );
71 }
72 $filename = $row->fa_name;
73 $afile = ArchivedFile::newFromRow( $row );
74 }
75
76 $file = $this->getServiceContainer()->getRepoGroup()->getLocalRepo()->newFile( $filename );
77 if ( $file->exists() ) {
78 $this->fatalError( "File '$filename' is still a public file, use the delete form.\n" );
79 }
80
81 $this->output( "Purging all thumbnails for file '$filename'..." );
82 $file->purgeCache();
83 $this->output( "done.\n" );
84
85 if ( $afile instanceof ArchivedFile ) {
86 $this->scrubVersion( $afile );
87 } else {
88 $this->output( "Finding deleted versions of file '$filename'...\n" );
89 $this->scrubAllVersions( $filename );
90 $this->output( "Done\n" );
91 }
92 }
93
94 protected function scrubAllVersions( $name ) {
95 $dbw = $this->getPrimaryDB();
96 $queryBuilder = FileSelectQueryBuilder::newForArchivedFile( $dbw );
97 $queryBuilder->where( [ 'fa_name' => $name, 'fa_storage_group' => 'deleted' ] );
98 $res = $queryBuilder->caller( __METHOD__ )->fetchResultSet();
99 foreach ( $res as $row ) {
100 $this->scrubVersion( ArchivedFile::newFromRow( $row ) );
101 }
102 }
103
104 protected function scrubVersion( ArchivedFile $archivedFile ) {
105 $key = $archivedFile->getStorageKey();
106 $name = $archivedFile->getName();
107 $ts = $archivedFile->getTimestamp();
108 $repo = $this->getServiceContainer()->getRepoGroup()->getLocalRepo();
109 $path = $repo->getZonePath( 'deleted' ) . '/' . $repo->getDeletedHashPath( $key ) . $key;
110 if ( $this->hasOption( 'delete' ) ) {
111 $status = $repo->getBackend()->delete( [ 'src' => $path ] );
112 if ( $status->isOK() ) {
113 $this->output( "Deleted version '$key' ($ts) of file '$name'\n" );
114 } else {
115 $this->output( "Failed to delete version '$key' ($ts) of file '$name'\n" );
116 $this->error( $status );
117 }
118 } else {
119 $this->output( "Would delete version '{$key}' ({$ts}) of file '$name'\n" );
120 }
121 }
122}
123
124// @codeCoverageIgnoreStart
125$maintClass = EraseArchivedFile::class;
126require_once RUN_MAINTENANCE_IF_MAIN;
127// @codeCoverageIgnoreEnd
Deleted file in the 'filearchive' table.
getTimestamp()
Return upload timestamp.
getStorageKey()
Return the FileStore key (overriding base File class)
getName()
Return the file name.
Maintenance script to delete archived (non-current) files from storage.
scrubVersion(ArchivedFile $archivedFile)
execute()
Do the actual work.
__construct()
Default constructor.
Abstract maintenance class for quickly writing and churning out maintenance scripts with minimal effo...
output( $out, $channel=null)
Throw some output to the user.
fatalError( $msg, $exitCode=1)
Output a message and terminate the current script.
addOption( $name, $description, $required=false, $withArg=false, $shortName=false, $multiOccurrence=false)
Add a parameter to the script.
hasOption( $name)
Checks to see if a particular option was set.
getOption( $name, $default=null)
Get an option, or return the default.
error( $err, $die=0)
Throw an error to the user.
getServiceContainer()
Returns the main service container.
addDescription( $text)
Set the description text.