00001 <?php
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 if (!defined('MEDIAWIKI')) {
00027
00028 require_once ("ApiQueryBase.php");
00029 }
00030
00036 class ApiQueryDuplicateFiles extends ApiQueryGeneratorBase {
00037
00038 public function __construct($query, $moduleName) {
00039 parent :: __construct($query, $moduleName, 'df');
00040 }
00041
00042 public function execute() {
00043 $this->run();
00044 }
00045
00046 public function executeGenerator($resultPageSet) {
00047 $this->run($resultPageSet);
00048 }
00049
00050 private function run($resultPageSet = null) {
00051 $params = $this->extractRequestParams();
00052 $namespaces = $this->getPageSet()->getAllTitlesByNamespace();
00053 if ( empty( $namespaces[NS_FILE] ) ) {
00054 return;
00055 }
00056 $images = $namespaces[NS_FILE];
00057
00058 $this->addTables('image', 'i1');
00059 $this->addTables('image', 'i2');
00060 $this->addFields(array(
00061 'i1.img_name AS orig_name',
00062 'i2.img_name AS dup_name',
00063 'i2.img_user_text AS dup_user_text',
00064 'i2.img_timestamp AS dup_timestamp'
00065 ));
00066 $this->addWhere(array(
00067 'i1.img_name' => array_keys($images),
00068 'i1.img_sha1 = i2.img_sha1',
00069 'i1.img_name != i2.img_name',
00070 ));
00071 if(isset($params['continue']))
00072 {
00073 $cont = explode('|', $params['continue']);
00074 if(count($cont) != 2)
00075 $this->dieUsage("Invalid continue param. You should pass the " .
00076 "original value returned by the previous query", "_badcontinue");
00077 $orig = $this->getDB()->strencode($this->titleTokey($cont[0]));
00078 $dup = $this->getDB()->strencode($this->titleToKey($cont[1]));
00079 $this->addWhere("i1.img_name > '$orig' OR ".
00080 "(i1.img_name = '$orig' AND ".
00081 "i2.img_name >= '$dup')");
00082 }
00083 $this->addOption('ORDER BY', 'i1.img_name');
00084 $this->addOption('LIMIT', $params['limit'] + 1);
00085
00086 $res = $this->select(__METHOD__);
00087 $db = $this->getDB();
00088 $count = 0;
00089 $titles = array();
00090 while($row = $db->fetchObject($res))
00091 {
00092 if(++$count > $params['limit'])
00093 {
00094
00095
00096 $this->setContinueEnumParameter('continue',
00097 $this->keyToTitle($row->orig_name) . '|' .
00098 $this->keyToTitle($row->dup_name));
00099 break;
00100 }
00101 if(!is_null($resultPageSet))
00102 $titles[] = Title::makeTitle(NS_FILE, $row->dup_name);
00103 else
00104 {
00105 $r = array(
00106 'name' => $row->dup_name,
00107 'user' => $row->dup_user_text,
00108 'timestamp' => wfTimestamp(TS_ISO_8601, $row->dup_timestamp)
00109 );
00110 $fit = $this->addPageSubItem($images[$row->orig_name], $r);
00111 if(!$fit)
00112 {
00113 $this->setContinueEnumParameter('continue',
00114 $this->keyToTitle($row->orig_name) . '|' .
00115 $this->keyToTitle($row->dup_name));
00116 break;
00117 }
00118 }
00119 }
00120 if(!is_null($resultPageSet))
00121 $resultPageSet->populateFromTitles($titles);
00122 $db->freeResult($res);
00123 }
00124
00125 public function getAllowedParams() {
00126 return array (
00127 'limit' => array(
00128 ApiBase :: PARAM_DFLT => 10,
00129 ApiBase :: PARAM_TYPE => 'limit',
00130 ApiBase :: PARAM_MIN => 1,
00131 ApiBase :: PARAM_MAX => ApiBase :: LIMIT_BIG1,
00132 ApiBase :: PARAM_MAX2 => ApiBase :: LIMIT_BIG2
00133 ),
00134 'continue' => null,
00135 );
00136 }
00137
00138 public function getParamDescription() {
00139 return array (
00140 'limit' => 'How many files to return',
00141 'continue' => 'When more results are available, use this to continue',
00142 );
00143 }
00144
00145 public function getDescription() {
00146 return 'List all files that are duplicates of the given file(s).';
00147 }
00148
00149 protected function getExamples() {
00150 return array ( 'api.php?action=query&titles=File:Albert_Einstein_Head.jpg&prop=duplicatefiles',
00151 'api.php?action=query&generator=allimages&prop=duplicatefiles',
00152 );
00153 }
00154
00155 public function getVersion() {
00156 return __CLASS__ . ': $Id: ApiQueryDuplicateFiles.php 48215 2009-03-09 10:44:34Z catrope $';
00157 }
00158 }