blob: 246f47f400e165c2490eeaac9468a97ad4f666f2 [file] [log] [blame]
Andrey Andreevc5536aa2012-11-01 17:33:58 +02001<?php
Derek Jones8dca0412010-03-05 13:01:44 -06002/**
3 * CodeIgniter
4 *
Phil Sturgeon07c1ac82012-03-09 17:03:37 +00005 * An open source application development framework for PHP 5.2.4 or newer
Derek Jones8dca0412010-03-05 13:01:44 -06006 *
Derek Jonesf4a4bd82011-10-20 12:18:42 -05007 * NOTICE OF LICENSE
Andrey Andreev83d15052011-12-22 13:35:42 +02008 *
Derek Jonesf4a4bd82011-10-20 12:18:42 -05009 * Licensed under the Open Software License version 3.0
Andrey Andreev83d15052011-12-22 13:35:42 +020010 *
Derek Jonesf4a4bd82011-10-20 12:18:42 -050011 * This source file is subject to the Open Software License (OSL 3.0) that is
12 * bundled with this package in the files license.txt / license.rst. It is
13 * also available through the world wide web at this URL:
14 * http://opensource.org/licenses/OSL-3.0
15 * If you did not receive a copy of the license and are unable to obtain it
16 * through the world wide web, please send an email to
17 * licensing@ellislab.com so we can send you a copy immediately.
Derek Jones8dca0412010-03-05 13:01:44 -060018 *
19 * @package CodeIgniter
20 * @author EllisLab Dev Team
Greg Aker0defe5d2012-01-01 18:46:41 -060021 * @copyright Copyright (c) 2006 - 2012, EllisLab, Inc. (http://ellislab.com/)
Derek Jonesf4a4bd82011-10-20 12:18:42 -050022 * @license http://opensource.org/licenses/OSL-3.0 Open Software License (OSL 3.0)
Derek Jones8dca0412010-03-05 13:01:44 -060023 * @link http://codeigniter.com
24 * @since Version 1.0
25 * @filesource
26 */
Andrey Andreevc5536aa2012-11-01 17:33:58 +020027defined('BASEPATH') OR exit('No direct script access allowed');
Derek Jones8dca0412010-03-05 13:01:44 -060028
Derek Jones8dca0412010-03-05 13:01:44 -060029/**
30 * CodeIgniter Driver Library Class
31 *
32 * This class enables you to create "Driver" libraries that add runtime ability
33 * to extend the capabilities of a class via additional driver objects
34 *
35 * @package CodeIgniter
36 * @subpackage Libraries
37 * @category Libraries
38 * @author EllisLab Dev Team
Barry Mienydd671972010-10-04 16:33:58 +020039 * @link
Derek Jones8dca0412010-03-05 13:01:44 -060040 */
41class CI_Driver_Library {
42
Timothy Warren0688ac92012-04-20 10:25:04 -040043 /**
44 * Array of drivers that are available to use with the driver class
45 *
46 * @var array
47 */
48 protected $valid_drivers = array();
Andrey Andreev56454792012-05-17 14:32:19 +030049
Timothy Warren0688ac92012-04-20 10:25:04 -040050 /**
51 * Name of the current class - usually the driver class
52 *
53 * @var string
54 */
Darren Hillc4e266b2011-08-30 15:40:27 -040055 protected $lib_name;
Barry Mienydd671972010-10-04 16:33:58 +020056
Darren Hill6fbf6bd2011-08-31 14:15:35 -040057 /**
58 * Get magic method
59 *
Darren Hillc4e266b2011-08-30 15:40:27 -040060 * The first time a child is used it won't exist, so we instantiate it
61 * subsequents calls will go straight to the proper child.
Darren Hill6fbf6bd2011-08-31 14:15:35 -040062 *
dchill426262d052012-11-24 18:41:13 -050063 * @param string Child class name
64 * @return object Child class
Darren Hill6fbf6bd2011-08-31 14:15:35 -040065 */
Darren Hillc4e266b2011-08-30 15:40:27 -040066 public function __get($child)
Andrey Andreev2e3e2302012-10-09 15:52:34 +030067 {
Darren Hill6fbf6bd2011-08-31 14:15:35 -040068 // Try to load the driver
dchill42c5872252012-07-30 14:53:11 -040069 return $this->load_driver($child);
Darren Hill6fbf6bd2011-08-31 14:15:35 -040070 }
Darren Hillc4e266b2011-08-30 15:40:27 -040071
Darren Hill6fbf6bd2011-08-31 14:15:35 -040072 /**
73 * Load driver
74 *
Darren Hillc4e266b2011-08-30 15:40:27 -040075 * Separate load_driver call to support explicit driver load by library or user
Darren Hill6fbf6bd2011-08-31 14:15:35 -040076 *
dchill426262d052012-11-24 18:41:13 -050077 * @param string Driver name (w/o parent prefix)
78 * @return object Child class
Darren Hill6fbf6bd2011-08-31 14:15:35 -040079 */
Darren Hillc4e266b2011-08-30 15:40:27 -040080 public function load_driver($child)
Derek Jones8dca0412010-03-05 13:01:44 -060081 {
dchill426262d052012-11-24 18:41:13 -050082 // Get CodeIgniter instance and subclass prefix
83 $CI = get_instance();
84 $prefix = (string) $CI->config->item('subclass_prefix');
85
Pascal Kriete14287f32011-02-14 13:39:34 -050086 if ( ! isset($this->lib_name))
Derek Jones8dca0412010-03-05 13:01:44 -060087 {
dchill426262d052012-11-24 18:41:13 -050088 // Get library name without any prefix
89 $this->lib_name = str_replace(array('CI_', $prefix), '', get_class($this));
Derek Jones8dca0412010-03-05 13:01:44 -060090 }
91
dchill426262d052012-11-24 18:41:13 -050092 // The child will be prefixed with the parent lib
93 $child_name = $this->lib_name.'_'.$child;
Andrey Andreev83d15052011-12-22 13:35:42 +020094
dchill426262d052012-11-24 18:41:13 -050095 // See if requested child is a valid driver
Andrey Andreev7e83f322012-11-25 16:03:21 +020096 if ( ! in_array($child, $this->valid_drivers))
Derek Jones8dca0412010-03-05 13:01:44 -060097 {
dchill426262d052012-11-24 18:41:13 -050098 // The requested driver isn't valid!
99 $msg = 'Invalid driver requested: '.$child_name;
100 log_message('error', $msg);
101 show_error($msg);
102 }
Derek Jones8dca0412010-03-05 13:01:44 -0600103
dchill426262d052012-11-24 18:41:13 -0500104 // Get package paths and filename case variations to search
105 $paths = $CI->load->get_package_paths(TRUE);
dchill426262d052012-11-24 18:41:13 -0500106
107 // Is there an extension?
108 $class_name = $prefix.$child_name;
109 $found = class_exists($class_name);
110 if ( ! $found)
111 {
112 // Check for subclass file
113 foreach ($paths as $path)
114 {
Andrey Andreev7e83f322012-11-25 16:03:21 +0200115 // Does the file exist?
116 $file = $path.'libraries/'.$this->lib_name.'/drivers/'.$prefix.$child_name.'.php';
117 if (file_exists($file))
dchill426262d052012-11-24 18:41:13 -0500118 {
Andrey Andreev7e83f322012-11-25 16:03:21 +0200119 // Yes - require base class from BASEPATH
120 $basepath = BASEPATH.'libraries/'.$this->lib_name.'/drivers/'.$child_name.'.php';
121 if ( ! file_exists($basepath))
dchill426262d052012-11-24 18:41:13 -0500122 {
Andrey Andreev7e83f322012-11-25 16:03:21 +0200123 $msg = 'Unable to load the requested class: CI_'.$child_name;
124 log_message('error', $msg);
125 show_error($msg);
dchill426262d052012-11-24 18:41:13 -0500126 }
Andrey Andreev7e83f322012-11-25 16:03:21 +0200127
128 // Include both sources and mark found
129 include($basepath);
130 include($file);
131 $found = TRUE;
132 break;
dchill426262d052012-11-24 18:41:13 -0500133 }
134 }
135 }
136
137 // Do we need to search for the class?
138 if ( ! $found)
139 {
140 // Use standard class name
141 $class_name = 'CI_'.$child_name;
142 $found = class_exists($class_name);
143 if ( ! $found)
144 {
145 // Check package paths
146 foreach ($paths as $path)
147 {
Andrey Andreev7e83f322012-11-25 16:03:21 +0200148 // Does the file exist?
149 $file = $path.'libraries/'.$this->lib_name.'/drivers/'.$child_name.'.php';
150 if (file_exists($file))
dchill426262d052012-11-24 18:41:13 -0500151 {
Andrey Andreev7e83f322012-11-25 16:03:21 +0200152 // Include source
153 include($file);
154 break;
Derek Jones8dca0412010-03-05 13:01:44 -0600155 }
156 }
Derek Jones8dca0412010-03-05 13:01:44 -0600157 }
Derek Jones8dca0412010-03-05 13:01:44 -0600158 }
Barry Mienydd671972010-10-04 16:33:58 +0200159
dchill426262d052012-11-24 18:41:13 -0500160 // Did we finally find the class?
161 if ( ! class_exists($class_name))
162 {
William Knauss401fb492012-11-27 00:01:03 -0500163 // last ditch effort. Maybe someone is coding by the 2.1 driver style.
164 if (class_exists($child_name))
165 {
166 $class_name = $child_name;
167 }
168 else
169 {
170 $msg = 'Unable to load the requested driver: '.$class_name;
171 log_message('error', $msg);
172 show_error($msg);
173 }
dchill426262d052012-11-24 18:41:13 -0500174 }
175
Andrey Andreev7e83f322012-11-25 16:03:21 +0200176 // Instantiate, decorate and add child
177 $obj = new $class_name();
dchill426262d052012-11-24 18:41:13 -0500178 $obj->decorate($this);
179 $this->$child = $obj;
180 return $this->$child;
Derek Jones8dca0412010-03-05 13:01:44 -0600181 }
Derek Jones8dca0412010-03-05 13:01:44 -0600182
Derek Jones8dca0412010-03-05 13:01:44 -0600183}
Derek Jones8dca0412010-03-05 13:01:44 -0600184
Timothy Warren0688ac92012-04-20 10:25:04 -0400185// --------------------------------------------------------------------------
Derek Jones8dca0412010-03-05 13:01:44 -0600186
187/**
188 * CodeIgniter Driver Class
189 *
190 * This class enables you to create drivers for a Library based on the Driver Library.
191 * It handles the drivers' access to the parent library
192 *
193 * @package CodeIgniter
194 * @subpackage Libraries
195 * @category Libraries
196 * @author EllisLab Dev Team
Barry Mienydd671972010-10-04 16:33:58 +0200197 * @link
Derek Jones8dca0412010-03-05 13:01:44 -0600198 */
199class CI_Driver {
Barry Mienydd671972010-10-04 16:33:58 +0200200
Timothy Warren0688ac92012-04-20 10:25:04 -0400201 /**
202 * Instance of the parent class
203 *
204 * @var object
205 */
Andrey Andreev8486e9c2012-03-26 20:24:12 +0300206 protected $_parent;
Derek Jones8dca0412010-03-05 13:01:44 -0600207
Timothy Warren0688ac92012-04-20 10:25:04 -0400208 /**
209 * List of methods in the parent class
210 *
211 * @var array
212 */
Andrey Andreev8486e9c2012-03-26 20:24:12 +0300213 protected $_methods = array();
Andrey Andreev56454792012-05-17 14:32:19 +0300214
Timothy Warren0688ac92012-04-20 10:25:04 -0400215 /**
216 * List of properties in the parent class
217 *
218 * @var array
219 */
Andrey Andreev8486e9c2012-03-26 20:24:12 +0300220 protected $_properties = array();
Derek Jones8dca0412010-03-05 13:01:44 -0600221
Timothy Warren0688ac92012-04-20 10:25:04 -0400222 /**
223 * Array of methods and properties for the parent class(es)
224 *
Andrey Andreev5fd3ae82012-10-24 14:55:35 +0300225 * @static
226 * @var array
Timothy Warren0688ac92012-04-20 10:25:04 -0400227 */
Andrey Andreev8486e9c2012-03-26 20:24:12 +0300228 protected static $_reflections = array();
Derek Jones8dca0412010-03-05 13:01:44 -0600229
230 /**
231 * Decorate
232 *
233 * Decorates the child with the parent driver lib's methods and properties
234 *
Derek Jones8dca0412010-03-05 13:01:44 -0600235 * @param object
236 * @return void
237 */
Greg Akera9263282010-11-10 15:26:43 -0600238 public function decorate($parent)
Derek Jones8dca0412010-03-05 13:01:44 -0600239 {
Andrey Andreev8486e9c2012-03-26 20:24:12 +0300240 $this->_parent = $parent;
Barry Mienydd671972010-10-04 16:33:58 +0200241
Derek Jones8dca0412010-03-05 13:01:44 -0600242 // Lock down attributes to what is defined in the class
243 // and speed up references in magic methods
Barry Mienydd671972010-10-04 16:33:58 +0200244
Derek Jones8dca0412010-03-05 13:01:44 -0600245 $class_name = get_class($parent);
Barry Mienydd671972010-10-04 16:33:58 +0200246
Andrey Andreev8486e9c2012-03-26 20:24:12 +0300247 if ( ! isset(self::$_reflections[$class_name]))
Derek Jones8dca0412010-03-05 13:01:44 -0600248 {
249 $r = new ReflectionObject($parent);
Barry Mienydd671972010-10-04 16:33:58 +0200250
Derek Jones8dca0412010-03-05 13:01:44 -0600251 foreach ($r->getMethods() as $method)
252 {
253 if ($method->isPublic())
254 {
Andrey Andreev8486e9c2012-03-26 20:24:12 +0300255 $this->_methods[] = $method->getName();
Derek Jones8dca0412010-03-05 13:01:44 -0600256 }
257 }
258
Pascal Kriete14287f32011-02-14 13:39:34 -0500259 foreach ($r->getProperties() as $prop)
Derek Jones8dca0412010-03-05 13:01:44 -0600260 {
261 if ($prop->isPublic())
262 {
Andrey Andreev8486e9c2012-03-26 20:24:12 +0300263 $this->_properties[] = $prop->getName();
Derek Jones8dca0412010-03-05 13:01:44 -0600264 }
265 }
Barry Mienydd671972010-10-04 16:33:58 +0200266
Andrey Andreev8486e9c2012-03-26 20:24:12 +0300267 self::$_reflections[$class_name] = array($this->_methods, $this->_properties);
Derek Jones8dca0412010-03-05 13:01:44 -0600268 }
269 else
270 {
Andrey Andreev8486e9c2012-03-26 20:24:12 +0300271 list($this->_methods, $this->_properties) = self::$_reflections[$class_name];
Derek Jones8dca0412010-03-05 13:01:44 -0600272 }
273 }
Barry Mienydd671972010-10-04 16:33:58 +0200274
Derek Jones8dca0412010-03-05 13:01:44 -0600275 // --------------------------------------------------------------------
Barry Mienydd671972010-10-04 16:33:58 +0200276
Derek Jones8dca0412010-03-05 13:01:44 -0600277 /**
278 * __call magic method
279 *
280 * Handles access to the parent driver library's methods
281 *
Derek Jones8dca0412010-03-05 13:01:44 -0600282 * @param string
283 * @param array
284 * @return mixed
285 */
286 public function __call($method, $args = array())
287 {
Andrey Andreev8486e9c2012-03-26 20:24:12 +0300288 if (in_array($method, $this->_methods))
Derek Jones8dca0412010-03-05 13:01:44 -0600289 {
Andrey Andreev8486e9c2012-03-26 20:24:12 +0300290 return call_user_func_array(array($this->_parent, $method), $args);
Derek Jones8dca0412010-03-05 13:01:44 -0600291 }
292
293 $trace = debug_backtrace();
294 _exception_handler(E_ERROR, "No such method '{$method}'", $trace[1]['file'], $trace[1]['line']);
295 exit;
296 }
297
298 // --------------------------------------------------------------------
Barry Mienydd671972010-10-04 16:33:58 +0200299
Derek Jones8dca0412010-03-05 13:01:44 -0600300 /**
301 * __get magic method
302 *
303 * Handles reading of the parent driver library's properties
304 *
Derek Jones8dca0412010-03-05 13:01:44 -0600305 * @param string
306 * @return mixed
307 */
Greg Akera9263282010-11-10 15:26:43 -0600308 public function __get($var)
Derek Jones8dca0412010-03-05 13:01:44 -0600309 {
Andrey Andreev8486e9c2012-03-26 20:24:12 +0300310 if (in_array($var, $this->_properties))
Derek Jones8dca0412010-03-05 13:01:44 -0600311 {
Andrey Andreev8486e9c2012-03-26 20:24:12 +0300312 return $this->_parent->$var;
Derek Jones8dca0412010-03-05 13:01:44 -0600313 }
314 }
315
316 // --------------------------------------------------------------------
Barry Mienydd671972010-10-04 16:33:58 +0200317
Derek Jones8dca0412010-03-05 13:01:44 -0600318 /**
319 * __set magic method
320 *
321 * Handles writing to the parent driver library's properties
322 *
Derek Jones8dca0412010-03-05 13:01:44 -0600323 * @param string
324 * @param array
325 * @return mixed
326 */
Greg Akera9263282010-11-10 15:26:43 -0600327 public function __set($var, $val)
Derek Jones8dca0412010-03-05 13:01:44 -0600328 {
Andrey Andreev8486e9c2012-03-26 20:24:12 +0300329 if (in_array($var, $this->_properties))
Derek Jones8dca0412010-03-05 13:01:44 -0600330 {
Andrey Andreev8486e9c2012-03-26 20:24:12 +0300331 $this->_parent->$var = $val;
Derek Jones8dca0412010-03-05 13:01:44 -0600332 }
333 }
Barry Mienydd671972010-10-04 16:33:58 +0200334
Derek Jones8dca0412010-03-05 13:01:44 -0600335}
Derek Jones8dca0412010-03-05 13:01:44 -0600336
337/* End of file Driver.php */
Andrey Andreev2e3e2302012-10-09 15:52:34 +0300338/* Location: ./system/libraries/Driver.php */