X-Git-Url: http://git.cyclocoop.org/?a=blobdiff_plain;f=includes%2FSpecialRandompage.php;h=59836c9fedfe1f83f842e21bfa0406cba93d8d86;hb=bd91985ec999fc23684cd56b47740f3c57758be0;hp=9282de8a64cafa7c284f49d17eb812c9cf3b1475;hpb=ba2afcd9fa9b1f3f6a865da054068466164fd2fa;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/SpecialRandompage.php b/includes/SpecialRandompage.php index 9282de8a64..59836c9fed 100644 --- a/includes/SpecialRandompage.php +++ b/includes/SpecialRandompage.php @@ -1,45 +1,60 @@ 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 + # biased towards low values, as rows later in the table will likely + # never be reached for comparison. + # + # 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 = number_format( $rand, 12, ".", "" ); + $randstr = wfRandom(); + $db =& wfGetDB( DB_SLAVE ); - $use_index = $db->useIndexClause( 'cur_random' ); - $cur = $db->tableName( 'cur' ); + $use_index = $db->useIndexClause( 'page_random' ); + $page = $db->tableName( 'page' ); - if ( $wgExtraRandompageSQL ) { - $extra = "AND ($wgExtraRandompageSQL)"; - } else { - $extra = ''; - } - $sqlget = "SELECT cur_id,cur_title - FROM $cur $use_index - WHERE cur_namespace=0 AND cur_is_redirect=0 $extra - AND cur_random>$randstr - ORDER BY cur_random + $extra = $wgExtraRandompageSQL ? "AND ($wgExtraRandompageSQL)" : ''; + $sql = "SELECT page_id,page_title + FROM $page $use_index + 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 ); + $res = $db->query( $sql, $fname ); + + $title = null; if( $s = $db->fetchObject( $res ) ) { - $rt = wfUrlEncode( $s->cur_title ); - } else { - # No articles?! - $rt = ""; + $title =& Title::makeTitle( $namespace, $s->page_title ); + } + if( is_null( $title ) ) { + # That's not supposed to happen :) + $title =& Title::newFromText( wfMsg( 'mainpage' ) ); } - $wgOut->reportTime(); # for logfile - $wgOut->redirect( wfLocalUrl( $rt ) ); + $wgOut->redirect( $title->getFullUrl() ); } ?>