comment update, stupid cvs commit bot test..
[mediawiki.git] / includes / BlockCache.php
blob8b49a0142c13d356ada07769f4e822def93bc94f
1 <?php
3 # Object for fast lookup of IP blocks
4 # Represents a memcached value, and in some sense, the entire ipblocks table
6 class BlockCache
8 var $mData = false, $mMemcKey;
10 function BlockCache( $deferLoad = false, $dbName = '' )
12 global $wgDBname;
14 if ( $dbName == '' ) {
15 $dbName = $wgDBname;
18 $this->mMemcKey = $dbName.':ipblocks';
20 if ( !$deferLoad ) {
21 $this->load();
25 function load()
27 global $wgUseMemCached, $wgMemc;
29 if ( $this->mData === false) {
30 $saveMemc = false;
31 # Try memcached
32 if ( $wgUseMemCached ) {
33 $this->mData = $wgMemc->get( $this->mMemcKey );
34 if ( !$this->mData ) {
35 $saveMemc = true;
39 if ( !is_array( $this->mData ) ) {
40 # Load from DB
41 $this->mData = array();
42 Block::enumBlocks( 'wfBlockCacheInsert', '' ); # Calls $this->insert()
45 if ( $saveMemc ) {
46 $wgMemc->set( $this->mMemcKey, $this->mData, 0 );
51 function insert( &$block )
53 if ( $block->mUser == 0 ) {
54 $nb = $block->getNetworkBits();
55 $ipint = $block->getIntegerAddr();
56 $index = $ipint >> ( 32 - $nb );
58 if ( !array_key_exists( $nb, $this->mData ) ) {
59 $this->mData[$nb] = array();
62 $this->mData[$nb][$index] = 1;
66 function get( $ip )
68 $this->load();
69 $ipint = ip2long( $ip );
70 $blocked = false;
72 foreach ( $this->mData as $networkBits => $blockInts ) {
73 if ( array_key_exists( $ipint >> ( 32 - $networkBits ), $blockInts ) ) {
74 $blocked = true;
75 break;
78 if ( $blocked ) {
79 # Clear low order bits
80 if ( $networkBits != 32 ) {
81 $ip .= '/'.$networkBits;
82 $ip = Block::normaliseRange( $ip );
84 $block = new Block();
85 $block->load( $ip );
86 } else {
87 $block = false;
90 return $block;
93 function clear()
95 global $wgUseMemCached, $wgMemc;
97 $this->mData = false;
98 if ( $wgUseMemCached ) {
99 $wgMemc->delete( $this->mMemcKey );
103 function clearLocal()
105 $this->mData = false;
109 function wfBlockCacheInsert( $block, $tag )
111 global $wgBlockCache;
112 $wgBlockCache->insert( $block );