$this->mDescription='Script to update image metadata records';
$this->setBatchSize(200);
$this->addOption('force','Reload metadata from file even if the metadata looks ok',false,false,'f');
$this->addOption('broken-only','Only fix really broken records, leave old but still compatible records alone.');
$this->addOption('verbose','Output extra information about each upgraded/non-upgraded file.',false,false,'v');
$this->addOption('start','Name of file to start with',false,true);
$this->addOption('end','Name of file to end with',false,true);
$this->addOption('mime','(Inefficient!) Only refresh files with this mime type. Can accept wild-card image/*',false,true);
$this->addOption('metadata-contains','(Inefficient!) Only refresh files where the img_metadata field contains this string. Can be used if its known a specific property was being extracted incorrectly.',false,true);
}
publicfunctionexecute(){
$force=$this->hasOption('force');
$brokenOnly=$this->hasOption('broken-only');
$verbose=$this->hasOption('verbose');
$start=$this->getOption('start',false);
$this->setupParameters($force,$brokenOnly);
$upgraded=0;
$leftAlone=0;
$error=0;
$dbw=wfGetDB(DB_MASTER);
if($this->mBatchSize<=0){
$this->error("Batch size is too low...",12);
}
$repo=RepoGroup::singleton()->getLocalRepo();
$conds=$this->getConditions($dbw);
// For the WHERE img_name > 'foo' condition that comes after doing a batch
$conds2=array();
if($start!==false){
$conds2[]='img_name >= '.$dbw->addQuotes($start);
}
$options=array(
'LIMIT'=>$this->mBatchSize,
'ORDER BY'=>'img_name ASC',
);
do{
$res=$dbw->select(
'image',
'*',
array_merge($conds,$conds2),
__METHOD__,
$options
);
if($res->numRows()>0){
$row1=$res->current();
$this->output("Processing next {$this->mBatchSize} rows starting with {$row1->img_name}.\n");
$res->rewind();
}else{
$this->error("No images to process.",4);
}
foreach($resas$row){
$file=$repo->newFileFromRow($row);
if($file->getUpgraded()){
// File was upgraded.
$upgraded++;
$newLength=strlen($file->getMetadata());
$oldLength=strlen($row->img_metadata);
if($newLength<$oldLength-5){
// If after updating, the metadata is smaller then
// what it was before, that's probably not a good thing
// because we extract more data with time, not less.
// Thus this probably indicates an error of some sort,
// or at the very least is suspicious. Have the - 5 just
// to weed out any inconsequential changes.
$error++;
$this->output("Warning: File:{$row->img_name} used to have ".
"$oldLength bytes of metadata but now has $newLength bytes.\n");
$this->output("\nFinished refreshing file metadata for $total files. $upgraded needed to be refreshed, $leftAlone did not need to be but were refreshed anyways, and $error refreshes were suspicious.\n");
}else{
$this->output("\nFinished refreshing file metadata for $total files. $upgraded were refreshed, $leftAlone were already up to date, and $error refreshes were suspicious.\n");