DB_cache.php

Go to the documentation of this file.
00001 <?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
00002 /**
00003  * CodeIgniter
00004  *
00005  * An open source application development framework for PHP 4.3.2 or newer
00006  *
00007  * @package             CodeIgniter
00008  * @author              ExpressionEngine Dev Team
00009  * @copyright   Copyright (c) 2006, EllisLab, Inc.
00010  * @license             http://codeigniter.com/user_guide/license.html
00011  * @link                http://codeigniter.com
00012  * @since               Version 1.0
00013  * @filesource
00014  */
00015 
00016 // ------------------------------------------------------------------------
00017 
00018 /**
00019  * Database Cache Class
00020  *
00021  * @category    Database
00022  * @author              ExpressionEngine Dev Team
00023  * @link                http://codeigniter.com/user_guide/database/
00024  */
00025 class CI_DB_Cache {
00026 
00027         var $CI;
00028         var $db;        // allows passing of db object so that multiple database connections and returned db objects can be supported
00029 
00030         /**
00031          * Constructor
00032          *
00033          * Grabs the CI super object instance so we can access it.
00034          *
00035          */     
00036         function CI_DB_Cache(&$db)
00037         {
00038                 // Assign the main CI object to $this->CI
00039                 // and load the file helper since we use it a lot
00040                 $this->CI =& get_instance();
00041                 $this->db =& $db;
00042                 $this->CI->load->helper('file');        
00043         }
00044 
00045         // --------------------------------------------------------------------
00046 
00047         /**
00048          * Set Cache Directory Path
00049          *
00050          * @access      public
00051          * @param       string  the path to the cache directory
00052          * @return      bool
00053          */             
00054         function check_path($path = '')
00055         {
00056                 if ($path == '')
00057                 {
00058                         if ($this->db->cachedir == '')
00059                         {
00060                                 return $this->db->cache_off();
00061                         }
00062                 
00063                         $path = $this->db->cachedir;
00064                 }
00065         
00066                 // Add a trailing slash to the path if needed
00067                 $path = preg_replace("/(.+?)\/*$/", "\\1/",  $path);
00068 
00069                 if ( ! is_dir($path) OR ! is_really_writable($path))
00070                 {
00071                         // If the path is wrong we'll turn off caching
00072                         return $this->db->cache_off();
00073                 }
00074                 
00075                 $this->db->cachedir = $path;
00076                 return TRUE;
00077         }
00078         
00079         // --------------------------------------------------------------------
00080 
00081         /**
00082          * Retrieve a cached query
00083          *
00084          * The URI being requested will become the name of the cache sub-folder.
00085          * An MD5 hash of the SQL statement will become the cache file name
00086          *
00087          * @access      public
00088          * @return      string
00089          */
00090         function read($sql)
00091         {
00092                 if ( ! $this->check_path())
00093                 {
00094                         return $this->db->cache_off();
00095                 }
00096         
00097                 $uri  = ($this->CI->uri->segment(1) == FALSE) ? 'default.'      : $this->CI->uri->segment(1).'+';
00098                 $uri .= ($this->CI->uri->segment(2) == FALSE) ? 'index'         : $this->CI->uri->segment(2);
00099                 
00100                 $filepath = $uri.'/'.md5($sql);
00101                 
00102                 if (FALSE === ($cachedata = read_file($this->db->cachedir.$filepath)))
00103                 {       
00104                         return FALSE;
00105                 }
00106                 
00107                 return unserialize($cachedata);                 
00108         }       
00109 
00110         // --------------------------------------------------------------------
00111 
00112         /**
00113          * Write a query to a cache file
00114          *
00115          * @access      public
00116          * @return      bool
00117          */
00118         function write($sql, $object)
00119         {
00120                 if ( ! $this->check_path())
00121                 {
00122                         return $this->db->cache_off();
00123                 }
00124 
00125                 $uri  = ($this->CI->uri->segment(1) == FALSE) ? 'default.'      : $this->CI->uri->segment(1).'+';
00126                 $uri .= ($this->CI->uri->segment(2) == FALSE) ? 'index'         : $this->CI->uri->segment(2);
00127                 
00128                 $dir_path = $this->db->cachedir.$uri.'/';
00129                 
00130                 $filename = md5($sql);
00131         
00132                 if ( ! @is_dir($dir_path))
00133                 {
00134                         if ( ! @mkdir($dir_path, DIR_WRITE_MODE))
00135                         {
00136                                 return FALSE;
00137                         }
00138                         
00139                         @chmod($dir_path, DIR_WRITE_MODE);                      
00140                 }
00141                 
00142                 if (write_file($dir_path.$filename, serialize($object)) === FALSE)
00143                 {
00144                         return FALSE;
00145                 }
00146                 
00147                 @chmod($dir_path.$filename, DIR_WRITE_MODE);
00148                 return TRUE;
00149         }
00150 
00151         // --------------------------------------------------------------------
00152 
00153         /**
00154          * Delete cache files within a particular directory
00155          *
00156          * @access      public
00157          * @return      bool
00158          */
00159         function delete($segment_one = '', $segment_two = '')
00160         {       
00161                 if ($segment_one == '')
00162                 {
00163                         $segment_one  = ($this->CI->uri->segment(1) == FALSE) ? 'default' : $this->CI->uri->segment(1);
00164                 }
00165                 
00166                 if ($segment_two == '')
00167                 {
00168                         $segment_two = ($this->CI->uri->segment(2) == FALSE) ? 'index' : $this->CI->uri->segment(2);
00169                 }
00170                 
00171                 $dir_path = $this->db->cachedir.$segment_one.'+'.$segment_two.'/';
00172                 
00173                 delete_files($dir_path, TRUE);
00174         }
00175 
00176         // --------------------------------------------------------------------
00177 
00178         /**
00179          * Delete all existing cache files
00180          *
00181          * @access      public
00182          * @return      bool
00183          */
00184         function delete_all()
00185         {
00186                 delete_files($this->db->cachedir, TRUE);
00187         }
00188 
00189 }
00190 
00191 
00192 /* End of file DB_cache.php */
00193 /* Location: ./system/database/DB_cache.php */