This file is indexed.

/usr/share/php/Cache/Container/dbx.php is in php-cache 1.5.6-2.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
<?php
// +----------------------------------------------------------------------+
// | PEAR :: Cache                                                        |
// +----------------------------------------------------------------------+
// | Copyright (c) 1997-2003 The PHP Group                                |
// +----------------------------------------------------------------------+
// | This source file is subject to version 2.0 of the PHP license,       |
// | that is bundled with this package in the file LICENSE, and is        |
// | available at through the world-wide-web at                           |
// | http://www.php.net/license/2_02.txt.                                 |
// | If you did not receive a copy of the PHP license and are unable to   |
// | obtain it through the world-wide-web, please send a note to          |
// | license@php.net so we can mail you a copy immediately.               |
// +----------------------------------------------------------------------+
// | Authors: Christian Stocker <chregu@phant.ch>                         |
// +----------------------------------------------------------------------+
//
// $Id: dbx.php 268860 2008-11-12 14:56:26Z clockwerx $


require_once 'Cache/Container.php';

/**
* ext/dbx Cache Container.
*
* WARNING: Other systems might or might not support certain datatypes of 
* the tables shown. As far as I know there's no large binary 
* type in SQL-92 or SQL-99. Postgres seems to lack any 
* BLOB or TEXT type, for MS-SQL you could use IMAGE, don't know 
* about other databases. Please add sugestions for other databases to 
* the inline docs.
*
* The field 'changed' has no meaning for the Cache itself. It's just there 
* because it's a good idea to have an automatically updated timestamp
* field for debugging in all of your tables.
*
* For _MySQL_ you need this DB table:
*
* CREATE TABLE cache (
*   id          CHAR(32) NOT null DEFAULT '',
*   cachegroup  VARCHAR(127) NOT null DEFAULT '',
*   cachedata   BLOB NOT null DEFAULT '',
*   userdata    VARCHAR(255) NOT null DEFAULT '',
*   expires     INT(9) NOT null DEFAULT 0,
*  
*   changed     TIMESTAMP(14) NOT null,
*  
*   INDEX (expires),
*   PRIMARY KEY (id, cachegroup)
* )
*
* @author   Christian Stocker <chregu@phant.ch>
* @version  $Id: dbx.php 268860 2008-11-12 14:56:26Z clockwerx $
* @package  Cache
*/
class Cache_Container_dbx extends Cache_Container
{

    /**
    * Name of the DB table to store caching data
    * 
    * @see  Cache_Container_file::$filename_prefix
    */  
    var $cache_table = '';

    /**
    * DBx module to use
    *
    *  at the moment only mysql or odbc
    * 
    * @var  string
    */
    var $module = '';

    /**
    * DB host to use
    * 
    * @var  string
    */
    var $host = '';

    /**
    * DB database to use
    * 
    * @var  string
    */
    var $db = '';

    /**
    * DB username to use
    * 
    * @var  string
    */
    var $username = '';

    /**
    * DB password to use
    * 
    * @var  string
    */
    var $password = '';
    
    
    /**
    * Establish a persistent connection?
    * 
    * @var  boolean 
    */
    var $persistent = true;
    

    function Cache_Container_dbx($options)
    {
        if (!is_array($options) ) {
            return new Cache_Error('No options specified!', __FILE__, __LINE__);
        }

        $this->setOptions($options,  array_merge($this->allowed_options, array('module','host','db','username','password', 'cache_table', 'persistent')));

        if (!$this->module)
            return new Cache_Error('No module specified!', __FILE__, __LINE__);

        $this->db = dbx_connect($this->module, $this->host, $this->db, $this->username, $this->password, $this->persistent);

        if (dbx_error($this->db)) {
            return new Cache_Error('DBx connect failed: ' . dbx_error($this->db), __FILE__, __LINE__);
        } else {
            //not implemented yet in dbx
            //$this->db->setFetchMode(DB_FETCHMODE_ASSOC);
        }
    }

    function fetch($id, $group)
    {
        $query = sprintf("SELECT cachedata, userdata, expires FROM %s WHERE id = '%s' AND cachegroup = '%s'",
                         $this->cache_table,
                         addslashes($id),
                         addslashes($group)
                        );

        $res = dbx_query($this->db, $query);
        if (dbx_error($this->db)) {
            return new Cache_Error('DBx query failed: ' . dbx_error($this->db), __FILE__, __LINE__);
        }
        $row = $res->data[0];

        if (is_array($row)) {
            $data = array($row['expires'], $this->decode($row['cachedata']), $row['userdata']);
        } else {
            $data = array(null, null, null);
        }
        // last used required by the garbage collection   
        // WARNING: might be MySQL specific         
        $query = sprintf("UPDATE %s SET changed = (NOW() + 0) WHERE id = '%s' AND cachegroup = '%s'",
                            $this->cache_table,
                            addslashes($id),
                            addslashes($group)
                          );
        
        $res = dbx_query($this->db, $query);
        if (dbx_error($this->db)) {
            return new Cache_Error('DBx query failed: ' . dbx_error($this->db), __FILE__, __LINE__);                             
        }
        return $data;            
    }

    /**
    * Stores a dataset.
    * 
    * WARNING: we use the SQL command REPLACE INTO this might be 
    * MySQL specific. As MySQL is very popular the method should
    * work fine for 95% of you.
    */
    function save($id, $data, $expires, $group, $userdata)
    {
        $this->flushPreload($id, $group);

        $query = sprintf("REPLACE INTO %s (userdata, cachedata, expires, id, cachegroup) VALUES ('%s', '%s', %d, '%s', '%s')",
                         $this->cache_table,
                         addslashes($userdata),
                         addslashes($this->encode($data)),
                         $this->getExpiresAbsolute($expires) ,
                         addslashes($id),
                         addslashes($group)
                        );

        $res = dbx_query($this->db, $query);

        if (dbx_error($this->db)) {
            return new Cache_Error('DBx query failed: ' . dbx_error($this->db) , __FILE__, __LINE__);
        }
    }

    function remove($id, $group)
    {
        $this->flushPreload($id, $group);

        $query = sprintf("DELETE FROM %s WHERE id = '%s' and cachegroup = '%s'",
                         $this->cache_table,
                         addslashes($id),
                         addslashes($group)
                        );

        $res = dbx_query($this->db, $query);

        if (dbx_error($this->db)) {
            return new Cache_Error('DBx query failed: ' . dbx_error($this->db), __FILE__, __LINE__);
        }
    }

    function flush($group = '')
    {
        $this->flushPreload();

        if ($group) {
            $query = sprintf("DELETE FROM %s WHERE cachegroup = '%s'", $this->cache_table, addslashes($group));
        } else {
            $query = sprintf("DELETE FROM %s", $this->cache_table);
        }

        $res = dbx_query($this->db,$query);

        if (dbx_error($this->db)) {
            return new Cache_Error('DBx query failed: ' . dbx_error($this->db), __FILE__, __LINE__);
        }
    }

    function idExists($id, $group)
    {
        $query = sprintf("SELECT id FROM %s WHERE ID = '%s' AND cachegroup = '%s'",
                         $this->cache_table,
                         addslashes($id),
                         addslashes($group)
                        );

        $res = dbx_query($this->db, $query);

        if (dbx_error($this->db)) {
            return new Cache_Error('DBx query failed: ' . dbx_error($this->db), __FILE__, __LINE__);
        }

        $row = $res[0];

        if (is_array($row)) {
            return true;
        }
        return false;
    }

    function garbageCollection($maxlifetime)
    {
        $this->flushPreload();
        
        $query = sprintf('DELETE FROM %s WHERE (expires <= %d AND expires > 0) OR changed <= (NOW() - %d)',
                         $this->cache_table,
                         time(),
                         $maxlifetime
                       );


        $res = dbx_query($this->db, $query);

        if (dbx_error($this->db)) {
            return new Cache_Error('DBx query failed: ' . dbx_error($this->db), __FILE__, __LINE__);
        }
        $query = sprintf('select sum(length(cachedata)) as CacheSize from %s',
                         $this->cache_table
                       );

        $res = dbx_query($this->db, $query);
        //if cache is to big.
        if ($res->data[0][CacheSize] > $this->highwater) {
            //find the lowwater mark.
            $query = sprintf('select length(cachedata) as size, changed from %s order by changed DESC',
                                     $this->cache_table
                       );

            $res = dbx_query($this->db, $query);
            $keep_size = 0;
            $i = 0;
            while ($keep_size < $this->lowwater && $i < $res->rows ) {
                $keep_size += $res->data[$i][size];
                $i++;
            }
    
            //delete all entries, which were changed before the "lowwwater mark"
            $query = sprintf('delete from %s where changed <= %s',
                                     $this->cache_table,
                                     $res->data[$i][changed]
                                   );
            $res = dbx_query($this->db, $query);
        }
    }
}
?>