Add categorylinks table to separately list category relationships. Actual
[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 $saveMemc = false;
31 # Try memcached
32 if ( $wgUseMemCached ) {
33 $this->mData = $wgMemc->get( $this->mMemcKey );
34 if ( !$this->mData ) {
35 $saveMemc = true;
36 }
37 }
38
39 if ( $this->mData === false || is_null( $this->mData ) ) {
40 # Load from DB
41 $this->mData = array();
42 Block::enumBlocks( "wfBlockCacheInsert", "" ); # Calls $this->insert()
43 }
44
45 if ( $saveMemc ) {
46 $wgMemc->set( $this->mMemcKey, $this->mData, 0 );
47 }
48 }
49 }
50
51 function insert( &$block )
52 {
53 if ( $block->mUser == 0 ) {
54 $nb = $block->getNetworkBits();
55 $ipint = $block->getIntegerAddr();
56 $index = $ipint >> ( 32 - $nb );
57
58 if ( !array_key_exists( $nb, $this->mData ) ) {
59 $this->mData[$nb] = array();
60 }
61
62 $this->mData[$nb][$index] = 1;
63 }
64 }
65
66 function get( $ip )
67 {
68 $this->load();
69 $ipint = ip2long( $ip );
70 $blocked = false;
71
72 foreach ( $this->mData as $networkBits => $blockInts ) {
73 if ( array_key_exists( $ipint >> ( 32 - $networkBits ), $blockInts ) ) {
74 $blocked = true;
75 break;
76 }
77 }
78 if ( $blocked ) {
79 # Clear low order bits
80 if ( $networkBits != 32 ) {
81 $ip .= "/$networkBits";
82 $ip = Block::normaliseRange( $ip );
83 }
84 $block = new Block();
85 $block->load( $ip );
86 } else {
87 $block = false;
88 }
89
90 return $block;
91 }
92
93 function clear()
94 {
95 global $wgUseMemCached, $wgMemc;
96
97 $this->mData = false;
98 if ( $wgUseMemCached ) {
99 $wgMemc->delete( $this->mMemcKey );
100 }
101 }
102
103 function clearLocal()
104 {
105 $this->mData = false;
106 }
107 }
108
109 function wfBlockCacheInsert( $block, $tag )
110 {
111 global $wgBlockCache;
112 $wgBlockCache->insert( $block );
113 }