-<?
+<?php
function wfSpecialAsksql()
{
- global $wgUser, $wgOut, $action;
+ global $wgUser, $wgOut, $wgRequest, $wgAllowSysopQueries;
- if ( ! $wgUser->isSysop() ) {
+ if( !$wgAllowSysopQueries ) {
+ $wgOut->errorpage( "nosuchspecialpage", "nospecialpagetext" );
+ return;
+ }
+ if( !$wgUser->isSysop() ) {
$wgOut->sysopRequired();
return;
}
- $fields = array( "wpSqlQuery" );
- wfCleanFormFields( $fields );
- $f = new SqlQueryForm();
+
+ if( $wgRequest->wasPosted() ) {
+ $query = $wgRequest->getVal( 'wpSqlQuery' );
+ $action = $wgRequest->getVal( 'action' );
+ } else {
+ $query = "";
+ $action = "";
+ }
+ $f = new SqlQueryForm( $query);
- if ( "submit" == $action ) { $f->doSubmit(); }
- else { $f->showForm( "" ); }
+ if ( "submit" == $action ) {
+ $f->doSubmit();
+ } else {
+ $f->showForm( "" );
+ }
}
class SqlQueryForm {
-
+ var $query = "";
+
+ function SqlQueryForm( $query ) {
+ $this->query = $query;
+ }
+
function showForm( $err )
{
global $wgOut, $wgUser, $wgLang;
- global $wpSqlQuery;
global $wgLogQueries;
- $wpSqlQuery = $_REQUEST["wpSqlQuery"];
$wgOut->setPagetitle( wfMsg( "asksql" ) );
$note = wfMsg( "asksqltext" );
if ( "" != $err ) {
$wgOut->addHTML( "<p><font color='red' size='+1'>" . htmlspecialchars($err) . "</font>\n" );
}
- if ( ! $wpSqlQuery ) { $wpSqlQuery = "SELECT ... FROM ... WHERE ..."; }
+ if ( ! $this->query ) { $this->query = "SELECT ... FROM ... WHERE ..."; }
$q = wfMsg( "sqlquery" );
$qb = wfMsg( "querybtn" );
- $action = wfLocalUrlE( $wgLang->specialPage( "Asksql" ),
- "action=submit" );
+ $titleObj = Title::makeTitle( NS_SPECIAL, "Asksql" );
+ $action = $titleObj->escapeLocalURL( "action=submit" );
$wgOut->addHTML( "<p>
<form id=\"asksql\" method=\"post\" action=\"{$action}\">
<td align=right>{$q}:</td>
<td align=left>
<textarea name=\"wpSqlQuery\" cols=80 rows=4 wrap=\"virtual\">"
-. htmlspecialchars($wpSqlQuery) ."
+. htmlspecialchars($this->query) ."
</textarea>
</td>
</tr><tr>
function doSubmit()
{
global $wgOut, $wgUser, $wgServer, $wgScript, $wgArticlePath, $wgLang;
- global $wpSqlQuery;
- global $wgDBsqluser, $wgDBsqlpassword;
- $wpSqlQuery = $_REQUEST["wpSqlQuery"];
+ global $wgDBserver, $wgDBsqluser, $wgDBsqlpassword, $wgDBname, $wgSqlTimeout;
# Use a limit, folks!
- $wpSqlQuery = trim( $wpSqlQuery );
- if( preg_match( "/^SELECT/i", $wpSqlQuery )
- and !preg_match( "/LIMIT/i", $wpSqlQuery ) ) {
- $wpSqlQuery .= " LIMIT 100";
+ $this->query = trim( $this->query );
+ if( preg_match( "/^SELECT/i", $this->query )
+ and !preg_match( "/LIMIT/i", $this->query ) ) {
+ $this->query .= " LIMIT 100";
}
- if ( ! $wgUser->isDeveloper() ) {
- $connection = wfGetDB( $wgDBsqluser, $wgDBsqlpassword );
- }
- $this->logQuery( $wpSqlQuery );
- $res = wfQuery( $wpSqlQuery, DB_WRITE, "SpecialAsksql::doSubmit" );
+ $conn = Database::newFromParams( $wgDBserver, $wgDBsqluser, $wgDBsqlpassword, $wgDBname );
+
+ $this->logQuery( $this->query );
+
+ # Start timer, will kill the DB thread in $wgSqlTimeout seconds
+ $conn->startTimer( $wgSqlTimeout );
+ $res = $conn->query( $this->query, "SpecialAsksql::doSubmit" );
+ $conn->stopTimer();
$this->logFinishedQuery();
$n = 0;
- @$n = wfNumFields( $res );
+ @$n = $conn->numFields( $res );
$titleList = false;
if ( $n ) {
$k = array();
for ( $x = 0; $x < $n; ++$x ) {
- array_push( $k, wfFieldName( $res, $x ) );
+ array_push( $k, $conn->fieldName( $res, $x ) );
}
if ( $n == 2 && in_array( "cur_title", $k ) && in_array( "cur_namespace", $k ) ) {
}
$a = array();
- while ( $s = wfFetchObject( $res ) ) {
+ while ( $s = $conn->fetchObject( $res ) ) {
array_push( $a, $s );
}
- wfFreeResult( $res );
+ $conn->freeResult( $res );
if ( $titleList ) {
$r = "";
foreach ( $a as $y ) {
- $o = "<a href=\"" . wfLocalUrlE($o) . "\" class='internal'>" .
- htmlspecialchars( $y->$x ) . "</a>" ;
$sTitle = htmlspecialchars( $y->cur_title );
if ( $y->cur_namespace ) {
$sNamespace = $wgLang->getNsText( $y->cur_namespace );
" query by " . $wgUser->getName() .
":\n$q\n" );
fclose( $f );
- $this->starttime = microtime();
+ $this->starttime = wfTime();
}
function logFinishedQuery() {
global $wgSqlLogFile, $wgLogQueries;
if(!$wgLogQueries) return;
- list($sec, $usec) = explode( " ", microtime() );
- list($sec1, $usec1) = explode( " ", $this->starttime );
- $interval = ($sec + $usec) - ($sec1 + $usec1);
+ $interval = wfTime() - $this->starttime;
$f = fopen( $wgSqlLogFile, "a" );
fputs( $f, "finished at " . wfTimestampNow() . "; took $interval secs\n" );