* This uses a non-blocking $wgMemc lock to reserve the user name in question. This should prevent two threads from reaching LOCK IN SHARE MODE and getting stuck on INSERT. The lock is global to better cover auth plugins. * This adds a BagOStuff::getScopedLock() convenience method. It uses less queries than LockManager by being EX only. * Avoid extra lock attempt in lock() in non-blocking mode. * Removed (un)lock() HashBagOStuff overrides that made it behave differently than other caches (wrt to re-entrance). Bug: T106850 Change-Id: Iecf95206d712367f5d202f76ab0eaa9d7bdabf2b
79 lines
1.9 KiB
PHP
79 lines
1.9 KiB
PHP
<?php
|
|
/**
|
|
* Object caching using PHP arrays.
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify
|
|
* it under the terms of the GNU General Public License as published by
|
|
* the Free Software Foundation; either version 2 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License along
|
|
* 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
|
|
*
|
|
* @file
|
|
* @ingroup Cache
|
|
*/
|
|
|
|
/**
|
|
* 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 {
|
|
/** @var array */
|
|
protected $bag;
|
|
|
|
function __construct( $params = array() ) {
|
|
parent::__construct( $params );
|
|
$this->bag = array();
|
|
}
|
|
|
|
protected function expire( $key ) {
|
|
$et = $this->bag[$key][1];
|
|
|
|
if ( ( $et == 0 ) || ( $et > time() ) ) {
|
|
return false;
|
|
}
|
|
|
|
$this->delete( $key );
|
|
|
|
return true;
|
|
}
|
|
|
|
public function get( $key, &$casToken = null, $flags = 0 ) {
|
|
if ( !isset( $this->bag[$key] ) ) {
|
|
return false;
|
|
}
|
|
|
|
if ( $this->expire( $key ) ) {
|
|
return false;
|
|
}
|
|
|
|
$casToken = $this->bag[$key][0];
|
|
|
|
return $this->bag[$key][0];
|
|
}
|
|
|
|
public function set( $key, $value, $exptime = 0 ) {
|
|
$this->bag[$key] = array( $value, $this->convertExpiry( $exptime ) );
|
|
return true;
|
|
}
|
|
|
|
function delete( $key ) {
|
|
if ( !isset( $this->bag[$key] ) ) {
|
|
return false;
|
|
}
|
|
|
|
unset( $this->bag[$key] );
|
|
|
|
return true;
|
|
}
|
|
}
|