converted to unix-style eol
[www-register-wizard.git] / database / DB_cache.php
1 <?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
2 /**
3  * CodeIgniter
4  *
5  * An open source application development framework for PHP 4.3.2 or newer
6  *
7  * @package             CodeIgniter
8  * @author              ExpressionEngine Dev Team
9  * @copyright   Copyright (c) 2008, EllisLab, Inc.
10  * @license             http://codeigniter.com/user_guide/license.html
11  * @link                http://codeigniter.com
12  * @since               Version 1.0
13  * @filesource
14  */
15
16 // ------------------------------------------------------------------------
17
18 /**
19  * Database Cache Class
20  *
21  * @category    Database
22  * @author              ExpressionEngine Dev Team
23  * @link                http://codeigniter.com/user_guide/database/
24  */
25 class CI_DB_Cache {
26
27         var $CI;
28         var $db;        // allows passing of db object so that multiple database connections and returned db objects can be supported
29
30         /**
31          * Constructor
32          *
33          * Grabs the CI super object instance so we can access it.
34          *
35          */     
36         function CI_DB_Cache(&$db)
37         {
38                 // Assign the main CI object to $this->CI
39                 // and load the file helper since we use it a lot
40                 $this->CI =& get_instance();
41                 $this->db =& $db;
42                 $this->CI->load->helper('file');        
43         }
44
45         // --------------------------------------------------------------------
46
47         /**
48          * Set Cache Directory Path
49          *
50          * @access      public
51          * @param       string  the path to the cache directory
52          * @return      bool
53          */             
54         function check_path($path = '')
55         {
56                 if ($path == '')
57                 {
58                         if ($this->db->cachedir == '')
59                         {
60                                 return $this->db->cache_off();
61                         }
62                 
63                         $path = $this->db->cachedir;
64                 }
65         
66                 // Add a trailing slash to the path if needed
67                 $path = preg_replace("/(.+?)\/*$/", "\\1/",  $path);
68
69                 if ( ! is_dir($path) OR ! is_really_writable($path))
70                 {
71                         // If the path is wrong we'll turn off caching
72                         return $this->db->cache_off();
73                 }
74                 
75                 $this->db->cachedir = $path;
76                 return TRUE;
77         }
78         
79         // --------------------------------------------------------------------
80
81         /**
82          * Retrieve a cached query
83          *
84          * The URI being requested will become the name of the cache sub-folder.
85          * An MD5 hash of the SQL statement will become the cache file name
86          *
87          * @access      public
88          * @return      string
89          */
90         function read($sql)
91         {
92                 if ( ! $this->check_path())
93                 {
94                         return $this->db->cache_off();
95                 }
96
97                 $segment_one = ($this->CI->uri->segment(1) == FALSE) ? 'default' : $this->CI->uri->segment(1);
98                 
99                 $segment_two = ($this->CI->uri->segment(2) == FALSE) ? 'index' : $this->CI->uri->segment(2);
100         
101                 $filepath = $this->db->cachedir.$segment_one.'+'.$segment_two.'/'.md5($sql);            
102                 
103                 if (FALSE === ($cachedata = read_file($filepath)))
104                 {       
105                         return FALSE;
106                 }
107                 
108                 return unserialize($cachedata);                 
109         }       
110
111         // --------------------------------------------------------------------
112
113         /**
114          * Write a query to a cache file
115          *
116          * @access      public
117          * @return      bool
118          */
119         function write($sql, $object)
120         {
121                 if ( ! $this->check_path())
122                 {
123                         return $this->db->cache_off();
124                 }
125
126                 $segment_one = ($this->CI->uri->segment(1) == FALSE) ? 'default' : $this->CI->uri->segment(1);
127                 
128                 $segment_two = ($this->CI->uri->segment(2) == FALSE) ? 'index' : $this->CI->uri->segment(2);
129         
130                 $dir_path = $this->db->cachedir.$segment_one.'+'.$segment_two.'/';
131                 
132                 $filename = md5($sql);
133         
134                 if ( ! @is_dir($dir_path))
135                 {
136                         if ( ! @mkdir($dir_path, DIR_WRITE_MODE))
137                         {
138                                 return FALSE;
139                         }
140                         
141                         @chmod($dir_path, DIR_WRITE_MODE);                      
142                 }
143                 
144                 if (write_file($dir_path.$filename, serialize($object)) === FALSE)
145                 {
146                         return FALSE;
147                 }
148                 
149                 @chmod($dir_path.$filename, DIR_WRITE_MODE);
150                 return TRUE;
151         }
152
153         // --------------------------------------------------------------------
154
155         /**
156          * Delete cache files within a particular directory
157          *
158          * @access      public
159          * @return      bool
160          */
161         function delete($segment_one = '', $segment_two = '')
162         {       
163                 if ($segment_one == '')
164                 {
165                         $segment_one  = ($this->CI->uri->segment(1) == FALSE) ? 'default' : $this->CI->uri->segment(1);
166                 }
167                 
168                 if ($segment_two == '')
169                 {
170                         $segment_two = ($this->CI->uri->segment(2) == FALSE) ? 'index' : $this->CI->uri->segment(2);
171                 }
172                 
173                 $dir_path = $this->db->cachedir.$segment_one.'+'.$segment_two.'/';
174                 
175                 delete_files($dir_path, TRUE);
176         }
177
178         // --------------------------------------------------------------------
179
180         /**
181          * Delete all existing cache files
182          *
183          * @access      public
184          * @return      bool
185          */
186         function delete_all()
187         {
188                 delete_files($this->db->cachedir, TRUE);
189         }
190
191 }
192
193
194 /* End of file DB_cache.php */
195 /* Location: ./system/database/DB_cache.php */