DatabaseName=$dbName;
}else{
$this->DatabaseName=$_DatabaseName;
}
$this->DefaultPath=$_DefaultPath;
$path=realpath($this->DefaultPath);
$this->DefaultPath=str_replace("\\","/",$path);
$this->db=$db;
$this->obj=$obj;
}
function GetTablesName(){
$othortable=array();
$query = $this->db->query("SHOW TABLES");
$i=0;
while ($rt = $this->db->fetch_array($query)){
$value = trim(current($rt));
$othortable[$i][name]=$value;
$sql="select count(*) as dbnum from `".$value."` where 1";
$tbquery = $this->db->query($sql);
while($num=$this->db->fetch_array($tbquery)){
$othortable[$i][num]=$num['dbnum'];
}
$i++;
}
return $othortable;
}
function backup_action($table,$sizelimit="100000000",$db_config){
$bak="#dbname:".$db_config[dbname]."#phpyun#version:".$db_config[version]."#phpyun#def:".$db_config[def]."#phpyun#charset:".$db_config[charset]."#phpyun#Time:".date('Y-m-d H:i')."\n#phpyun# Type: \n# phpyun: http://www.phpyun.com\n#\r\n";
$this->db->query("SET SQL_QUOTE_SHOW_CREATE = 0");
$this->start = intval($start);
!$tabledb && !is_array($table);
!$tabledb && $tabledb=$table;
!$this->step && $sizelimit/=2;
$this->stop=1;
$bakupdata=$this->bakupdata($tabledb,$start,$sizelimit);
if(!$this->step){
$tablesel=@implode("|",$tabledb);
$this->step=1;
$this->start=0;
$pre='phpyun_'.date('md').'_'.$this->num_rand(10).'_';
$bakuptable=$this->bakuptable($tabledb);
}
$f_num=ceil($step/2);
$filename=$pre.$f_num.'.sql';
$this->step++;
$writedata=$bakuptable?$bakuptable.$bakupdata:$bakupdata;
$t_name=$tabledb[$tableid-1];
$c_n=$this->startfrom;
if($this->stop==1){
$files=$this->step-1;
trim($writedata) && $fw=$this->writeover($this->DefaultPath."/".$filename,$bak.$writedata,'ab');
}else{
trim($writedata) && $fw=$this->writeover($this->DefaultPath."/".$filename,$bak.$writedata,'ab');
if($step>1){
for($i=1;$i<=$f_num;$i++){
$bakfile.=''.$pre.$i.'.sql
';
}
}
}
return $fw;
}
function bakupdata($tabledb,$start=0,$sizelimit="1024",$stop=0){
$this->tableid=$this->tableid?$this->tableid-1:0;
$this->stop=0;
$t_count=count($tabledb);
for($i=$this->tableid;$i<$t_count;$i++){
if(!$this->rows){
$ts=$this->db->query("SHOW TABLE STATUS LIKE '$tabledb[$i]'");
$this->rows=$ts['Rows'];
}
$limitadd="LIMIT $this->start,100000";
$query = $this->db->query("SELECT * FROM $tabledb[$i] $limitadd");
$num_F = $this->db->num_fields($query);
while ($datadb = $db->fetch_row($query)){
$this->start++;
$bakupdata .= "INSERT INTO $tabledb[$i] VALUES("."'".$this->db->escape_string($datadb[0])."'";
$tempdb='';
for($j=1;$j<$num_F;$j++){
$tempdb.=",'".$this->db->escape_string($datadb[$j])."'";
}
$bakupdata .=$tempdb. ");\r\n";
if($sizelimit && strlen($bakupdata)>$sizelimit*1000){
break;
}
}
$this->db->query($query);
if($this->start>=$rows){
$this->start=0;
$this->rows=0;
}
$bakupdata .="\r\n";
if($sizelimit && strlen($bakupdata)>$sizelimit*1000){
$this->start==0 && $i++;
$this->stop=1;
break;
}
$this->start=0;
}
if($stop==1){
$i++;
$this->tableid=$i;
$this->startfrom=$this->start;
$this->start=0;
}
return $bakupdata;
}
function bakuptable($tabledb){
if(is_array($tabledb)){
$creattable.="set sql_mode='';\r\n";
foreach($tabledb as $key=>$table){
$creattable.= "DROP TABLE IF EXISTS $table;\r\n";
$CreatTable = $this->db->query("SHOW CREATE TABLE $table");
$CreatTable=$this->db->fetch_array($CreatTable);
$CreatTable['Create Table']=str_replace($CreatTable['Table'],$table,$CreatTable['Create Table']);
$creattable.=$CreatTable['Create Table'].";\r\n";
}
}
return $creattable;
}
function num_rand($lenth){
mt_srand((double)microtime() * 1000000);
for($i=0;$i<$lenth;$i++){
$randval.= mt_rand(0,9);
}
$randval=substr(md5($randval),mt_rand(0,32-$lenth),$lenth);
return $randval;
}
function writeover($filename,$data,$method="rb+",$iflock=1,$check=1,$chmod=1){
$check && @strpos($filename,'..')!==false && exit('Forbidden');
@touch($filename);
$handle=@fopen($filename,$method);
if($iflock){
@flock($handle,LOCK_EX);
}
$fw=@fwrite($handle,$data);
if($method=="rb+") ftruncate($handle,strlen($data));
fclose($handle);
$chmod && @chmod($filename,0777);
return $fw;
}
function get_hander(){
$filedb=array();
$handle=opendir($this->DefaultPath);
while($file = readdir($handle)){
if(preg_match("/^phpyun_/",$file) &&is_dir($file)){
$strlen=preg_match("/^$PW/",$file) ? 16 + strlen($PW) : 19;
$fp=fopen($this->DefaultPath."/$file",'rb');
$bakinfo=@fread($fp,200);
@fclose($fp);
$detail=@explode("#phpyun#",$bakinfo);
$bk['name']=$file;
$bk['version']=str_replace("version:","",$detail[1]);
$bk['time']=str_replace("Time:","",$detail[4]);
$bk['charset']=str_replace("charset:","",$detail[3]);
$bk['dbname']=str_replace("#dbname:","",$detail[0]);
$bk['def']=str_replace("#def:","",$detail[2]);
$bk['num']=@substr($file,$strlen,strrpos($file,'.')-$strlen);
$filedb[]=$bk;
}
}
return $filedb;
}
function bakindata($filename,$charset="utf8") {
$sql=file($this->DefaultPath."/".$filename);
$query='';
$num=0;
foreach($sql as $key => $value){
$value=trim($value);
if(!$value || $value[0]=='#') continue;
if(preg_match("/\;$/",$value)){
$query.=$value;
if(preg_match("/^CREATE/",$query)){
$extra = substr(strrchr($query,')'),1);
$query = str_replace($extra,'',$query);
if($this->db->mysql_server('8')>'4.1'){
$extra = $charset ? "ENGINE=MyISAM DEFAULT CHARSET=$charset;" : "ENGINE=MyISAM;";
}else{
$extra = "TYPE=MyISAM;";
}
$query .=$extra;
}elseif(preg_match("/^INSERT/",$query)){
$query='REPLACE '.substr($query,6);
}
$sql=$this->db->query($query);
$query='';
} else{
$query.=$value;
}
}
return $sql;
}
}
?>