33require_once __DIR__ .
'/Maintenance.php';
50 parent::__construct();
56 $this->
addDescription(
'Script to update image metadata records' );
58 $this->
addOption(
'missing',
'Check for files without associated database record' );
59 $this->
addOption(
'dry-run',
'Only report, don\'t update the database' );
64 $this->dryrun = $this->
hasOption(
'dry-run' );
65 if ( $this->dryrun ) {
66 MediaWiki\MediaWikiServices::getInstance()->getReadOnlyMode()
67 ->setReason(
'Dry run mode, image upgrades are suppressed' );
81 if ( !isset( $this->repo ) ) {
93 function init( $count, $table ) {
96 $this->count = $count;
97 $this->startTime = microtime(
true );
98 $this->
table = $table;
102 $this->updated += $updated;
104 if ( $this->processed % 100 != 0 ) {
107 $portion = $this->processed / $this->count;
108 $updateRate = $this->updated / $this->processed;
110 $now = microtime(
true );
111 $delta = $now - $this->startTime;
112 $estimatedTotalTime = $delta / $portion;
113 $eta = $this->startTime + $estimatedTotalTime;
114 $rate = $this->processed / $delta;
116 $this->
output( sprintf(
"%s: %6.2f%% done on %s; ETA %s [%d/%d] %.2f/sec <%.2f%% updated>\n",
124 $updateRate * 100.0 ) );
129 $count = $this->dbw->selectField( $table,
'count(*)',
'', __METHOD__ );
130 $this->
init( $count, $table );
131 $this->
output(
"Processing $table...\n" );
133 $result = $this->
getDB(
DB_REPLICA )->select( $table,
'*', [], __METHOD__ );
135 foreach ( $result as $row ) {
136 $update = call_user_func( $callback, $row,
null );
143 $this->
output(
"Finished $table... $this->updated of $this->processed rows updated\n" );
147 $callback = [ $this,
'imageCallback' ];
148 $this->
buildTable(
'image',
'img_name', $callback );
154 $file = $this->
getRepo()->newFileFromRow( $row );
156 return $file->getUpgraded();
160 $this->
buildTable(
'oldimage',
'oi_archive_name', [ $this,
'oldimageCallback' ] );
166 if ( $row->oi_archive_name ==
'' ) {
167 $this->
output(
"Empty oi_archive_name for oi_name={$row->oi_name}\n" );
171 $file = $this->
getRepo()->newFileFromRow( $row );
173 return $file->getUpgraded();
177 $this->
getRepo()->enumFiles( [ $this,
'checkMissingImage' ] );
182 $row = $this->dbw->selectRow(
'image',
184 [
'img_name' => $filename ],
195 $timestamp = $this->dbw->timestamp( $this->
getRepo()->getFileTimestamp( $fullpath ) );
197 $altname =
$wgContLang->checkTitleEncoding( $filename );
198 if ( $altname != $filename ) {
199 if ( $this->dryrun ) {
200 $filename = $altname;
201 $this->
output(
"Estimating transcoding... $altname\n" );
203 # @todo FIXME: create renameFile()
204 $filename = $this->renameFile( $filename );
208 if ( $filename ==
'' ) {
209 $this->
output(
"Empty filename for $fullpath\n" );
213 if ( !$this->dryrun ) {
215 if ( !$file->recordUpload(
217 '(recovered file, missing upload log entry)',
224 $this->
output(
"Error uploading file $fullpath\n" );
229 $this->
output( $fullpath .
"\n" );
$wgUpdateCompatibleMetadata
If to automatically update the img_metadata field if the metadata field is outdated but compatible wi...
wfBaseName( $path, $suffix='')
Return the final portion of a pathname.
wfLocalFile( $title)
Get an object referring to a locally registered file.
wfTimestamp( $outputtype=TS_UNIX, $ts=0)
Get a timestamp string in one of various formats.
Maintenance script to update image metadata records.
__construct()
Default constructor.
oldimageCallback( $row, $copy)
buildTable( $table, $key, $callback)
checkMissingImage( $fullpath)
IMaintainableDatabase $dbw
imageCallback( $row, $copy)
execute()
Do the actual work.
addMissingImage( $filename, $fullpath)
Abstract maintenance class for quickly writing and churning out maintenance scripts with minimal effo...
getDB( $db, $groups=[], $wiki=false)
Returns a database to be used by current maintenance script.
hasOption( $name)
Checks to see if a particular param exists.
addDescription( $text)
Set the description text.
addOption( $name, $description, $required=false, $withArg=false, $shortName=false, $multiOccurrence=false)
Add a parameter to the script.
static singleton()
Get a RepoGroup instance.
deferred txt A few of the database updates required by various functions here can be deferred until after the result page is displayed to the user For updating the view updating the linked to tables after a etc PHP does not yet have any way to tell the server to actually return and disconnect while still running these but it might have such a feature in the future We handle these by creating a deferred update object and putting those objects on a global then executing the whole list after the page is displayed We don t do anything smart like collating updates to the same table or such because the list is almost always going to have just one item on if so it s not worth the trouble Since there is a job queue in the jobs table
this class mediates it Skin Encapsulates a look and feel for the wiki All of the functions that render HTML and make choices about how to render it are here and are called from various other places when and is meant to be subclassed with other skins that may override some of its functions The User object contains a reference to a and so rather than having a global skin object we just rely on the global User and get the skin with $wgUser and also has some character encoding functions and other locale stuff The current user interface language is instantiated as and the local content language as $wgContLang
design txt This is a brief overview of the new design More thorough and up to date information is available on the documentation wiki at etc Handles the details of getting and saving to the user table of the and dealing with sessions and cookies OutputPage Encapsulates the entire HTML page that will be sent in response to any server request It is used by calling its functions to add in any and then calling output() to send it all. It could be easily changed to send incrementally if that becomes useful
Advanced database interface for IDatabase handles that include maintenance methods.
require_once RUN_MAINTENANCE_IF_MAIN