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 getCacheMode( $params ) {
00047 return 'public';
00048 }
00049
00050 public function executeGenerator($resultPageSet) {
00051 $this->run($resultPageSet);
00052 }
00053
00054 private function run($resultPageSet = null) {
00055 $params = $this->extractRequestParams();
00056 $namespaces = $this->getPageSet()->getAllTitlesByNamespace();
00057 if ( empty( $namespaces[NS_FILE] ) ) {
00058 return;
00059 }
00060 $images = $namespaces[NS_FILE];
00061
00062 $this->addTables('image', 'i1');
00063 $this->addTables('image', 'i2');
00064 $this->addFields(array(
00065 'i1.img_name AS orig_name',
00066 'i2.img_name AS dup_name',
00067 'i2.img_user_text AS dup_user_text',
00068 'i2.img_timestamp AS dup_timestamp'
00069 ));
00070 $this->addWhere(array(
00071 'i1.img_name' => array_keys($images),
00072 'i1.img_sha1 = i2.img_sha1',
00073 'i1.img_name != i2.img_name',
00074 ));
00075 if(isset($params['continue']))
00076 {
00077 $cont = explode('|', $params['continue']);
00078 if(count($cont) != 2)
00079 $this->dieUsage("Invalid continue param. You should pass the " .
00080 "original value returned by the previous query", "_badcontinue");
00081 $orig = $this->getDB()->strencode($this->titleTokey($cont[0]));
00082 $dup = $this->getDB()->strencode($this->titleToKey($cont[1]));
00083 $this->addWhere("i1.img_name > '$orig' OR ".
00084 "(i1.img_name = '$orig' AND ".
00085 "i2.img_name >= '$dup')");
00086 }
00087 $this->addOption('ORDER BY', 'i1.img_name');
00088 $this->addOption('LIMIT', $params['limit'] + 1);
00089
00090 $res = $this->select(__METHOD__);
00091 $db = $this->getDB();
00092 $count = 0;
00093 $titles = array();
00094 while($row = $db->fetchObject($res))
00095 {
00096 if(++$count > $params['limit'])
00097 {
00098
00099
00100 $this->setContinueEnumParameter('continue',
00101 $this->keyToTitle($row->orig_name) . '|' .
00102 $this->keyToTitle($row->dup_name));
00103 break;
00104 }
00105 if(!is_null($resultPageSet))
00106 $titles[] = Title::makeTitle(NS_FILE, $row->dup_name);
00107 else
00108 {
00109 $r = array(
00110 'name' => $row->dup_name,
00111 'user' => $row->dup_user_text,
00112 'timestamp' => wfTimestamp(TS_ISO_8601, $row->dup_timestamp)
00113 );
00114 $fit = $this->addPageSubItem($images[$row->orig_name], $r);
00115 if(!$fit)
00116 {
00117 $this->setContinueEnumParameter('continue',
00118 $this->keyToTitle($row->orig_name) . '|' .
00119 $this->keyToTitle($row->dup_name));
00120 break;
00121 }
00122 }
00123 }
00124 if(!is_null($resultPageSet))
00125 $resultPageSet->populateFromTitles($titles);
00126 $db->freeResult($res);
00127 }
00128
00129 public function getAllowedParams() {
00130 return array (
00131 'limit' => array(
00132 ApiBase :: PARAM_DFLT => 10,
00133 ApiBase :: PARAM_TYPE => 'limit',
00134 ApiBase :: PARAM_MIN => 1,
00135 ApiBase :: PARAM_MAX => ApiBase :: LIMIT_BIG1,
00136 ApiBase :: PARAM_MAX2 => ApiBase :: LIMIT_BIG2
00137 ),
00138 'continue' => null,
00139 );
00140 }
00141
00142 public function getParamDescription() {
00143 return array (
00144 'limit' => 'How many files to return',
00145 'continue' => 'When more results are available, use this to continue',
00146 );
00147 }
00148
00149 public function getDescription() {
00150 return 'List all files that are duplicates of the given file(s).';
00151 }
00152
00153 protected function getExamples() {
00154 return array ( 'api.php?action=query&titles=File:Albert_Einstein_Head.jpg&prop=duplicatefiles',
00155 'api.php?action=query&generator=allimages&prop=duplicatefiles',
00156 );
00157 }
00158
00159 public function getVersion() {
00160 return __CLASS__ . ': $Id: ApiQueryDuplicateFiles.php 69986 2010-07-27 03:57:39Z tstarling $';
00161 }
00162 }