X-Git-Url: http://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2FBlock.php;h=f97cabce15a2e23b0056f7897478b350d5f5c270;hb=539ad2c8e06aceae4afa6e86a4b676c5ca0a909a;hp=e8a53e0efdd36a08de7dfa440190a6898f788f2a;hpb=27fda7446fa3c9abf0b3ff462cf9aa6cf91abf6e;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/Block.php b/includes/Block.php index e8a53e0efd..f97cabce15 100644 --- a/includes/Block.php +++ b/includes/Block.php @@ -1,19 +1,30 @@ mUser = $user; $this->mBy = $by; $this->mReason = $reason; - $this->mTimestamp = $timestamp; + $this->mTimestamp = wfTimestamp(TS_MW,$timestamp); $this->mAuto = $auto; - $this->mExpiry = $expiry; - + if( empty( $expiry ) ) { + $this->mExpiry = $expiry; + } else { + $this->mExpiry = wfTimestamp( TS_MW, $expiry ); + } + + $this->mForUpdate = false; $this->initialiseRange(); } @@ -42,31 +58,51 @@ class Block $mUser = $mBy = 0; } - # Get a ban from the DB, with either the given address or the given username - function load( $address = "", $user = 0, $killExpired = true ) + /** + * Get a ban from the DB, with either the given address or the given username + */ + function load( $address = '', $user = 0, $killExpired = true ) { + global $wgDBmysql4 ; $fname = 'Block::load'; + wfDebug( "Block::load: '$address', '$user', $killExpired\n" ); + $ret = false; $killed = false; - - if ( 0 == $user && $address=="" ) { - $sql = "SELECT * from ipblocks"; + if ( $this->forUpdate() ) { + $db =& wfGetDB( DB_MASTER ); + $options = 'FOR UPDATE'; + } else { + $db =& wfGetDB( DB_SLAVE ); + $options = ''; + } + $ipblocks = $db->tableName( 'ipblocks' ); + + if ( 0 == $user && $address=='' ) { + $sql = "SELECT * from $ipblocks $options"; } elseif ($address=="") { - $sql = "SELECT * FROM ipblocks WHERE ipb_user={$user}"; + $sql = "SELECT * FROM $ipblocks WHERE ipb_user={$user} $options"; } elseif ($user=="") { - $sql = "SELECT * FROM ipblocks WHERE ipb_address='" . wfStrencode( $address ) . "'"; + $sql = "SELECT * FROM $ipblocks WHERE ipb_address='" . $db->strencode( $address ) . "' $options"; + } elseif ( $options=='' && $wgDBmysql4 ) { + # If there are no optiones (e.g. FOR UPDATE), use a UNION + # so that the query can make efficient use of indices + $sql = "SELECT * FROM $ipblocks WHERE ipb_address='" . $db->strencode( $address ) . + "' UNION SELECT * FROM $ipblocks WHERE ipb_user={$user}"; } else { - $sql = "SELECT * FROM ipblocks WHERE (ipb_address='" . wfStrencode( $address ) . - "' OR ipb_user={$user})"; + # If there are options, a UNION can not be used, use one + # SELECT instead. Will do a full table scan. + $sql = "SELECT * FROM $ipblocks WHERE (ipb_address='" . $db->strencode( $address ) . + "' OR ipb_user={$user}) $options"; } - $res = wfQuery( $sql, DB_READ, $fname ); - if ( 0 == wfNumRows( $res ) ) { + $res = $db->query( $sql, $fname ); + if ( 0 == $db->numRows( $res ) ) { # User is not blocked $this->clear(); } else { # Get first block - $row = wfFetchObject( $res ); + $row = $db->fetchObject( $res ); $this->initFromRow( $row ); if ( $killExpired ) { @@ -74,7 +110,7 @@ class Block do { $killed = $this->deleteIfExpired(); if ( $killed ) { - $row = wfFetchObject( $res ); + $row = $db->fetchObject( $res ); if ( $row ) { $this->initFromRow( $row ); } @@ -92,7 +128,7 @@ class Block $ret = true; } } - wfFreeResult( $res ); + $db->freeResult( $res ); return $ret; } @@ -100,12 +136,14 @@ class Block { $this->mAddress = $row->ipb_address; $this->mReason = $row->ipb_reason; - $this->mTimestamp = $row->ipb_timestamp; + $this->mTimestamp = wfTimestamp(TS_MW,$row->ipb_timestamp); $this->mUser = $row->ipb_user; $this->mBy = $row->ipb_by; $this->mAuto = $row->ipb_auto; $this->mId = $row->ipb_id; - $this->mExpiry = $row->ipb_expiry; + $this->mExpiry = $row->ipb_expiry ? + wfTimestamp(TS_MW,$row->ipb_expiry) : + $row->ipb_expiry; $this->initialiseRange(); } @@ -126,16 +164,28 @@ class Block } } - # Callback with a Block object for every block - /*static*/ function enumBlocks( $callback, $tag, $killExpired = true ) + /** + * Callback with a Block object for every block + */ + /*static*/ function enumBlocks( $callback, $tag, $flags = 0 ) { - $sql = 'SELECT * FROM ipblocks ORDER BY ipb_timestamp DESC'; - $res = wfQuery( $sql, DB_READ, 'Block::enumBans' ); $block = new Block(); + if ( $flags & EB_FOR_UPDATE ) { + $db =& wfGetDB( DB_MASTER ); + $options = 'FOR UPDATE'; + $block->forUpdate( true ); + } else { + $db =& wfGetDB( DB_SLAVE ); + $options = ''; + } + $ipblocks = $db->tableName( 'ipblocks' ); + + $sql = "SELECT * FROM $ipblocks ORDER BY ipb_timestamp DESC $options"; + $res = $db->query( $sql, 'Block::enumBans' ); - while ( $row = wfFetchObject( $res ) ) { + while ( $row = $db->fetchObject( $res ) ) { $block->initFromRow( $row ); - if ( $killExpired ) { + if ( !( $flags & EB_KEEP_EXPIRED ) ) { if ( !$block->deleteIfExpired() ) { $callback( $block, $tag ); } @@ -149,24 +199,37 @@ class Block function delete() { $fname = 'Block::delete'; - if ( $this->mAddress == "" ) { - $sql = "DELETE FROM ipblocks WHERE ipb_id={$this->mId}"; - } else { - $sql = "DELETE FROM ipblocks WHERE ipb_address='" . - wfStrencode( $this->mAddress ) . "'"; + if (wfReadOnly()) { + return; } - wfQuery( $sql, DB_WRITE, 'Block::delete' ); + $dbw =& wfGetDB( DB_MASTER ); + if ( $this->mAddress == '' ) { + $condition = array( 'ipb_id' => $this->mId ); + } else { + $condition = array( 'ipb_address' => $this->mAddress ); + } + $dbw->delete( 'ipblocks', $condition, $fname ); $this->clearCache(); } function insert() { - $sql = 'INSERT INTO ipblocks ' . - '(ipb_address, ipb_user, ipb_by, ipb_reason, ipb_timestamp, ipb_auto, ipb_expiry )' . - "VALUES ('" . wfStrencode( $this->mAddress ) . "', {$this->mUser}, {$this->mBy}, '" . - wfStrencode( $this->mReason ) . "','{$this->mTimestamp}', {$this->mAuto}, '{$this->mExpiry}')"; - wfQuery( $sql, DB_WRITE, 'Block::insert' ); + wfDebug( "Block::insert; timestamp {$this->mTimestamp}\n" ); + $dbw =& wfGetDB( DB_MASTER ); + $dbw->insert( 'ipblocks', + array( + 'ipb_address' => $this->mAddress, + 'ipb_user' => $this->mUser, + 'ipb_by' => $this->mBy, + 'ipb_reason' => $this->mReason, + 'ipb_timestamp' => $dbw->timestamp($this->mTimestamp), + 'ipb_auto' => $this->mAuto, + 'ipb_expiry' => $this->mExpiry ? + $dbw->timestamp($this->mExpiry) : + $this->mExpiry, + ), 'Block::insert' + ); $this->clearCache(); } @@ -174,15 +237,18 @@ class Block function deleteIfExpired() { if ( $this->isExpired() ) { + wfDebug( "Block::deleteIfExpired() -- deleting\n" ); $this->delete(); return true; } else { + wfDebug( "Block::deleteIfExpired() -- not expired\n" ); return false; } } function isExpired() { + wfDebug( "Block::isExpired() checking current " . wfTimestampNow() . " vs $this->mExpiry\n" ); if ( !$this->mExpiry ) { return false; } else { @@ -198,13 +264,18 @@ class Block function updateTimestamp() { if ( $this->mAuto ) { - $this->mTimestamp = wfTimestampNow(); + $this->mTimestamp = wfTimestamp(); $this->mExpiry = Block::getAutoblockExpiry( $this->mTimestamp ); - wfQuery( 'UPDATE ipblocks SET ' . - "ipb_timestamp='" . $this->mTimestamp . "', " . - "ipb_expiry='" . $this->mExpiry . "' " . - "WHERE ipb_address='" . wfStrencode( $this->mAddress ) . "'", DB_WRITE, 'Block::updateTimestamp' ); + $dbw =& wfGetDB( DB_MASTER ); + $dbw->update( 'ipblocks', + array( /* SET */ + 'ipb_timestamp' => $dbw->timestamp($this->mTimestamp), + 'ipb_expiry' => $dbw->timestamp($this->mExpiry), + ), array( /* WHERE */ + 'ipb_address' => $this->mAddress + ), 'Block::updateTimestamp' + ); $this->clearCache(); } @@ -214,7 +285,7 @@ class Block { global $wgBlockCache; if ( is_object( $wgBlockCache ) ) { - $wgBlockCache->clear(); + $wgBlockCache->loadFromDB(); } } @@ -228,10 +299,14 @@ class Block return $this->mNetworkBits; } + function forUpdate( $x = NULL ) { + return wfSetVar( $this->mForUpdate, $x ); + } + /* static */ function getAutoblockExpiry( $timestamp ) { global $wgAutoblockExpiry; - return wfUnix2Timestamp( wfTimestamp2Unix( $timestamp ) + $wgAutoblockExpiry ); + return wfTimestamp( TS_MW, wfTimestamp( TS_UNIX, $timestamp ) + $wgAutoblockExpiry ); } /* static */ function normaliseRange( $range )