X-Git-Url: http://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2FSpecialRandompage.php;h=d1c6417eaa2f10422ba4b6d9d352586188470fab;hb=0db8ece2b11070d5cd923743af27ed4ba8429042;hp=9a9326c9e4415401ae94b7bdfcaaa9ed4e665659;hpb=64ac6b8e775dd8582ea9cc5f24235488f076c5b3;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/SpecialRandompage.php b/includes/SpecialRandompage.php index 9a9326c9e4..d1c6417eaa 100644 --- a/includes/SpecialRandompage.php +++ b/includes/SpecialRandompage.php @@ -6,11 +6,20 @@ /** * Constructor + * + * @param string $par the namespace to get a random page from (default NS_MAIN), + * used as e.g. Special:Randompage/Category */ -function wfSpecialRandompage() { - global $wgOut, $wgTitle, $wgArticle, $wgExtraRandompageSQL; +function wfSpecialRandompage( $par = NS_MAIN ) { + global $wgOut, $wgExtraRandompageSQL, $wgContLang; $fname = 'wfSpecialRandompage'; + # Determine the namespace to get a random page from. + $namespace = $wgContLang->getNsIndex($par); + if ($namespace === false || $namespace < NS_MAIN) { + $namespace = NS_MAIN; + } + # NOTE! We use a literal constant in the SQL instead of the RAND() # function because RAND() will return a different value for every row # in the table. That's both very slow and returns results heavily @@ -19,34 +28,30 @@ function wfSpecialRandompage() { # # Using a literal constant means the whole thing gets optimized on # the index, and the comparison is both fast and fair. - + # interpolation and sprintf() can muck up with locale-specific decimal separator $randstr = wfRandom(); - + $db =& wfGetDB( DB_SLAVE ); $use_index = $db->useIndexClause( 'page_random' ); $page = $db->tableName( 'page' ); - if ( $wgExtraRandompageSQL ) { - $extra = "AND ($wgExtraRandompageSQL)"; - } else { - $extra = ''; - } - $sqlget = "SELECT page_id,page_title + $extra = $wgExtraRandompageSQL ? "AND ($wgExtraRandompageSQL)" : ''; + $sql = "SELECT page_id,page_title FROM $page $use_index - WHERE page_namespace=0 AND page_is_redirect=0 $extra + WHERE page_namespace=$namespace AND page_is_redirect=0 $extra AND page_random>$randstr - ORDER BY page_random - LIMIT 1"; - $res = $db->query( $sqlget, $fname ); - + ORDER BY page_random"; + $sql = $db->limitResult($sql, 1, 0); + $res = $db->query( $sql, $fname ); + $title = null; if( $s = $db->fetchObject( $res ) ) { - $title =& Title::makeTitle( NS_MAIN, $s->page_title ); - } + $title =& Title::makeTitle( $namespace, $s->page_title ); + } if( is_null( $title ) ) { # That's not supposed to happen :) - $title =& Title::newFromText( wfMsg( 'mainpage' ) ); + $title = Title::newFromText( wfMsg( 'mainpage' ) ); } $wgOut->reportTime(); # for logfile $wgOut->redirect( $title->getFullUrl() );