query("select VERSION()");
$row=$db->fetch_row($res);
$phpyun_db_ver=$row[0];
$dbname=$add['mydbname'];
$bakpath=$add['backuppath'];
$tablename=$add['tablename'];
$count=count($tablename);
if($count == 1){
if (!preg_match('/^[_a-z]{2,30}$/i',$add['tablename'][0])){
return false;
}
}
if(empty($count)){
}
$add['baktype']=(int)$add['baktype'];
$add['filesize']=(int)$add['filesize'];
$add['bakline']=(int)$add['bakline'];
$add['autoauf']=(int)$add['autoauf'];
if($count > 1){
if(empty($add['mypath'])){
$salt = substr(uniqid(rand()), -6);
$add['mypath']=$dbname."_".md5(date("YmdHis").$salt);
}
}else{
if(empty($add['mypath'])){
$add['mypath']=$dbname."_".$add['tablename'][0]."_".date("YmdHis");
}
}
DoMkdir($bakpath."/".$add['mypath']);
$readme=$add['readme'];
$rfile=$bakpath."/".$add['mypath']."/readme.txt";
$readme.="\r\n\r\nBaktime: ".date("Y-m-d H:i:s");
WriteString2File($rfile,$readme);
$b_table="";
$d_table="";
for($i=0;$i<$count;$i++){
$b_table.=$tablename[$i].",";
$d_table.="\$tb[".$tablename[$i]."]=0;\r\n";
}
$b_table=substr($b_table,0,strlen($b_table)-1);
$bakstru=(int)$add['bakstru'];
$bakstrufour=(int)$add['bakstrufour'];
$beover=(int)$add['beover'];
$waitbaktime=(int)$add['waitbaktime'];
$bakdatatype=(int)$add['bakdatatype'];
if($add['insertf']=='insert'){
$insertf='insert';
}else{
$insertf='replace';
}
if($phpyun_db_ver=='4.0'&&$add['dbchar']=='auto'){
$add['dbchar']='';
}
$string="";
$cfile=$bakpath."/".$add['mypath']."/config.php";
WriteString2File($cfile,$string);
if($add['baktype']){
$phome='BackupDatabaseRecordNum';
}else{
$phome='BackupDatabaseFileSize';
}
$data=array(
'c'=>$phome,
't'=>0,
's'=>0,
'p'=>0,
'mypath'=>$add[mypath],
'waitbaktime'=>$waitbaktime
);
echo json_encode($data);
exit();
}
function SetCharset($Charset){
global $db;
if($Charset&&$Charset!='auto'){
$db->query('set character_set_connection='.$Charset.',character_set_results='.$Charset.',character_set_client=binary;');
}
}
function BackupDatabaseFileSize($t,$s,$p,$mypath,$alltotal,$thenof,$fnum,$stime=0){
global $db,$bakpath,$limittype,$fun_r,$db_config,$config,$adminDir;
ob_start();
if(empty($mypath)){
}
$b_dbname=$db_config['dbname'];
$path=PLUS_PATH.'/bdata/'.$mypath;
@include($path."/config.php");
if(empty($b_table)){
}
$waitbaktime=(int)$_GET['waitbaktime'];
if(empty($stime)){
$stime=time();
}
$header="";
$btb=explode(",",$b_table);
$count=count($btb);
$t=(int)$t;
$s=(int)$s;
$p=(int)$p;
$data['bt']=$t;
if($t>=$count){
$data['msg']="备份成功!
整个过程耗时:".ToChangeUseTime($stime);
echo json_encode($data);
die;
}
$u=$db->query("use `$b_dbname`");
SetCharset($b_dbchar);
$status_r=GetTableRows($b_dbname,$btb[$t]);
$num=$status_r['Rows'];
$allnum = $status_r['Rows'];
//增加控制 每个文件最多存储5000条信息 防止内存溢出
$maxLimit = 5000;
if($num>=$maxLimit){
$num = $maxLimit;
}
$dumpsql = '';
if(empty($p)){
$dumpsql.=GetTableStructSql($btb[$t],$b_strufour);
}
$sql=$db->select_only($btb[$t],'1 limit '.$s.','.$num);
if(empty($fnum)){
$return_fr=GetTableFields($b_dbname,$btb[$t],$b_autofield);
$fieldnum=$return_fr['num'];
$noautof=$return_fr['autof'];
}else{
$fieldnum=$fnum;
$noautof=$thenof;
}
$inf='';
if($b_beover==1){
$inf='('.GetTableInsertFields($b_dbname,$btb[$t]).')';
}
$hexf='';
if($b_bakdatatype==1){
$hexf=GetTableStringFields($b_dbname,$btb[$t]);
}
$b=0;
foreach($sql as $k=>$r){
ob_flush();
flush();
$b=1;
$s++;
$dumpsql.="ExcuteSQL(\"insert into `".$btb[$t]."`".$inf." values(";
$first=1;
for($i=0;$i<$fieldnum;$i++){
if(empty($first)){
$dumpsql.=',';
}else{
$first=0;
}
$myi=$i+1;
if(!isset($r[$i])||strstr($noautof,','.$myi.',')){
$dumpsql.='NULL';
}else{
$dumpsql.=GetFieldContent($r[$i],$b_bakdatatype,$myi,$hexf);
}
}
$dumpsql.=");\");\r\n";
if(strlen($dumpsql)>=$b_filesize*1024 || (($k+1)>=$maxLimit && $s<$allnum)){
$p++;
$sfile=$path."/".$btb[$t]."_".$p.".php";
$dumpsql=$header.$dumpsql.$footer;
WriteString2File($sfile,$dumpsql);
$db->free($sql);
$data=array(
'c'=>'BackupDatabaseFileSize',
'phome'=>'BakExe',
't'=>$t,
's'=>$s,
'p'=>$p,
'mypath'=>$mypath,
'alltotal'=>$num,
'thenof'=>$noautof,
'fieldnum'=>$fieldnum,
'stime'=>$stime,
'waitbaktime'=>$waitbaktime,
'collation'=>$collation
);
echo json_encode($data);die;
}
}
if(empty($p)||$b==1){
$p++;
$sfile=$path."/".$btb[$t]."_".$p.".php";
$dumpsql=$header.$dumpsql.$footer;
WriteString2File($sfile,$dumpsql);
}
FetchFileNumber($p,$btb[$t],$path);
$t++;
$db->free($sql);
$data=array(
'c'=>'BackupDatabaseFileSize',
'phome'=>'BakExe',
't'=>$t,
's'=>0,
'p'=>0,
'mypath'=>$mypath,
'stime'=>$stime,
'waitbaktime'=>$waitbaktime
);
echo json_encode($data);
exit();
}
function BackupDatabaseRecordNum($t,$s,$p,$mypath,$alltotal,$thenof,$fnum,$auf='',$aufval=0,$stime=0){
global $db,$bakpath,$limittype,$fun_r,$adminDir;
if(empty($mypath)){
}
$path=PLUS_PATH.'/bdata/'.$mypath;
@include($path."/config.php");
if(empty($b_table)){
}
$waitbaktime=(int)$_GET['waitbaktime'];
if(empty($stime)){
$stime=time();
}
$header="";
$btb=explode(",",$b_table);
$count=count($btb);
$t=(int)$t;
$s=(int)$s;
$p=(int)$p;
if($t>=$count){
echo"";
exit();
}
$u=$db->query("use `$b_dbname`");
$dumpsql = '';
if($b_dbchar=='auto'){
if(!empty($s)){
$status_r=GetTableRows($b_dbname,$btb[$t]);
$collation=GetCharset($status_r['Collation']);
SetCharset($collation);
$num=$limittype?-1:$status_r['Rows'];
}else{
$collation=$_GET['collation'];
SetCharset($collation);
$num=(int)$alltotal;
}
$dumpsql.=ExcuteSetCharset($collation);
}else{
SetCharset($b_dbchar);
if(!empty($s)){
if($limittype){
$num=-1;
}else{
$status_r=GetTableRows($b_dbname,$btb[$t]);
$num=$status_r['Rows'];
}
}else{
$num=(int)$alltotal;
}
}
if($b_stru&&$s){
$dumpsql.=GetTableStructSql($btb[$t],$b_strufour);
}
if(empty($fnum)){
$return_fr=GetTableFields($b_dbname,$btb[$t],$b_autofield);
$fieldnum=$return_fr['num'];
$noautof=$return_fr['autof'];
$auf=$return_fr['auf'];
}else{
$fieldnum=$fnum;
$noautof=$thenof;
}
$aufval=(int)$aufval;
if($b_autoauf==1&&$auf){
$sql=$db->query("select * from `".$btb[$t]."` where ".$auf.">".$aufval." order by ".$auf." limit $b_bakline");
}else{
$sql=$db->query("select * from `".$btb[$t]."` limit $s,$b_bakline");
}
$inf='';
if($b_beover==1){
$inf='('.GetTableInsertFields($b_dbname,$btb[$t]).')';
}
$hexf='';
if($b_bakdatatype==1){
$hexf=GetTableStringFields($b_dbname,$btb[$t]);
}
$b=0;
while($r=$db->fetch($sql)){
if($auf){
$lastaufval=$r[$auf];
}
$b=1;
$s++;
$dumpsql.="ExcuteSQL(\"into `".$btb[$t]."`".$inf." values(";
$first=1;
for($i=0;$i<$fieldnum;$i++){
if(empty($first)){
$dumpsql.=',';
}else{
$first=0;
}
$myi=$i+1;
if(!isset($r[$i])||strstr($noautof,','.$myi.',')){
$dumpsql.='NULL';
}else{
$dumpsql.=GetFieldContent($r[$i],$b_bakdatatype,$myi,$hexf);
}
}
$dumpsql.=");\");\r\n";
}
if(empty($b)){
if(empty($p)){
$p++;
$sfile=$path."/".$btb[$t]."_".$p.".php";
$dumpsql=$header.$dumpsql.$footer;
WriteString2File($sfile,$dumpsql);
}
FetchFileNumber($p,$btb[$t],$path);
$t++;
$db->free($sql);
echo"".$fun_r['OneTableBakSuccOne'].$btb[$t-1].$fun_r['OneTableBakSuccTwo'];
exit();
}
$p++;
$sfile=$path."/".$btb[$t]."_".$p.".php";
$dumpsql=$header.$dumpsql.$footer;
WriteString2File($sfile,$dumpsql);
$db->free($sql);
echo"".$fun_r['BakOneDataSuccess'].EchoBackupProcesser($btb[$t],$count,$t,$num,$s);
exit();
}
function EchoBackupProcesser($tbname,$tbnum,$tb,$rnum,$r){
$table=($tb+1).'/'.$tbnum;
$record=$r;
if($rnum!=-1){
$record=$r.'/'.$rnum;
}
}
function EchoRecoverProcesser($tbname,$tbnum,$tb,$pnum,$p){
$table=($tb+1).'/'.$tbnum;
$record=$p.'/'.$pnum;
}
function GetTableRows($dbname,$tbname){
global $db;
$tr=$db->DB_query_all("SHOW TABLE STATUS LIKE '".$tbname."';");
return $tr;
}
function GetCharset($char){
global $db;
if(empty($char)){
return '';
}
$r=$db->DB_query_all("SHOW COLLATION LIKE '".$char."';");
return $r[0]['Charset'];
}
function GetTableFields($dbname,$tbname,$autofield){
global $db;
$sql=$db->query("SHOW FIELDS FROM `".$tbname."`");
$i=0;
$autof=",";
$f='';
while($r=$db->fetch_array_old($sql)){
$i++;
if(strstr($autofield,",".$tbname.".".$r[Field].",")){
$autof.=$i.",";
}
if($r['Extra']=='auto_increment'){
$f=$r['Field'];
}
}
$return_r['num']=$i;
$return_r['autof']=$autof;
$return_r['auf']=$f;
return $return_r;
}
function GetTableInsertFields($dbname,$tbname){
global $db;
$sql=$db->query("SHOW FIELDS FROM `".$tbname."`");
$f='';
$dh='';
while($r=$db->fetch($sql)){
$f.=$dh.'`'.$r['Field'].'`';
$dh=',';
}
return $f;
}
function GetTableStringFields($dbname,$tbname){
global $db;
$sql=$db->query("SHOW FIELDS FROM `".$tbname."`");
$i=0;
$f='';
$dh='';
while($r=$db->fetch($sql)){
$i++;
if(!(stristr($r[Type],'char')||stristr($r[Type],'text'))){
continue;
}
$f.=$dh.$i;
$dh=',';
}
if($f){
$f=','.$f.',';
}
return $f;
}
function EscapeString($str){
global $db;
$str=$db->escape_string($str);
$str=str_replace('\\\'','\'\'',$str);
$str=str_replace("\\\\","\\\\\\\\",$str);
$str=str_replace('$','\$',$str);
return $str;
}
function GetFieldContent($str,$bakdatatype,$i,$tbstrf){
if($bakdatatype==1&&!empty($str)&&strstr($tbstrf,','.$i.',')){
$restr='0x'.bin2hex($str);
}else{
$restr='\''.EscapeString($str).'\'';
}
return $restr;
}
function FetchFileNumber($p,$table,$path){
if(empty($p)){$p=0;}
$file=$path."/config.php";
$text=ReadFileContent($file);
$rep1="\$tb[".$table."]=0;";
$rep2="\$tb[".$table."]=".$p.";";
$text=str_replace($rep1,$rep2,$text);
WriteString2File($file,$text);
}
function ExcuteSQL($sql){
global $db;
$db->query($sql);
}
function CreateTable($sql){
global $db;
$db->query(FetchDbcharset($sql));
}
function Convert2Mysql4($query){
$exp="ENGINE=";
if(!strstr($query,$exp)){
return $query;
}
$exp1=" ";
$r=explode($exp,$query);
$r1=explode($exp1,$r[1]);
$returnquery=$r[0]."TYPE=".$r1[0];
return $returnquery;
}
function GetTableStructSql($table,$strufour){
global $db;
$dumpsql ="ExcuteSQL(\"DROP TABLE IF EXISTS `".$table."`;\");\r\n";
$usql=$db->query("SET SQL_QUOTE_SHOW_CREATE=1;");
$CreatTable = $db->query("SHOW CREATE TABLE $table");
$r=$db->fetch_array_old($CreatTable);
$create=str_replace("\"","\\\"",$r[1]);
if($strufour){
$create=Convert2Mysql4($create);
}
$dumpsql.="CreateTable(\"".$create."\");\r\n";
return $dumpsql;
}
function ExcuteSetCharset($char){
if(empty($char)){
return '';
}
$dumpsql="ExcuteSQL('set names \'".$char."\'');\r\n";
return $dumpsql;
}
function DeleteDbcharset($sql){
global $phpyun_db_ver;
if($phpyun_db_ver=='4.0'&&strstr($sql,' character set ')){
$preg_str="/ character set (.+?) collate (.+?) /is";
$sql=preg_replace($preg_str,' ',$sql);
}
return $sql;
}
function FetchDbcharset($sql){
global $phpyun_db_ver,$phpyun_db_char,$b_dbchar;
if($phpyun_db_ver>='4.1'&&!strstr($sql,'ENGINE=')&&($phpyun_db_char||$b_dbchar)&&$b_dbchar!='auto'){
$dbcharset=$b_dbchar?$b_dbchar:$phpyun_db_char;
$sql=GetCreateTableSql($sql,$phpyun_db_ver,$dbcharset);
}elseif($phpyun_db_ver=='4.0'&&strstr($sql,'ENGINE=')){
$sql=Convert2Mysql4($sql);
}
$sql=DeleteDbcharset($sql);
return $sql;
}
function GetCreateTableSql($sql,$mysqlver,$dbcharset){
$type=strtoupper(preg_replace("/^\s*CREATE TABLE\s+.+\s+\(.+?\).*(ENGINE|TYPE)\s*=\s*([a-z]+?).*$/isU","\\2",$sql));
$type=in_array($type,array('MYISAM','HEAP'))?$type:'MYISAM';
return preg_replace("/^\s*(CREATE TABLE\s+.+\s+\(.+?\)).*$/isU","\\1",$sql).
($mysqlver>='4.1'?" ENGINE=$type DEFAULT CHARSET=$dbcharset":" TYPE=$type");
}
function RecoverData($add,$mypath){
global $db,$bakpath,$config;
if(empty($mypath)||empty($add[mydbname])){
}
$path=PLUS_PATH.'/bdata/'.$mypath;
if(!file_exists($path)){
}
@include($path."/config.php");
if(empty($b_table)){
}
$waitbaktime=(int)$add['waitbaktime'];
$btb=explode(",",$b_table);
$nfile='data/plus/bdata/'.$mypath."/".$btb[0]."_1.php?t=0&p=0&mydbname=$add[mydbname]&mypath=$mypath&waitbaktime=$waitbaktime";
Header("Location:".$config['sy_weburl']."/$nfile");
exit();
}
?>