<?php

/*
*	Copyright VeryIDE,2007-2010
*	http://www.veryide.com/
*
*	系统及模块缓存处理
*
*	$Id: cache.php,v2.0 12:25 2010-4-18 Leilei $
*/

/*
	扫描模块
	
	$modid 	模块ID
	$state	设置状态
			true 启用 false 禁用
*/
function cache_module( $modid="", $state=true ){
	global $Project;
	global $VICACHE;
	
	//创建子文件夹
	$folder = create_dir(VI_ROOT."/".$Project["cache"]."/system");
	
	//载入模块缓存
	$inc = VI_ROOT."/".$Project["cache"]."/system/files.module.php";
	
	if( file_exists($inc) ){
		require($inc);	
	}
	
	$mod = VI_ROOT."/module/";
	
	$cache ='<?php'.chr(13);
	$cache.=' /*'.date("Y-m-t H:i:s").'*/ '.chr(13);
	$cache.='$VICACHE["sys.module"]=array('.chr(13);
	
	if ($handle = opendir($mod)) {
		while (false !== ($file = readdir($handle))) {
			//读取文件夹
			if( is_dir($mod.$file) && $file != "." && $file != ".." ){
				
				//appid
				$appid = $file;
				
				//config
				$config = $Project["module"].$appid.'/config.php';				
				
				if ( file_exists(VI_ROOT.$config) ){
					require_once(VI_ROOT.$config);
					
					//exit($config);
				}
				
				$item = '';
				
				//有配置文件
				if( is_array( $Modules[$appid] ) ){
					
					//设置模块状态
					if( $appid != $modid ){
						
						//发现新模块
						if( $VICACHE['sys.module'][$appid]["status"] || !$_SESSION["Manager"]["id"] ){
							$sts = 'true';	
						}else{
							$sts = 'false';
						}
					}else{
						$sts = ($state?'true':'false');
					}
					
					//新模块标识
					$newmod = '';
					if( !is_array( $VICACHE['sys.module'][$appid]) ){
						$newmod = ',"dateline" => '.time();
					}					
					
					$item = '	"'.$appid.'" => array("config" => "'.$config.'","name" => "'.$Modules[$appid]["name"].'","appid" => "'.$appid.'","serve" => "'.$Modules[$appid]["serve"].'","status" => '.$sts.$newmod.'),'.chr(13).chr(13);
				
				//没有配置文件
				}else{
					
					//if( !$modid ){
					
						$item = '	"'.$appid.'" => array("name" => "'.$appid.'","appid" => "'.$appid.'","status" => true),'.chr(13).chr(13);
					//}
				}
				
				$cache .= $item;
			}
		}

		closedir($handle);
	}
	
	$cache.=");".chr(13).chr(13);
	$cache.="?>";
	
	$cache = str_replace($item,str_replace('),',')',$item),$cache);
	
	//$cache = substr($cache,0,strlen($cache)-1);
	
	//写入缓存
	return create_file($inc,$cache);
}

/*
	缓存查询至JavaScript
	
	$appid		模块ID
	$mysql		数据库连接
	$sql		查询语句
	$var		变量名
	$file		缓存文件名
	$option		选项模板
*/
function cache_script($appid,$mysql,$sql,$var,$file,$option){
	global $Project;
	
	//创建子文件夹
	$folder = create_dir(VI_ROOT."/".$Project["cache"]."/".$appid);

	//创建变量	
	$cache="var $var=[];\n";
	
	//查询数据
	$result=mysql_query($sql,$mysql);
	
	$Project["queries"]++;
	
	if(mysql_errno()){
		trigger_error($sql, E_USER_ERROR);
		exit();
	}
	
	while($row=mysql_fetch_assoc($result)){
		
		$temp=$option;		
		$temp=str_replace("#var",$var,$temp);
		
		foreach ($row as $key => $value) {
			$temp=str_replace("{table:". $key ."}",$value,$temp);
		}
		
		$cache .= $temp;
		
		//函数处理
		$cache=exec_eval($cache);
	}
	
	//写入缓存
	create_file(VI_ROOT."/".$Project["cache"]."/".$appid."/".str_replace(array('sys.','mod.'),array('script.','script.'),$file).".js",$cache);
}

/*
	缓存多条数据记录	
	$appid		模块ID
	$mysql		数据库连接
	$table		表名
	$sql		查询语句
*/
function cache_multi( $appid, $mysql, $table, $sql, $file ){
	global $Project;
	
	$Project["queries"]++;
	
	$table = str_replace(VI_DBMANPRE,'sys.',$table);
	$table = str_replace(VI_DBMODPRE,'mod.',$table);
	
	//创建子文件夹
	$folder = create_dir(VI_ROOT."/".$Project["cache"]."/".$appid);
	
	$items="";
	
	$result=mysql_query($sql,$mysql);
	
	$cache='<?php'.chr(13);
	$cache.=' /*'.date("Y-m-t H:i:s").'*/ '.chr(13);
	
	$cache.='$VICACHE["'.$table.'"]=array('.chr(13);
												
	$rows = mysql_num_rows($result);
	$i = 1;
	while($row=mysql_fetch_assoc($result)){
		
		$cache.='	"'.$row["id"].'" => array('.chr(13);
		
		$n = 1;
		$temp=$option;
		
		foreach ($row as $key => $value) {
			$temp  = str_replace("{table:". $key ."}",$value,$temp);
			$cache .= '"'.$key.'" => '.'"'.str_replace('$','\$',addslashes($value)).'"'.($n!=count($row)?',':'');
			$n++;
		}
		
		$items .= $temp;
		
		$cache.=")".($rows!=$i?',':'').chr(13).chr(13);
		
		$i++;
	}
	
	$cache.=");".chr(13).chr(13);
	
	$cache.="?>";
	
	//写入缓存
	create_file(VI_ROOT."/".$Project["cache"]."/".$appid."/".str_replace(array('sys.','mod.'),array('script.','script.'),$file).".php",$cache);
}

/*
	缓存单条数据记录
	
	$appid		模块ID
	$mysql		数据库连接
	$table		表名
	$sql		查询语句
*/
function cache_rows( $appid, $mysql, $table, $sql ){
	global $Project;
	
	$Project["queries"]++;
	
	$table = str_replace(VI_DBMANPRE,'sys.',$table);
	$table = str_replace(VI_DBMODPRE,'mod.',$table);
	
	//创建子文件夹
	$folder = create_dir(VI_ROOT."/".$Project["cache"]."/".$appid);
	
	$items="";
	
	$result=mysql_query($sql,$mysql);
	
	while($row=mysql_fetch_assoc($result)){
		
		$cache ='<?php'.chr(13);
		$cache.=' /*'.date("Y-m-t H:i:s").'*/ '.chr(13);
		$cache.='$VICACHE["'.$table.'"]=array('.chr(13);
		
		$n = 1;
		$temp=$option;
		
		foreach ($row as $key => $value) {
			$temp  = str_replace("{table:". $key ."}",$value,$temp);
			$cache .= '"'.$key.'" => '.'"'.str_replace('$','\$',addslashes($value)).'"'.($n!=count($row)?',':'');
			$n++;
		}
		
		$items .= $temp;
		
		$cache.=");".chr(13).chr(13);
		$cache.="?>";
		
		//写入缓存
		create_file(VI_ROOT."/".$Project["cache"]."/".$appid."/".str_replace(array('sys.','mod.'),'',$table).".".$row["id"].".php",$cache);
	}
}

/*
	缓存整张数据表
	$appid		模块ID
	$mysql		数据库连接
	$table		表名
	$option		选项模板
	$sort		排序方式
	$index		索引键
*/
function cache_table( $appid, $mysql, $table, $option, $sort="", $index="id" ){
	global $Project;
	
	$sql="select * from $table";
	
	if( $sort ){
		$sql.=" order by $sort";
	}else{
		$sql.=" order by id";
	}
		
	$result=mysql_query($sql,$mysql);	
	
	//创建子文件夹
	$folder = create_dir(VI_ROOT."/".$Project["cache"]."/".$appid);
	
	$Project["queries"]++;
	
	$table = str_replace( $Project["tmpManPre"] ? $Project["tmpManPre"] : VI_DBMANPRE,'sys.',$table);
	$table = str_replace( VI_DBMODPRE,'mod.', $table );
	
	$items = "";
	
	$cache ='<?php'.chr(13);
	$cache.=' /*'.date("Y-m-t H:i:s").'*/ '.chr(13);
	$cache.='$VICACHE["'.$table.'"]=array('.chr(13);
	
	$rows = mysql_num_rows($result);
	$x = 1;
	while($row=mysql_fetch_assoc($result)){
		
		$cache.='	"'.$row[$index].'" => array('.chr(13);
		
		$n = 1;
		$temp = $option;
		foreach ($row as $key => $value) {
			$temp=str_replace("{table:". $key ."}",$value,$temp);
			$cache .= '"'.$key.'" => '.'"'.str_replace('$','\$',addslashes($value)).'"'.($n!=count($row)?',':'');
			$n++;
		}
		
		$cache.=')'.($x<$rows?',':'').chr(13).chr(13);
		
		$items .= $temp;
		
		$x++;
	}
	
	$cache.=");".chr(13).chr(13);
	$cache.='$VICACHE["'.$table.'.option"] = "'.$items.'";'.chr(13);
	$cache.="?>";
	
	//写入缓存
	create_file(VI_ROOT."/".$Project["cache"]."/".$appid."/".str_replace(array('sys.','mod.'),array('table.','table.'),$table).".php",$cache);
}

/*
	缓存页面查询
	$mysql		数据库连接
	$sql		查询语句
	$temp		缓存模板
	$time		缓存有效期，分钟
	$debug		调试模式
*/
function cache_sql( $mysql, $sql, $temp, $time, $debug=false ){
	global $Project;

	//cache path
	$path = VI_ROOT."/". $Project["cache"]."/sql/";	
	
	//创建子文件夹
	$folder = create_dir($path);

	//cache file
	$file = $path.md5($sql.$temp).".php";
	
	//检查缓存是否有效
	if (file_exists($file)) {
		if(time() - filemtime($file) >= ($time*60) ){
			$action = true;
		}else{
			$action = false;
			$cache = file_get_contents($file);
		}
	}else{
		$action = true;
	}
	
	//更新缓存
	if($action){
	
		$cache="";
		
		$result=mysql_query($sql,$mysql);
		
		$Project["queries"]++;
		
		//error
		if(mysql_error() && $debug){
			trigger_error($sql, E_USER_ERROR);
		}
		
		$i=1;
		while($row=mysql_fetch_assoc($result)){
		
			$tmp = $temp;			
			foreach ($row as $key => $value) {
			   $tmp=str_replace("{table:". $key ."}",$value,$tmp);
			}
			
			//index
			$tmp=str_replace("{table:#}",$i,$tmp);			
			$cache .= $tmp;
			
			$i++;
		}
		
		//函数处理
		$cache=exec_eval($cache);
	
		//保存缓存
		if(!$debug){
			create_file($file,$cache);
		}

	}
	
	return $cache;
}

//MySQL 错误处理
/*
function reader_mysql_error($sql,$error,$errno){
	if($error){
		echo "<p style='margin:2em;border:#ccc solid 2px;padding:.5em;font-size:1.2em;font-family:Arial, Helvetica, sans-serif;'>
		<b>MySQL Error!</b>
		<br /><br />
		<font color='red'><b>错误语句:</b></font>
		<font color='green'>
		".$sql."
		</font>
		<br /><br />
		<font color='red'><b>错误编号:</b></font>
		<font color='green'>
		".$errno."
		</font>
		<br /><br />
		<font color='red'><b>错误描述:</b></font>
		<font color='green'>
		".$error."
		</font>
		</p>";
		exit();
	}
}
*/

/*
	对字符进行函数格式化
	
	$str	模板	
	DEMO	{fun:urlencode("{#t_name}"):end}
*/
function exec_eval($str){
	preg_match_all("{fun:([\S\s]+?):end}", $str, $matches,PREG_SET_ORDER);	
	
	for($i=0;$i<count($matches);$i++){
		
		$tmp_str='{'.$matches[$i][0].'}';
		$tmp_val=eval('return '.$matches[$i][1].';');
		
		$str=str_replace($tmp_str,$tmp_val,$str);
		
	}
	return $str;
}


?>