Location: PHPKode > projects > Dbscript > db/library/dbscript/cache.php
<?php

  /** 
   * dbscript for PHP 4 & 5 - restful crud framework
   * @version 0.3.0 -- 10-Jun-2007
   * @author Brian Hendrickson <hide@address.com>
   * @link http://dbscript.net/
   * @copyright Copyright 2007 Brian Hendrickson
   * @package dbscript
   * @license http://www.opensource.org/licenses/mit-license.php MIT License
   */

  /**
   * Cache
   * 
   * Incomplete/Experimental
   * needs adapting for dbscript
   * 
   * More info...
   * {@link http://dbscript.net/cache}
   * 
   * @package dbscript
   * @author Alejandro Gervasio
   * @access public
   * @version 0.3.0
   * @todo implement
   */

class Cache {

  var $mysql;      // instance of MySQL object
  var $result;     // instance of Result object
  var $expiry;     // cache expire time in seconds
  var $cacheFile;  // cache file
  var $data;       // result set array

  // constructor
  function Cache( &$mysql, $expiry = 86400, $cacheFile = 'default_cache.txt' ) {
    $this->mysql =& $mysql;
    ( is_int( $expiry ) && $expiry>0) ? $this->expiry = $expiry: $this->mysql->isError( 'Expire time must be a positive integer' );
    $this->cacheFile = $cacheFile;
    $this->data = array();
  }

  // if cache is valid, perform query and return a result set. Otherwise, get results from cache file
  function query( $query ) {
    // check if query starts with SELECT
    if ( !preg_match( "/^SELECT/", $query ) ) {
      $this->mysql->isError( 'Invalid query. Must start with SELECT' );
    }
    if ( !$this->isValid() ) {
      // read from MySQL
      $this->result = $this->mysql->query( $query );
      $this->data = $this->write();
    } else {
      // read from cache file
      $this->data = $this->read();
    }
  }

  // write cache file
  function write() {
    if ( !$fp = fopen( $this->cacheFile, 'w' ) ) {
      $this->mysql->isError( 'Error opening cache file' );
    }
    if ( !flock( $fp, LOCK_EX ) ) {
      $this->mysql->isError( 'Unable to lock cache file' );
    }
    while( $row = $this->result->fetchRow() ) {
      $content[] = $row;
    }
    if( !fwrite( $fp, serialize( $content ) ) ) {
      $this->mysql->isError( 'Error writing to cache file' );
    }
    flock( $fp, LOCK_UN );
    fclose( $fp );
    unset( $fp, $row );
    return $content;
  }

  // read cache file
  function read() {
    if ( !$content = unserialize( file_get_contents( $this->cacheFile ) ) ) {
      $this->mysql->isError( 'Error reading from cache file' );
    }
    return $content;
  }

  // determine cache validity based on a time expiry trigger
  function isValid() {
    if ( file_exists( $this->cacheFile ) && filemtime( $this->cacheFile ) > ( time() - $this->expiry ) ) {
      return true;
    }
    return false;
  }

  // fetch cache row
  function fetchRow(){
    if ( !$row = current( $this->data ) ) {
      return false;
    }
    next( $this->data );
    return $row;
  }

  // fetch all cache rows
  function fetchAll(){
    if ( count( $this->data ) < 1 ) {
      $this->mysql->isError( 'Error accessing cache data' );
    }
    return $this->data;
  }

  // count cache rows
  function countRows() {
    if ( !$rows = count( $this->data ) ) {
      $this->mysql->isError( 'Error counting cache rows' );
    }
    return $rows;
  }

}

?>
Return current item: Dbscript