source: sourcecode/system/database/DB_cache.php @ 1

Last change on this file since 1 was 1, checked in by dungnv, 11 years ago
File size: 4.3 KB
Line 
1<?php  if ( ! defined('BASEPATH')) exit('No direct script access allowed');
2/**
3 * CodeIgniter
4 *
5 * An open source application development framework for PHP 5.1.6 or newer
6 *
7 * @package             CodeIgniter
8 * @author              ExpressionEngine Dev Team
9 * @copyright   Copyright (c) 2008 - 2011, 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 */
25class 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 __construct(&$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, FILE_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 */
Note: See TracBrowser for help on using the repository browser.