Source for file mdb.php
Documentation is available at mdb.php
// +----------------------------------------------------------------------+
// | PEAR :: Cache :: MDB Container |
// +----------------------------------------------------------------------+
// | 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. |
// +----------------------------------------------------------------------+
// | Note: This is a MDB-oriented rewrite of Cache/Container/db.php. |
// | Thanks to Lukas Smith for his patience in answering my questions |
// +----------------------------------------------------------------------+
// | Author: Lorenzo Alberton <l.alberton at quipo.it> |
// +----------------------------------------------------------------------+
// $Id: mdb.php,v 1.5 2004/12/15 09:09:30 dufuz Exp $
require_once 'Cache/Container.php';
* PEAR/MDB Cache Container.
* NB: 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.
* A XML MDB-compliant schema example for the table needed is provided.
* Look at the file "mdb_cache_schema.xml" for that.
* ------------------------------------------
* ------------------------------------------
* 'database' => 'dbname',
* 'cache_table' => 'cache'
* $cache = new Cache('mdb', $dbinfo);
* $id = $cache->generateID('testentry');
* if ($data = $cache->get($id)) {
* echo 'Cache hit.<br />Data: '.$data;
* $data = 'data of any kind';
* $cache->save($id, $data);
* echo 'Cache miss.<br />';
* ------------------------------------------
* @author Lorenzo Alberton <l.alberton at quipo.it>
* @version $Id: mdb.php,v 1.5 2004/12/15 09:09:30 dufuz Exp $
* Name of the MDB table to store caching data
* @see Cache_Container_file::$filename_prefix
* @param mixed Array with connection info or dsn string
$this->db = &MDB ::Connect ($options);
if (MDB ::isError ($this->db)) {
. $this->db->getMessage (), __FILE__ , __LINE__ );
$this->db->setFetchMode (MDB_FETCHMODE_ASSOC );
array ('dsn', 'cache_table')));
* Fetch in the db the data that matches input parameters
* @param string dataset ID
* @param string cache group
* @return mixed dataset value or null/Cache_Error on failure
function fetch($id, $group)
. ' WHERE id=' . $this->db->getTextValue ($id)
. ' AND cachegroup=' . $this->db->getTextValue ($group);
if ($res = $this->db->query ($query)) {
if ($this->db->endOfResult ($res)) {
$data = array (null , null , null );
$clob = $this->db->fetchClob ($res,0 ,'cachedata');
if (!MDB ::isError ($clob)) {
while (!$this->db->endOfLOB ($clob)) {
if (MDB ::isError ($error =
$this->db->readLob ($clob,$data,8000 )<0 )) {
. $error->getMessage (), __FILE__ , __LINE__ );
$this->db->destroyLob ($clob);
$this->db->freeResult ($res);
//finished fetching LOB, now fetch other fields...
$query = 'SELECT userdata, expires FROM ' . $this->cache_table
. ' WHERE id=' . $this->db->getTextValue ($id)
. ' AND cachegroup=' . $this->db->getTextValue ($group);
if ($res = $this->db->query ($query)) {
$row = $this->db->fetchInto ($res);
$data = array (null , null , null );
$data = array (null , null , null );
. $clob->getMessage (), __FILE__ , __LINE__ );
$this->db->freeResult ($res);
//return new Cache_Error('MDB::query failed: '
// . $result->getMessage(), __FILE__, __LINE__);
$data = array (null , null , null );
// last used required by the garbage collection
. ' SET changed=' . time()
. ' WHERE id=' . $this->db->getTextValue ($id)
. ' AND cachegroup=' . $this->db->getTextValue ($group);
$res = $this->db->query ($query);
if (MDB ::isError ($res)) {
. $this->db->errorMessage ($res), __FILE__ , __LINE__ );
* Stores a dataset in the database
* If dataset_ID already exists, overwrite it with new data,
* else insert data in a new record.
* @param string dataset ID
* @param mixed data to be cached
* @param integer expiration time
* @param string cache group
function save($id, $data, $expires, $group, $userdata)
'null' => ($userdata ? false : true )
if (MDB ::isError ($result)) {
//Var_Dump::display($result);
. $this->db->errorMessage ($result), __FILE__ , __LINE__ );
unset ($fields); //end first part of query
. ' WHERE id='. $this->db->getTextValue ($id);
if (($prepared_query = $this->db->prepareQuery ($query2))) {
'Data' => $this->encode($data)
if (!MDB ::isError ($clob = $this->db->createLob ($char_lob))) {
$this->db->setParamClob ($prepared_query,1 ,$clob,'cachedata');
if(MDB ::isError ($error= $this->db->executeQuery ($prepared_query))) {
. $error->getMessage () , __FILE__ , __LINE__ );
$this->db->destroyLob ($clob);
// creation of the handler object failed
. $clob->getMessage () , __FILE__ , __LINE__ );
$this->db->freePreparedQuery ($prepared_query);
. $prepared_query->getMessage () , __FILE__ , __LINE__ );
* Removes a dataset from the database
* @param string dataset ID
* @param string cache group
. ' WHERE id=' . $this->db->getTextValue ($id)
. ' AND cachegroup=' . $this->db->getTextValue ($group);
$res = $this->db->query ($query);
if (MDB ::isError ($res)) {
. $this->db->errorMessage ($res), __FILE__ , __LINE__ );
* Remove all cached data for a certain group, or empty
* the cache table if no group is specified.
* @param string cache group
function flush($group = '')
. ' WHERE cachegroup=' . $this->db->getTextValue ($group);
$res = $this->db->query ($query);
if (MDB ::isError ($res)) {
. $this->db->errorMessage ($res), __FILE__ , __LINE__ );
* Check if a dataset ID/group exists.
* @param string dataset ID
* @param string cache group
. ' WHERE id=' . $this->db->getTextValue ($id)
. ' AND cachegroup=' . $this->db->getTextValue ($group);
$res = $this->db->query ($query);
if (MDB ::isError ($res)) {
. $this->db->errorMessage ($res), __FILE__ , __LINE__ );
$row = $this->db->fetchInto ($res);
. ' WHERE (expires <= ' . time()
. ' AND expires > 0) OR changed <= '. time() - $maxlifetime;
$res = $this->db->query ($query);
$query = 'SELECT sum(length(cachedata)) as CacheSize FROM '
$cachesize = $this->db->getOne ($query);
if (MDB ::isError ($cachesize)) {
. $this->db->errorMessage ($cachesize), __FILE__ , __LINE__ );
//find the lowwater mark.
$query = 'SELECT length(cachedata) as size, changed FROM '
$res = $this->db->query ($query);
if (MDB ::isError ($res)) {
. $this->db->errorMessage ($res), __FILE__ , __LINE__ );
$numrows = $this->db->numRows ($res);
while ($keep_size < $this->lowwater && $numrows-- ) {
$entry = $this->db->fetchInto ($res,MDB_FETCHMODE_ASSOC );
$keep_size += $entry['size'];
//delete all entries, which were changed before the "lowwater mark"
. ' WHERE changed<='. ($entry['changed'] ? $entry['changed'] : 0 );
$res = $this->db->query ($query);
if (MDB ::isError ($res)) {
. $this->db->errorMessage ($res), __FILE__ , __LINE__ );
Documentation generated on Mon, 11 Mar 2019 15:25:50 -0400 by phpDocumentor 1.4.4. PEAR Logo Copyright © PHP Group 2004.
|