<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

/**

 * CodeIgniter

 *

 * An open source application development framework for PHP 4.3.2 or newer

 *

 * @package		CodeIgniter

 * @author		ExpressionEngine Dev Team

 * @copyright	Copyright (c) 2006 - 2012 EllisLab, Inc.

 * @license		http://codeigniter.com/user_guide/license.html

 * @link		http://codeigniter.com

 * @since		Version 2.0

 * @filesource	

 */



// ------------------------------------------------------------------------



/**

 * CodeIgniter Caching Class 

 *

 * @package		CodeIgniter

 * @subpackage	Libraries

 * @category	Core

 * @author		ExpressionEngine Dev Team

 * @link		

 */

class CI_Cache extends CI_Driver_Library {

	

	protected $valid_drivers 	= array(

		'cache_apc', 'cache_file', 'cache_memcached', 'cache_dummy'

	);



	protected $_cache_path		= NULL;		// Path of cache files (if file-based cache)

	protected $_adapter			= 'dummy';

	protected $_backup_driver;

	

	// ------------------------------------------------------------------------



	/**

	 * Constructor

	 *

	 * @param array

	 */

	public function __construct($config = array())

	{

		if ( ! empty($config))

		{

			$this->_initialize($config);

		}

	}



	// ------------------------------------------------------------------------



	/**

	 * Get 

	 *

	 * Look for a value in the cache.  If it exists, return the data 

	 * if not, return FALSE

	 *

	 * @param 	string	

	 * @return 	mixed		value that is stored/FALSE on failure

	 */

	public function get($id)

	{	

		return $this->{$this->_adapter}->get($id);

	}



	// ------------------------------------------------------------------------



	/**

	 * Cache Save

	 *

	 * @param 	string		Unique Key

	 * @param 	mixed		Data to store

	 * @param 	int			Length of time (in seconds) to cache the data

	 *

	 * @return 	boolean		true on success/false on failure

	 */

	public function save($id, $data, $ttl = 60)

	{

		return $this->{$this->_adapter}->save($id, $data, $ttl);

	}



	// ------------------------------------------------------------------------



	/**

	 * Delete from Cache

	 *

	 * @param 	mixed		unique identifier of the item in the cache

	 * @return 	boolean		true on success/false on failure

	 */

	public function delete($id)

	{

		return $this->{$this->_adapter}->delete($id);

	}



	// ------------------------------------------------------------------------



	/**

	 * Clean the cache

	 *

	 * @return 	boolean		false on failure/true on success

	 */

	public function clean()

	{

		return $this->{$this->_adapter}->clean();

	}



	// ------------------------------------------------------------------------



	/**

	 * Cache Info

	 *

	 * @param 	string		user/filehits

	 * @return 	mixed		array on success, false on failure	

	 */

	public function cache_info($type = 'user')

	{

		return $this->{$this->_adapter}->cache_info($type);

	}



	// ------------------------------------------------------------------------

	

	/**

	 * Get Cache Metadata

	 *

	 * @param 	mixed		key to get cache metadata on

	 * @return 	mixed		return value from child method

	 */

	public function get_metadata($id)

	{

		return $this->{$this->_adapter}->get_metadata($id);

	}

	

	// ------------------------------------------------------------------------



	/**

	 * Initialize

	 *

	 * Initialize class properties based on the configuration array.

	 *

	 * @param	array 	

	 * @return 	void

	 */

	private function _initialize($config)

	{        

		$default_config = array(

				'adapter',

				'memcached'

			);



		foreach ($default_config as $key)

		{

			if (isset($config[$key]))

			{

				$param = '_'.$key;



				$this->{$param} = $config[$key];

			}

		}



		if (isset($config['backup']))

		{

			if (in_array('cache_'.$config['backup'], $this->valid_drivers))

			{

				$this->_backup_driver = $config['backup'];

			}

		}

	}



	// ------------------------------------------------------------------------



	/**

	 * Is the requested driver supported in this environment?

	 *

	 * @param 	string	The driver to test.

	 * @return 	array

	 */

	public function is_supported($driver)

	{

		static $support = array();



		if ( ! isset($support[$driver]))

		{

			$support[$driver] = $this->{$driver}->is_supported();

		}



		return $support[$driver];

	}



	// ------------------------------------------------------------------------



	/**

	 * __get()

	 *

	 * @param 	child

	 * @return 	object

	 */

	public function __get($child)

	{

		$obj = parent::__get($child);



		if ( ! $this->is_supported($child))

		{

			$this->_adapter = $this->_backup_driver;

		}



		return $obj;

	}

	

	// ------------------------------------------------------------------------

}

// End Class



/* End of file Cache.php */

/* Location: ./system/libraries/Cache/Cache.php */