3 # Object for fast lookup of IP blocks
4 # Represents a memcached value, and in some sense, the entire ipblocks table
8 var $mData = false, $mMemcKey;
10 function BlockCache( $deferLoad = false, $dbName = "" )
14 if ( $dbName == "" ) {
18 $this->mMemcKey
= "$dbName:ipblocks";
27 global $wgUseMemCached, $wgMemc;
29 if ( $this->mData
=== false) {
30 $this->mData
= array();
34 if ( $wgUseMemCached ) {
35 $this->mData
= $wgMemc->get( $this->mMemcKey
);
36 if ( !$this->mData
) {
41 if ( $this->mData
=== false ||
is_null( $this->mData
) ) {
43 $this->mData
= array();
44 Block
::enumBlocks( "wfBlockCacheInsert", "" ); # Calls $this->insert()
48 $wgMemc->set( $this->mMemcKey
, $this->mData
, 0 );
53 function insert( &$block )
55 if ( $block->mUser
== 0 ) {
56 $nb = $block->getNetworkBits();
57 $ipint = $block->getIntegerAddr();
58 $index = $ipint >> ( 32 - $nb );
60 if ( !array_key_exists( $nb, $this->mData
) ) {
61 $this->mData
[$nb] = array();
64 $this->mData
[$nb][$index] = 1;
71 $ipint = ip2long( $ip );
74 foreach ( $this->mData
as $networkBits => $blockInts ) {
75 if ( array_key_exists( $ipint >> ( 32 - $networkBits ), $blockInts ) ) {
81 # Clear low order bits
82 if ( $networkBits != 32 ) {
83 $ip .= "/$networkBits";
84 $ip = Block
::normaliseRange( $ip );
97 global $wgUseMemCached, $wgMemc;
100 if ( $wgUseMemCached ) {
101 $wgMemc->delete( $this->mMemcKey
);
105 function clearLocal()
107 $this->mData
= false;
111 function wfBlockCacheInsert( $block, $tag )
113 global $wgBlockCache;
114 $wgBlockCache->insert( $block );