X-Git-Url: https://scripts.mit.edu/gitweb/autoinstalls/mediawiki.git/blobdiff_plain/8989532d3de45b196373107c7a812a68ac0ff2d9..d75ce11339b35963b5f8c3d53190819c1c025716:/includes/BagOStuff.php diff --git a/includes/BagOStuff.php b/includes/BagOStuff.php index ffa8a0bb..ac0263d8 100644 --- a/includes/BagOStuff.php +++ b/includes/BagOStuff.php @@ -32,134 +32,129 @@ * backends for local hash array and SQL table included: * * $bag = new HashBagOStuff(); - * $bag = new MediaWikiBagOStuff($tablename); # connect to db first + * $bag = new SqlBagOStuff(); # connect to db first * * * @ingroup Cache */ -class BagOStuff { - var $debugmode; +abstract class BagOStuff { + var $debugMode = false; - function __construct() { - $this->set_debug( false ); - } - - function set_debug($bool) { - $this->debugmode = $bool; + public function set_debug( $bool ) { + $this->debugMode = $bool; } /* *** THE GUTS OF THE OPERATION *** */ /* Override these with functional things in subclasses */ - function get($key) { - /* stub */ - return false; - } + /** + * Get an item with the given key. Returns false if it does not exist. + * @param $key string + */ + abstract public function get( $key ); - function set($key, $value, $exptime=0) { - /* stub */ - return false; - } + /** + * Set an item. + * @param $key string + * @param $value mixed + * @param $exptime int Either an interval in seconds or a unix timestamp for expiry + */ + abstract public function set( $key, $value, $exptime = 0 ); - function delete($key, $time=0) { - /* stub */ - return false; - } + /* + * Delete an item. + * @param $key string + * @param $time int Amount of time to delay the operation (mostly memcached-specific) + */ + abstract public function delete( $key, $time = 0 ); - function lock($key, $timeout = 0) { + public function lock( $key, $timeout = 0 ) { /* stub */ return true; } - function unlock($key) { + public function unlock( $key ) { /* stub */ return true; } - function keys() { + public function keys() { /* stub */ return array(); } /* *** Emulated functions *** */ /* Better performance can likely be got with custom written versions */ - function get_multi($keys) { + public function get_multi( $keys ) { $out = array(); - foreach($keys as $key) - $out[$key] = $this->get($key); + + foreach ( $keys as $key ) { + $out[$key] = $this->get( $key ); + } + return $out; } - function set_multi($hash, $exptime=0) { - foreach($hash as $key => $value) - $this->set($key, $value, $exptime); + public function set_multi( $hash, $exptime = 0 ) { + foreach ( $hash as $key => $value ) { + $this->set( $key, $value, $exptime ); + } } - function add($key, $value, $exptime=0) { - if( $this->get($key) == false ) { - $this->set($key, $value, $exptime); + public function add( $key, $value, $exptime = 0 ) { + if ( $this->get( $key ) == false ) { + $this->set( $key, $value, $exptime ); return true; } } - function add_multi($hash, $exptime=0) { - foreach($hash as $key => $value) - $this->add($key, $value, $exptime); + public function add_multi( $hash, $exptime = 0 ) { + foreach ( $hash as $key => $value ) { + $this->add( $key, $value, $exptime ); + } } - function delete_multi($keys, $time=0) { - foreach($keys as $key) - $this->delete($key, $time); + public function delete_multi( $keys, $time = 0 ) { + foreach ( $keys as $key ) { + $this->delete( $key, $time ); + } } - function replace($key, $value, $exptime=0) { - if( $this->get($key) !== false ) - $this->set($key, $value, $exptime); + public function replace( $key, $value, $exptime = 0 ) { + if ( $this->get( $key ) !== false ) { + $this->set( $key, $value, $exptime ); + } } - function incr($key, $value=1) { - if ( !$this->lock($key) ) { + public function incr( $key, $value = 1 ) { + if ( !$this->lock( $key ) ) { return false; } - $value = intval($value); - if($value < 0) $value = 0; + $value = intval( $value ); $n = false; - if( ($n = $this->get($key)) !== false ) { + if ( ( $n = $this->get( $key ) ) !== false ) { $n += $value; - $this->set($key, $n); // exptime? + $this->set( $key, $n ); // exptime? } - $this->unlock($key); + $this->unlock( $key ); return $n; } - function decr($key, $value=1) { - if ( !$this->lock($key) ) { - return false; - } - $value = intval($value); - if($value < 0) $value = 0; - - $m = false; - if( ($n = $this->get($key)) !== false ) { - $m = $n - $value; - if($m < 0) $m = 0; - $this->set($key, $m); // exptime? - } - $this->unlock($key); - return $m; + public function decr( $key, $value = 1 ) { + return $this->incr( $key, - $value ); } - function _debug($text) { - if($this->debugmode) - wfDebug("BagOStuff debug: $text\n"); + public function debug( $text ) { + if ( $this->debugMode ) + wfDebug( "BagOStuff debug: $text\n" ); } /** * Convert an optionally relative time to an absolute time */ - static function convertExpiry( $exptime ) { - if(($exptime != 0) && ($exptime < 3600*24*30)) { + protected function convertExpiry( $exptime ) { + if ( ( $exptime != 0 ) && ( $exptime < 3600 * 24 * 30 ) ) { return time() + $exptime; } else { return $exptime; @@ -167,7 +162,6 @@ class BagOStuff { } } - /** * Functional versions! * This is a test of the interface, mainly. It stores things in an associative @@ -182,30 +176,34 @@ class HashBagOStuff extends BagOStuff { $this->bag = array(); } - function _expire($key) { + protected function expire( $key ) { $et = $this->bag[$key][1]; - if(($et == 0) || ($et > time())) + if ( ( $et == 0 ) || ( $et > time() ) ) { return false; - $this->delete($key); + } + $this->delete( $key ); return true; } - function get($key) { - if(!$this->bag[$key]) + function get( $key ) { + if ( !isset( $this->bag[$key] ) ) { return false; - if($this->_expire($key)) + } + if ( $this->expire( $key ) ) { return false; + } return $this->bag[$key][0]; } - function set($key,$value,$exptime=0) { - $this->bag[$key] = array( $value, BagOStuff::convertExpiry( $exptime ) ); + function set( $key, $value, $exptime = 0 ) { + $this->bag[$key] = array( $value, $this->convertExpiry( $exptime ) ); } - function delete($key,$time=0) { - if(!$this->bag[$key]) + function delete( $key, $time = 0 ) { + if ( !isset( $this->bag[$key] ) ) { return false; - unset($this->bag[$key]); + } + unset( $this->bag[$key] ); return true; } @@ -215,182 +213,196 @@ class HashBagOStuff extends BagOStuff { } /** - * Generic class to store objects in a database + * Class to store objects in the database * * @ingroup Cache */ -abstract class SqlBagOStuff extends BagOStuff { - var $table; - var $lastexpireall = 0; +class SqlBagOStuff extends BagOStuff { + var $lb, $db; + var $lastExpireAll = 0; - /** - * Constructor - * - * @param $tablename String: name of the table to use - */ - function __construct($tablename = 'objectcache') { - $this->table = $tablename; + protected function getDB() { + global $wgDBtype; + if ( !isset( $this->db ) ) { + /* We must keep a separate connection to MySQL in order to avoid deadlocks + * However, SQLite has an opposite behaviour. + * @todo Investigate behaviour for other databases + */ + if ( $wgDBtype == 'sqlite' ) { + $this->db = wfGetDB( DB_MASTER ); + } else { + $this->lb = wfGetLBFactory()->newMainLB(); + $this->db = $this->lb->getConnection( DB_MASTER ); + $this->db->clearFlag( DBO_TRX ); + } + } + return $this->db; } - function get($key) { - /* expire old entries if any */ + public function get( $key ) { + # expire old entries if any $this->garbageCollect(); - - $res = $this->_query( - "SELECT value,exptime FROM $0 WHERE keyname='$1'", $key); - if(!$res) { - $this->_debug("get: ** error: " . $this->_dberror($res) . " **"); + $db = $this->getDB(); + $row = $db->selectRow( 'objectcache', array( 'value', 'exptime' ), + array( 'keyname' => $key ), __METHOD__ ); + if ( !$row ) { + $this->debug( 'get: no matching rows' ); return false; } - if($row=$this->_fetchobject($res)) { - $this->_debug("get: retrieved data; exp time is " . $row->exptime); - if ( $row->exptime != $this->_maxdatetime() && - wfTimestamp( TS_UNIX, $row->exptime ) < time() ) - { - $this->_debug("get: key has expired, deleting"); - $this->delete($key); - return false; + + $this->debug( "get: retrieved data; expiry time is " . $row->exptime ); + if ( $this->isExpired( $row->exptime ) ) { + $this->debug( "get: key has expired, deleting" ); + try { + $db->begin(); + # Put the expiry time in the WHERE condition to avoid deleting a + # newly-inserted value + $db->delete( 'objectcache', + array( + 'keyname' => $key, + 'exptime' => $row->exptime + ), __METHOD__ ); + $db->commit(); + } catch ( DBQueryError $e ) { + $this->handleWriteError( $e ); } - return $this->_unserialize($this->_blobdecode($row->value)); - } else { - $this->_debug('get: no matching rows'); + return false; } - return false; + return $this->unserialize( $db->decodeBlob( $row->value ) ); } - function set($key,$value,$exptime=0) { - if ( $this->_readonly() ) { - return false; - } - $exptime = intval($exptime); - if($exptime < 0) $exptime = 0; - if($exptime == 0) { - $exp = $this->_maxdatetime(); + public function set( $key, $value, $exptime = 0 ) { + $db = $this->getDB(); + $exptime = intval( $exptime ); + if ( $exptime < 0 ) $exptime = 0; + if ( $exptime == 0 ) { + $encExpiry = $this->getMaxDateTime(); } else { - if($exptime < 3.16e8) # ~10 years + if ( $exptime < 3.16e8 ) # ~10 years $exptime += time(); - $exp = $this->_fromunixtime($exptime); + $encExpiry = $db->timestamp( $exptime ); } - $this->_begin(); - $this->_query( - "DELETE FROM $0 WHERE keyname='$1'", $key ); - $this->_doinsert($this->getTableName(), array( + try { + $db->begin(); + $db->delete( 'objectcache', array( 'keyname' => $key ), __METHOD__ ); + $db->insert( 'objectcache', + array( 'keyname' => $key, - 'value' => $this->_blobencode($this->_serialize($value)), - 'exptime' => $exp - )); - $this->_commit(); - return true; /* ? */ + 'value' => $db->encodeBlob( $this->serialize( $value ) ), + 'exptime' => $encExpiry + ), __METHOD__ ); + $db->commit(); + } catch ( DBQueryError $e ) { + $this->handleWriteError( $e ); + return false; + } + return true; } - function delete($key,$time=0) { - if ( $this->_readonly() ) { + public function delete( $key, $time = 0 ) { + $db = $this->getDB(); + try { + $db->begin(); + $db->delete( 'objectcache', array( 'keyname' => $key ), __METHOD__ ); + $db->commit(); + } catch ( DBQueryError $e ) { + $this->handleWriteError( $e ); return false; } - $this->_begin(); - $this->_query( - "DELETE FROM $0 WHERE keyname='$1'", $key ); - $this->_commit(); - return true; /* ? */ + return true; } - function keys() { - $res = $this->_query( "SELECT keyname FROM $0" ); - if(!$res) { - $this->_debug("keys: ** error: " . $this->_dberror($res) . " **"); - return array(); + public function incr( $key, $step = 1 ) { + $db = $this->getDB(); + $step = intval( $step ); + + try { + $db->begin(); + $row = $db->selectRow( 'objectcache', array( 'value', 'exptime' ), + array( 'keyname' => $key ), __METHOD__, array( 'FOR UPDATE' ) ); + if ( $row === false ) { + // Missing + $db->commit(); + return false; + } + $db->delete( 'objectcache', array( 'keyname' => $key ), __METHOD__ ); + if ( $this->isExpired( $row->exptime ) ) { + // Expired, do not reinsert + $db->commit(); + return false; + } + + $oldValue = intval( $this->unserialize( $db->decodeBlob( $row->value ) ) ); + $newValue = $oldValue + $step; + $db->insert( 'objectcache', + array( + 'keyname' => $key, + 'value' => $db->encodeBlob( $this->serialize( $newValue ) ), + 'exptime' => $row->exptime + ), __METHOD__ ); + $db->commit(); + } catch ( DBQueryError $e ) { + $this->handleWriteError( $e ); + return false; } + return $newValue; + } + + public function keys() { + $db = $this->getDB(); + $res = $db->select( 'objectcache', array( 'keyname' ), false, __METHOD__ ); $result = array(); - while( $row = $this->_fetchobject($res) ) { + foreach ( $res as $row ) { $result[] = $row->keyname; } return $result; } - function getTableName() { - return $this->table; + protected function isExpired( $exptime ) { + return $exptime != $this->getMaxDateTime() && wfTimestamp( TS_UNIX, $exptime ) < time(); } - function _query($sql) { - $reps = func_get_args(); - $reps[0] = $this->getTableName(); - // ewwww - for($i=0;$i 0 ? $this->_strencode($reps[$i]) : $reps[$i], - $sql); - } - $res = $this->_doquery($sql); - if($res == false) { - $this->_debug('query failed: ' . $this->_dberror($res)); + protected function getMaxDateTime() { + if ( time() > 0x7fffffff ) { + return $this->getDB()->timestamp( 1 << 62 ); + } else { + return $this->getDB()->timestamp( 0x7fffffff ); } - return $res; - } - - function _strencode($str) { - /* Protect strings in SQL */ - return str_replace( "'", "''", $str ); - } - function _blobencode($str) { - return $str; - } - function _blobdecode($str) { - return $str; - } - - abstract function _doinsert($table, $vals); - abstract function _doquery($sql); - - abstract function _readonly(); - - function _begin() {} - function _commit() {} - - function _freeresult($result) { - /* stub */ - return false; } - function _dberror($result) { - /* stub */ - return 'unknown error'; - } - - abstract function _maxdatetime(); - abstract function _fromunixtime($ts); - - function garbageCollect() { + protected function garbageCollect() { /* Ignore 99% of requests */ if ( !mt_rand( 0, 100 ) ) { - $nowtime = time(); + $now = time(); /* Avoid repeating the delete within a few seconds */ - if ( $nowtime > ($this->lastexpireall + 1) ) { - $this->lastexpireall = $nowtime; - $this->expireall(); + if ( $now > ( $this->lastExpireAll + 1 ) ) { + $this->lastExpireAll = $now; + $this->expireAll(); } } } - function expireall() { - /* Remove any items that have expired */ - if ( $this->_readonly() ) { - return false; + public function expireAll() { + $db = $this->getDB(); + $now = $db->timestamp(); + try { + $db->begin(); + $db->delete( 'objectcache', array( 'exptime < ' . $db->addQuotes( $now ) ), __METHOD__ ); + $db->commit(); + } catch ( DBQueryError $e ) { + $this->handleWriteError( $e ); } - $now = $this->_fromunixtime( time() ); - $this->_begin(); - $this->_query( "DELETE FROM $0 WHERE exptime < '$now'" ); - $this->_commit(); } - function deleteall() { - /* Clear *all* items from cache table */ - if ( $this->_readonly() ) { - return false; + public function deleteAll() { + $db = $this->getDB(); + try { + $db->begin(); + $db->delete( 'objectcache', '*', __METHOD__ ); + $db->commit(); + } catch ( DBQueryError $e ) { + $this->handleWriteError( $e ); } - $this->_begin(); - $this->_query( "DELETE FROM $0" ); - $this->_commit(); } /** @@ -401,9 +413,9 @@ abstract class SqlBagOStuff extends BagOStuff { * @param $data mixed * @return string */ - function _serialize( &$data ) { + protected function serialize( &$data ) { $serial = serialize( $data ); - if( function_exists( 'gzdeflate' ) ) { + if ( function_exists( 'gzdeflate' ) ) { return gzdeflate( $serial ); } else { return $serial; @@ -415,156 +427,39 @@ abstract class SqlBagOStuff extends BagOStuff { * @param $serial string * @return mixed */ - function _unserialize( $serial ) { - if( function_exists( 'gzinflate' ) ) { + protected function unserialize( $serial ) { + if ( function_exists( 'gzinflate' ) ) { $decomp = @gzinflate( $serial ); - if( false !== $decomp ) { + if ( false !== $decomp ) { $serial = $decomp; } } $ret = unserialize( $serial ); return $ret; } -} -/** - * Stores objects in the main database of the wiki - * - * @ingroup Cache - */ -class MediaWikiBagOStuff extends SqlBagOStuff { - var $tableInitialised = false; - var $lb, $db; - - function _getDB(){ - global $wgDBtype; - if ( !isset( $this->db ) ) { - /* We must keep a separate connection to MySQL in order to avoid deadlocks - * However, SQLite has an opposite behaviour. - * @todo Investigate behaviour for other databases - */ - if ( $wgDBtype == 'sqlite' ) { - $this->db = wfGetDB( DB_MASTER ); - } else { - $this->lb = wfGetLBFactory()->newMainLB(); - $this->db = $this->lb->getConnection( DB_MASTER ); - $this->db->clearFlag( DBO_TRX ); - } - } - return $this->db; - } - function _begin() { - $this->_getDB()->begin(); - } - function _commit() { - $this->_getDB()->commit(); - } - function _doquery($sql) { - return $this->_getDB()->query( $sql, __METHOD__ ); - } - function _doinsert($t, $v) { - return $this->_getDB()->insert($t, $v, __METHOD__, array( 'IGNORE' ) ); - } - function _fetchobject($result) { - return $this->_getDB()->fetchObject($result); - } - function _freeresult($result) { - return $this->_getDB()->freeResult($result); - } - function _dberror($result) { - return $this->_getDB()->lastError(); - } - function _maxdatetime() { - if ( time() > 0x7fffffff ) { - return $this->_fromunixtime( 1<<62 ); - } else { - return $this->_fromunixtime( 0x7fffffff ); - } - } - function _fromunixtime($ts) { - return $this->_getDB()->timestamp($ts); - } - /*** - * Note -- this should *not* check wfReadOnly(). - * Read-only mode has been repurposed from the original - * "nothing must write to the database" to "users should not - * be able to edit or alter anything user-visible". - * - * Backend bits like the object cache should continue - * to work in this mode, otherwise things will blow up - * like the message cache failing to save its state, - * causing long delays (bug 11533). + /** + * Handle a DBQueryError which occurred during a write operation. + * Ignore errors which are due to a read-only database, rethrow others. */ - function _readonly(){ - return false; - } - function _strencode($s) { - return $this->_getDB()->strencode($s); - } - function _blobencode($s) { - return $this->_getDB()->encodeBlob($s); - } - function _blobdecode($s) { - return $this->_getDB()->decodeBlob($s); - } - function getTableName() { - if ( !$this->tableInitialised ) { - $dbw = $this->_getDB(); - /* This is actually a hack, we should be able - to use Language classes here... or not */ - if (!$dbw) - throw new MWException("Could not connect to database"); - $this->table = $dbw->tableName( $this->table ); - $this->tableInitialised = true; + protected function handleWriteError( $exception ) { + $db = $this->getDB(); + if ( !$db->wasReadOnlyError() ) { + throw $exception; } - return $this->table; + try { + $db->rollback(); + } catch ( DBQueryError $e ) { + } + wfDebug( __METHOD__ . ": ignoring query error\n" ); + $db->ignoreErrors( false ); } } /** - * This is a wrapper for Turck MMCache's shared memory functions. - * - * You can store objects with mmcache_put() and mmcache_get(), but Turck seems - * to use a weird custom serializer that randomly segfaults. So we wrap calls - * with serialize()/unserialize(). - * - * The thing I noticed about the Turck serialized data was that unlike ordinary - * serialize(), it contained the names of methods, and judging by the amount of - * binary data, perhaps even the bytecode of the methods themselves. It may be - * that Turck's serializer is faster, so a possible future extension would be - * to use it for arrays but not for objects. - * - * @ingroup Cache + * Backwards compatibility alias */ -class TurckBagOStuff extends BagOStuff { - function get($key) { - $val = mmcache_get( $key ); - if ( is_string( $val ) ) { - $val = unserialize( $val ); - } - return $val; - } - - function set($key, $value, $exptime=0) { - mmcache_put( $key, serialize( $value ), $exptime ); - return true; - } - - function delete($key, $time=0) { - mmcache_rm( $key ); - return true; - } - - function lock($key, $waitTimeout = 0 ) { - mmcache_lock( $key ); - return true; - } - - function unlock($key) { - mmcache_unlock( $key ); - return true; - } -} +class MediaWikiBagOStuff extends SqlBagOStuff { } /** * This is a wrapper for APC's shared memory functions @@ -572,36 +467,45 @@ class TurckBagOStuff extends BagOStuff { * @ingroup Cache */ class APCBagOStuff extends BagOStuff { - function get($key) { - $val = apc_fetch($key); + public function get( $key ) { + $val = apc_fetch( $key ); if ( is_string( $val ) ) { $val = unserialize( $val ); } return $val; } - function set($key, $value, $exptime=0) { - apc_store($key, serialize($value), $exptime); + public function set( $key, $value, $exptime = 0 ) { + apc_store( $key, serialize( $value ), $exptime ); return true; } - function delete($key, $time=0) { - apc_delete($key); + public function delete( $key, $time = 0 ) { + apc_delete( $key ); return true; } -} + public function keys() { + $info = apc_cache_info( 'user' ); + $list = $info['cache_list']; + $keys = array(); + foreach ( $list as $entry ) { + $keys[] = $entry['info']; + } + return $keys; + } +} /** * This is a wrapper for eAccelerator's shared memory functions. * - * This is basically identical to the Turck MMCache version, + * This is basically identical to the deceased Turck MMCache version, * mostly because eAccelerator is based on Turck MMCache. * * @ingroup Cache */ class eAccelBagOStuff extends BagOStuff { - function get($key) { + public function get( $key ) { $val = eaccelerator_get( $key ); if ( is_string( $val ) ) { $val = unserialize( $val ); @@ -609,22 +513,22 @@ class eAccelBagOStuff extends BagOStuff { return $val; } - function set($key, $value, $exptime=0) { + public function set( $key, $value, $exptime = 0 ) { eaccelerator_put( $key, serialize( $value ), $exptime ); return true; } - function delete($key, $time=0) { + public function delete( $key, $time = 0 ) { eaccelerator_rm( $key ); return true; } - function lock($key, $waitTimeout = 0 ) { + public function lock( $key, $waitTimeout = 0 ) { eaccelerator_lock( $key ); return true; } - function unlock($key) { + public function unlock( $key ) { eaccelerator_unlock( $key ); return true; } @@ -646,7 +550,7 @@ class XCacheBagOStuff extends BagOStuff { */ public function get( $key ) { $val = xcache_get( $key ); - if( is_string( $val ) ) + if ( is_string( $val ) ) $val = unserialize( $val ); return $val; } @@ -675,25 +579,29 @@ class XCacheBagOStuff extends BagOStuff { xcache_unset( $key ); return true; } - } /** - * @todo document + * Cache that uses DBA as a backend. + * Slow due to the need to constantly open and close the file to avoid holding + * writer locks. Intended for development use only, as a memcached workalike + * for systems that don't have it. + * * @ingroup Cache */ class DBABagOStuff extends BagOStuff { var $mHandler, $mFile, $mReader, $mWriter, $mDisabled; - function __construct( $handler = 'db3', $dir = false ) { + public function __construct( $dir = false ) { + global $wgDBAhandler; if ( $dir === false ) { global $wgTmpDirectory; $dir = $wgTmpDirectory; } $this->mFile = "$dir/mw-cache-" . wfWikiID(); $this->mFile .= '.db'; - wfDebug( __CLASS__.": using cache file {$this->mFile}\n" ); - $this->mHandler = $handler; + wfDebug( __CLASS__ . ": using cache file {$this->mFile}\n" ); + $this->mHandler = $wgDBAhandler; } /** @@ -701,7 +609,7 @@ class DBABagOStuff extends BagOStuff { */ function encode( $value, $expiry ) { # Convert to absolute time - $expiry = BagOStuff::convertExpiry( $expiry ); + $expiry = $this->convertExpiry( $expiry ); return sprintf( '%010u', intval( $expiry ) ) . ' ' . serialize( $value ); } @@ -715,7 +623,7 @@ class DBABagOStuff extends BagOStuff { return array( unserialize( substr( $blob, 11 ) ), intval( substr( $blob, 0, 10 ) ) - ); + ); } } @@ -741,7 +649,7 @@ class DBABagOStuff extends BagOStuff { function get( $key ) { wfProfileIn( __METHOD__ ); - wfDebug( __METHOD__."($key)\n" ); + wfDebug( __METHOD__ . "($key)\n" ); $handle = $this->getReader(); if ( !$handle ) { return null; @@ -756,16 +664,16 @@ class DBABagOStuff extends BagOStuff { $handle = $this->getWriter(); dba_delete( $key, $handle ); dba_close( $handle ); - wfDebug( __METHOD__.": $key expired\n" ); + wfDebug( __METHOD__ . ": $key expired\n" ); $val = null; } wfProfileOut( __METHOD__ ); return $val; } - function set( $key, $value, $exptime=0 ) { + function set( $key, $value, $exptime = 0 ) { wfProfileIn( __METHOD__ ); - wfDebug( __METHOD__."($key)\n" ); + wfDebug( __METHOD__ . "($key)\n" ); $blob = $this->encode( $value, $exptime ); $handle = $this->getWriter(); if ( !$handle ) { @@ -779,7 +687,7 @@ class DBABagOStuff extends BagOStuff { function delete( $key, $time = 0 ) { wfProfileIn( __METHOD__ ); - wfDebug( __METHOD__."($key)\n" ); + wfDebug( __METHOD__ . "($key)\n" ); $handle = $this->getWriter(); if ( !$handle ) { return false; @@ -817,11 +725,11 @@ class DBABagOStuff extends BagOStuff { function keys() { $reader = $this->getReader(); $k1 = dba_firstkey( $reader ); - if( !$k1 ) { + if ( !$k1 ) { return array(); } $result[] = $k1; - while( $key = dba_nextkey( $reader ) ) { + while ( $key = dba_nextkey( $reader ) ) { $result[] = $key; } return $result;