[TASK] Merge submodule dbal into core
[Packages/TYPO3.CMS.git] / typo3 / sysext / adodb / adodb / adodb-memcache.lib.inc.php
1 <?php
2
3 // security - hide paths
4 if (!defined('ADODB_DIR')) die();
5
6 global $ADODB_INCLUDED_MEMCACHE;
7 $ADODB_INCLUDED_MEMCACHE = 1;
8
9 global $ADODB_INCLUDED_CSV;
10 if (empty($ADODB_INCLUDED_CSV)) include(ADODB_DIR.'/adodb-csvlib.inc.php');
11
12 /*
13
14 V5.14 8 Sept 2011 (c) 2000-2011 John Lim (jlim#natsoft.com). All rights reserved.
15 Released under both BSD license and Lesser GPL library license.
16 Whenever there is any discrepancy between the two licenses,
17 the BSD license will take precedence. See License.txt.
18 Set tabs to 4 for best viewing.
19
20 Latest version is available at http://adodb.sourceforge.net
21
22 Usage:
23
24 $db = NewADOConnection($driver);
25 $db->memCache = true; /// should we use memCache instead of caching in files
26 $db->memCacheHost = array($ip1, $ip2, $ip3);
27 $db->memCachePort = 11211; /// this is default memCache port
28 $db->memCacheCompress = false; /// Use 'true' to store the item compressed (uses zlib)
29
30 $db->Connect(...);
31 $db->CacheExecute($sql);
32
33 Note the memcache class is shared by all connections, is created during the first call to Connect/PConnect.
34
35 Class instance is stored in $ADODB_CACHE
36 */
37
38 class ADODB_Cache_MemCache {
39 var $createdir = false; // create caching directory structure?
40
41 //-----------------------------
42 // memcache specific variables
43
44 var $hosts; // array of hosts
45 var $port = 11211;
46 var $compress = false; // memcache compression with zlib
47
48 var $_connected = false;
49 var $_memcache = false;
50
51 function ADODB_Cache_MemCache(&$obj)
52 {
53 $this->hosts = $obj->memCacheHost;
54 $this->port = $obj->memCachePort;
55 $this->compress = $obj->memCacheCompress;
56 }
57
58 // implement as lazy connection. The connection only occurs on CacheExecute call
59 function connect(&$err)
60 {
61 if (!function_exists('memcache_pconnect')) {
62 $err = 'Memcache module PECL extension not found!';
63 return false;
64 }
65
66 $memcache = new MemCache;
67
68 if (!is_array($this->hosts)) $this->hosts = array($this->hosts);
69
70 $failcnt = 0;
71 foreach($this->hosts as $host) {
72 if (!@$memcache->addServer($host,$this->port,true)) {
73 $failcnt += 1;
74 }
75 }
76 if ($failcnt == sizeof($this->hosts)) {
77 $err = 'Can\'t connect to any memcache server';
78 return false;
79 }
80 $this->_connected = true;
81 $this->_memcache = $memcache;
82 return true;
83 }
84
85 // returns true or false. true if successful save
86 function writecache($filename, $contents, $debug, $secs2cache)
87 {
88 if (!$this->_connected) {
89 $err = '';
90 if (!$this->connect($err) && $debug) ADOConnection::outp($err);
91 }
92 if (!$this->_memcache) return false;
93
94 if (!$this->_memcache->set($filename, $contents, $this->compress ? MEMCACHE_COMPRESSED : 0, $secs2cache)) {
95 if ($debug) ADOConnection::outp(" Failed to save data at the memcached server!<br>\n");
96 return false;
97 }
98
99 return true;
100 }
101
102 // returns a recordset
103 function readcache($filename, &$err, $secs2cache, $rsClass)
104 {
105 $false = false;
106 if (!$this->_connected) $this->connect($err);
107 if (!$this->_memcache) return $false;
108
109 $rs = $this->_memcache->get($filename);
110 if (!$rs) {
111 $err = 'Item with such key doesn\'t exists on the memcached server.';
112 return $false;
113 }
114
115 // hack, should actually use _csv2rs
116 $rs = explode("\n", $rs);
117 unset($rs[0]);
118 $rs = join("\n", $rs);
119 $rs = unserialize($rs);
120 if (! is_object($rs)) {
121 $err = 'Unable to unserialize $rs';
122 return $false;
123 }
124 if ($rs->timeCreated == 0) return $rs; // apparently have been reports that timeCreated was set to 0 somewhere
125
126 $tdiff = intval($rs->timeCreated+$secs2cache - time());
127 if ($tdiff <= 2) {
128 switch($tdiff) {
129 case 2:
130 if ((rand() & 15) == 0) {
131 $err = "Timeout 2";
132 return $false;
133 }
134 break;
135 case 1:
136 if ((rand() & 3) == 0) {
137 $err = "Timeout 1";
138 return $false;
139 }
140 break;
141 default:
142 $err = "Timeout 0";
143 return $false;
144 }
145 }
146 return $rs;
147 }
148
149 function flushall($debug=false)
150 {
151 if (!$this->_connected) {
152 $err = '';
153 if (!$this->connect($err) && $debug) ADOConnection::outp($err);
154 }
155 if (!$this->_memcache) return false;
156
157 $del = $this->_memcache->flush();
158
159 if ($debug)
160 if (!$del) ADOConnection::outp("flushall: failed!<br>\n");
161 else ADOConnection::outp("flushall: succeeded!<br>\n");
162
163 return $del;
164 }
165
166 function flushcache($filename, $debug=false)
167 {
168 if (!$this->_connected) {
169 $err = '';
170 if (!$this->connect($err) && $debug) ADOConnection::outp($err);
171 }
172 if (!$this->_memcache) return false;
173
174 $del = $this->_memcache->delete($filename);
175
176 if ($debug)
177 if (!$del) ADOConnection::outp("flushcache: $key entry doesn't exist on memcached server!<br>\n");
178 else ADOConnection::outp("flushcache: $key entry flushed from memcached server!<br>\n");
179
180 return $del;
181 }
182
183 // not used for memcache
184 function createdir($dir, $hash)
185 {
186 return true;
187 }
188 }
189
190 ?>