X-Git-Url: https://git.heureux-cyclage.org/?a=blobdiff_plain;f=includes%2FBagOStuff.php;h=15b8838f8d3f5d35be28b1727dba97b04664797f;hb=000f346c1b541bd8643d901990a69b6a66847d1e;hp=ab05ab2094881eea41ee3687ac1c1cbb18493f49;hpb=784e69d028c275d3ad919b77486d4c54f2f3ff9f;p=lhc%2Fweb%2Fwiklou.git diff --git a/includes/BagOStuff.php b/includes/BagOStuff.php index ab05ab2094..15b8838f8d 100644 --- a/includes/BagOStuff.php +++ b/includes/BagOStuff.php @@ -17,27 +17,30 @@ # with this program; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. # http://www.gnu.org/copyleft/gpl.html + /** + * @defgroup Cache Cache * - * @package MediaWiki + * @file + * @ingroup Cache */ /** - * Simple generic object store - * * interface is intended to be more or less compatible with * the PHP memcached client. * * backends for local hash array and SQL table included: - * $bag = new HashBagOStuff(); - * $bag = new MysqlBagOStuff($tablename); # connect to db first + * + * $bag = new HashBagOStuff(); + * $bag = new MediaWikiBagOStuff($tablename); # connect to db first + * * - * @package MediaWiki + * @ingroup Cache */ class BagOStuff { var $debugmode; - function BagOStuff() { + function __construct() { $this->set_debug( false ); } @@ -73,6 +76,11 @@ class BagOStuff { return true; } + function keys() { + /* stub */ + return array(); + } + /* *** Emulated functions *** */ /* Better performance can likely be got with custom written versions */ function get_multi($keys) { @@ -162,18 +170,15 @@ class BagOStuff { /** * Functional versions! - * @todo document - * @package MediaWiki + * This is a test of the interface, mainly. It stores things in an associative + * array, which is not going to persist between program runs. + * + * @ingroup Cache */ class HashBagOStuff extends BagOStuff { - /* - This is a test of the interface, mainly. It stores - things in an associative array, which is not going to - persist between program runs. - */ var $bag; - function HashBagOStuff() { + function __construct() { $this->bag = array(); } @@ -203,28 +208,27 @@ class HashBagOStuff extends BagOStuff { unset($this->bag[$key]); return true; } -} -/* -CREATE TABLE objectcache ( - keyname char(255) binary not null default '', - value mediumblob, - exptime datetime, - unique key (keyname), - key (exptime) -); -*/ + function keys() { + return array_keys( $this->bag ); + } +} /** - * @todo document - * @abstract - * @package MediaWiki + * Generic class to store objects in a database + * + * @ingroup Cache */ abstract class SqlBagOStuff extends BagOStuff { var $table; var $lastexpireall = 0; - function SqlBagOStuff($tablename = 'objectcache') { + /** + * Constructor + * + * @param string $tablename name of the table to use + */ + function __construct($tablename = 'objectcache') { $this->table = $tablename; } @@ -240,8 +244,8 @@ abstract class SqlBagOStuff extends BagOStuff { } 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() ) + if ( $row->exptime != $this->_maxdatetime() && + wfTimestamp( TS_UNIX, $row->exptime ) < time() ) { $this->_debug("get: key has expired, deleting"); $this->delete($key); @@ -255,6 +259,9 @@ abstract class SqlBagOStuff extends BagOStuff { } function set($key,$value,$exptime=0) { + if ( $this->_readonly() ) { + return false; + } $exptime = intval($exptime); if($exptime < 0) $exptime = 0; if($exptime == 0) { @@ -274,11 +281,27 @@ abstract class SqlBagOStuff extends BagOStuff { } function delete($key,$time=0) { + if ( $this->_readonly() ) { + return false; + } $this->_query( "DELETE FROM $0 WHERE keyname='$1'", $key ); return true; /* ? */ } + function keys() { + $res = $this->_query( "SELECT keyname FROM $0" ); + if(!$res) { + $this->_debug("keys: ** error: " . $this->_dberror($res) . " **"); + return array(); + } + $result = array(); + while( $row = $this->_fetchobject($res) ) { + $result[] = $row->keyname; + } + return $result; + } + function getTableName() { return $this->table; } @@ -314,6 +337,8 @@ abstract class SqlBagOStuff extends BagOStuff { abstract function _doinsert($table, $vals); abstract function _doquery($sql); + abstract function _readonly(); + function _freeresult($result) { /* stub */ return false; @@ -341,12 +366,18 @@ abstract class SqlBagOStuff extends BagOStuff { function expireall() { /* Remove any items that have expired */ + if ( $this->_readonly() ) { + return false; + } $now = $this->_fromunixtime( time() ); $this->_query( "DELETE FROM $0 WHERE exptime < '$now'" ); } function deleteall() { /* Clear *all* items from cache table */ + if ( $this->_readonly() ) { + return false; + } $this->_query( "DELETE FROM $0" ); } @@ -385,32 +416,33 @@ abstract class SqlBagOStuff extends BagOStuff { } /** - * @todo document - * @package MediaWiki + * Stores objects in the main database of the wiki + * + * @ingroup Cache */ class MediaWikiBagOStuff extends SqlBagOStuff { var $tableInitialised = false; + function _getDB(){ + static $db; + if( !isset( $db ) ) + $db = wfGetDB( DB_MASTER ); + return $db; + } function _doquery($sql) { - $dbw =& wfGetDB( DB_MASTER ); - return $dbw->query($sql, 'MediaWikiBagOStuff::_doquery'); + return $this->_getDB()->query( $sql, __METHOD__ ); } function _doinsert($t, $v) { - $dbw =& wfGetDB( DB_MASTER ); - return $dbw->insert($t, $v, 'MediaWikiBagOStuff::_doinsert', - array( 'IGNORE' ) ); + return $this->_getDB()->insert($t, $v, __METHOD__, array( 'IGNORE' ) ); } function _fetchobject($result) { - $dbw =& wfGetDB( DB_MASTER ); - return $dbw->fetchObject($result); + return $this->_getDB()->fetchObject($result); } function _freeresult($result) { - $dbw =& wfGetDB( DB_MASTER ); - return $dbw->freeResult($result); + return $this->_getDB()->freeResult($result); } function _dberror($result) { - $dbw =& wfGetDB( DB_MASTER ); - return $dbw->lastError(); + return $this->_getDB()->lastError(); } function _maxdatetime() { if ( time() > 0x7fffffff ) { @@ -420,24 +452,23 @@ class MediaWikiBagOStuff extends SqlBagOStuff { } } function _fromunixtime($ts) { - $dbw =& wfGetDB(DB_MASTER); - return $dbw->timestamp($ts); + return $this->_getDB()->timestamp($ts); + } + function _readonly(){ + return wfReadOnly(); } function _strencode($s) { - $dbw =& wfGetDB( DB_MASTER ); - return $dbw->strencode($s); + return $this->_getDB()->strencode($s); } function _blobencode($s) { - $dbw =& wfGetDB( DB_MASTER ); - return $dbw->encodeBlob($s); + return $this->_getDB()->encodeBlob($s); } function _blobdecode($s) { - $dbw =& wfGetDB( DB_MASTER ); - return $dbw->decodeBlob($s); + return $this->_getDB()->decodeBlob($s); } function getTableName() { if ( !$this->tableInitialised ) { - $dbw =& wfGetDB( DB_MASTER ); + $dbw = $this->_getDB(); /* This is actually a hack, we should be able to use Language classes here... or not */ if (!$dbw) @@ -462,7 +493,7 @@ class MediaWikiBagOStuff extends SqlBagOStuff { * that Turck's serializer is faster, so a possible future extension would be * to use it for arrays but not for objects. * - * @package MediaWiki + * @ingroup Cache */ class TurckBagOStuff extends BagOStuff { function get($key) { @@ -497,9 +528,8 @@ class TurckBagOStuff extends BagOStuff { /** * This is a wrapper for APC's shared memory functions * - * @package MediaWiki + * @ingroup Cache */ - class APCBagOStuff extends BagOStuff { function get($key) { $val = apc_fetch($key); @@ -508,12 +538,12 @@ class APCBagOStuff extends BagOStuff { } return $val; } - + function set($key, $value, $exptime=0) { apc_store($key, serialize($value), $exptime); return true; } - + function delete($key, $time=0) { apc_delete($key); return true; @@ -527,7 +557,7 @@ class APCBagOStuff extends BagOStuff { * This is basically identical to the Turck MMCache version, * mostly because eAccelerator is based on Turck MMCache. * - * @package MediaWiki + * @ingroup Cache */ class eAccelBagOStuff extends BagOStuff { function get($key) { @@ -559,9 +589,61 @@ class eAccelBagOStuff extends BagOStuff { } } +/** + * Wrapper for XCache object caching functions; identical interface + * to the APC wrapper + * + * @ingroup Cache + */ +class XCacheBagOStuff extends BagOStuff { + + /** + * Get a value from the XCache object cache + * + * @param string $key Cache key + * @return mixed + */ + public function get( $key ) { + $val = xcache_get( $key ); + if( is_string( $val ) ) + $val = unserialize( $val ); + return $val; + } + + /** + * Store a value in the XCache object cache + * + * @param string $key Cache key + * @param mixed $value Object to store + * @param int $expire Expiration time + * @return bool + */ + public function set( $key, $value, $expire = 0 ) { + xcache_set( $key, serialize( $value ), $expire ); + return true; + } + + /** + * Remove a value from the XCache object cache + * + * @param string $key Cache key + * @param int $time Not used in this implementation + * @return bool + */ + public function delete( $key, $time = 0 ) { + xcache_unset( $key ); + return true; + } + +} + +/** + * @todo document + * @ingroup Cache + */ class DBABagOStuff extends BagOStuff { var $mHandler, $mFile, $mReader, $mWriter, $mDisabled; - + function __construct( $handler = 'db3', $dir = false ) { if ( $dir === false ) { global $wgTmpDirectory; @@ -569,6 +651,7 @@ class DBABagOStuff extends BagOStuff { } $this->mFile = "$dir/mw-cache-" . wfWikiID(); $this->mFile .= '.db'; + wfDebug( __CLASS__.": using cache file {$this->mFile}\n" ); $this->mHandler = $handler; } @@ -588,7 +671,7 @@ class DBABagOStuff extends BagOStuff { if ( !is_string( $blob ) ) { return array( null, 0 ); } else { - return array( + return array( unserialize( substr( $blob, 11 ) ), intval( substr( $blob, 0, 10 ) ) ); @@ -655,6 +738,7 @@ class DBABagOStuff extends BagOStuff { function delete( $key, $time = 0 ) { wfProfileIn( __METHOD__ ); + wfDebug( __METHOD__."($key)\n" ); $handle = $this->getWriter(); if ( !$handle ) { return false; @@ -688,6 +772,17 @@ class DBABagOStuff extends BagOStuff { wfProfileOut( __METHOD__ ); return $ret; } + + function keys() { + $reader = $this->getReader(); + $k1 = dba_firstkey( $reader ); + if( !$k1 ) { + return array(); + } + $result[] = $k1; + while( $key = dba_nextkey( $reader ) ) { + $result[] = $key; + } + return $result; + } } - -?>