<?
/**
* キャッシュファイルクラス
*
* PHP version 5
*
* @package    core
* @author     stk2k <stk2k@sazysoft.com>
* @copyright  2008 stk2k, sazysoft
*/

class charcoal_CacheFile
{
	private $_name;
	private $_header;
	private $_data;
	private $_cacheable;
	private $_timeout;

	/*
	 *    コンストラクタ
	 */
	public function __construct( $name, $data = NULL )
	{
		$this->_name = $name;
		$this->_data = $data;
//print "name:$name<BR>";
	}

	/*
	 *    初期化
	 */
	public function initCacheFile( $cache_file_config )
	{
		$this->_cacheable = $cache_file_config->getBoolean( "cacheacble" );
		$this->_timeout   = $cache_file_config->getString( "timeout" );
	}

	/*
	 *    タイムアウトを取得
	 */
	public function getTimeout()
	{
		return $this->_timeout;
	}

	/*
	 *    データを取得
	 */
	public function getData()
	{
		return $this->_data;
	}

	/*
	 *    データを設定
	 */
	public function setData( $data )
	{
		$this->_data = $data;
	}

	/*
	 *    ヘッダをチェック
	 */
	public function checkHeader()
	{
		return $this->_header->checkVersion();
	}

	/*
	 *    期限切れをチェック
	 */
	public function checkExpired()
	{
		$now_time = System::now();
		$elapse = $now_time - $this->_header->getCreateTime();
		$timeout = $this->_timeout;
//print "elapse:$elapse<BR>";
//print "_timeout:$timeout<BR>";
		return ($elapse > $timeout);
	}

	/*
	 *    ファイルから復元
	 */
	public function load()
	{
		// キャッシュファイルパス
		$cache_file_path = charcoal_ResourceLocator::getWebAppPath( 'cache', $this->_name );

		// ファイルがあるか
		if ( !is_file($cache_file_path) ){
			return false;
		}

		// ファイル内容を取得
		$buffer = file( $cache_file_path );

		// ヘッダを復元
		$this->_header = unserialize( array_shift( $buffer ) );

		// データを復元
		$data = array();
		foreach( $buffer as $line ){
			$data[] = unserialize( $line );
		}

		// 保存
		$this->_data = count($data) == 1 ? $data[0] : $data;

		return true;
	}

	/*
	 *    ファイルに保存
	 */
	public function save()
	{
		// キャッシュファイルパス
		$cache_file_path = charcoal_ResourceLocator::getWebAppPath( 'cache', $this->_name );

//print "save:$cache_file_path<BR>";

		// ヘッダ設定
		$header = new charcoal_CacheFileHeader();
		$header->setCreateTime( charcoal_System::now() );
		$header->setVersion( charcoal_CacheFileHeader::HEADER_VERSION );

		// ファイルオープン
		$fp = fopen($cache_file_path, 'w');

		// ヘッダ書き込み
		fputs( $fp, serialize($header) . "\n" );

		// シリアライズ
		if ( is_array($this->_data) ){
			foreach( $this->_data as $item ){
				fputs($fp, serialize($item)."\n");
			}
		}
		else{
			fputs($fp, serialize($this->_data)."\n");
		}

		fclose($fp);

	}

}
?>