Fix for compatibility with short_open_tag = Off
[lhc/web/wiklou.git] / includes / BlockCache.php
1 <?php
2
3 # Object for fast lookup of IP blocks
4 # Represents a memcached value, and in some sense, the entire ipblocks table
5
6 class BlockCache
7 {
8 var $mData = false, $mMemcKey;
9
10 function BlockCache( $deferLoad = false, $dbName = "" )
11 {
12 global $wgDBname;
13
14 if ( $dbName == "" ) {
15 $dbName = $wgDBname;
16 }
17
18 $this->mMemcKey = "$dbName:ipblocks";
19
20 if ( !$deferLoad ) {
21 $this->load();
22 }
23 }
24
25 function load()
26 {
27 global $wgUseMemCached, $wgMemc;
28
29 if ( $this->mData === false) {
30 $this->mData = array();
31
32 $saveMemc = false;
33 # Try memcached
34 if ( $wgUseMemCached ) {
35 $this->mData = $wgMemc->get( $this->mMemcKey );
36 if ( !$this->mData ) {
37 $saveMemc = true;
38 }
39 }
40
41 if ( $this->mData === false || is_null( $this->mData ) ) {
42 # Load from DB
43 $this->mData = array();
44 Block::enumBlocks( "wfBlockCacheInsert", "" ); # Calls $this->insert()
45 }
46
47 if ( $saveMemc ) {
48 $wgMemc->set( $this->mMemcKey, $this->mData, 0 );
49 }
50 }
51 }
52
53 function insert( &$block )
54 {
55 if ( $block->mUser == 0 ) {
56 $nb = $block->getNetworkBits();
57 $ipint = $block->getIntegerAddr();
58 $index = $ipint >> ( 32 - $nb );
59
60 if ( !array_key_exists( $nb, $this->mData ) ) {
61 $this->mData[$nb] = array();
62 }
63
64 $this->mData[$nb][$index] = 1;
65 }
66 }
67
68 function get( $ip )
69 {
70 $this->load();
71 $ipint = ip2long( $ip );
72 $blocked = false;
73
74 foreach ( $this->mData as $networkBits => $blockInts ) {
75 if ( array_key_exists( $ipint >> ( 32 - $networkBits ), $blockInts ) ) {
76 $blocked = true;
77 break;
78 }
79 }
80 if ( $blocked ) {
81 # Clear low order bits
82 if ( $networkBits != 32 ) {
83 $ip .= "/$networkBits";
84 $ip = Block::normaliseRange( $ip );
85 }
86 $block = new Block();
87 $block->load( $ip );
88 } else {
89 $block = false;
90 }
91
92 return $block;
93 }
94
95 function clear()
96 {
97 global $wgUseMemCached, $wgMemc;
98
99 $this->mData = false;
100 if ( $wgUseMemCached ) {
101 $wgMemc->delete( $this->mMemcKey );
102 }
103 }
104
105 function clearLocal()
106 {
107 $this->mData = false;
108 }
109 }
110
111 function wfBlockCacheInsert( $block, $tag )
112 {
113 global $wgBlockCache;
114 $wgBlockCache->insert( $block );
115 }