<?php
$sNomeIdJan1 = 'iJan_Backup_Princ';
$sCorBarraInf = '#E8E3CE';
$sCaminho_Dir = GETCWD().'/Backups';
$nTempoMaximo = 120;      // Tempo máximo de espera 2 minutos
//
//  *** ***
If ( $sSubModulo=="*****" ) {
//
//  ** TELA PRINCIPAL DO BACKUP **
} Else {
    // Criar objeto Janela
    $oJanelaPrinc = New R_Janela();
    $oJanelaPrinc->sIdObj  = $sNomeIdJan1; 
    $oJanelaPrinc->nTop    = 40;
    $oJanelaPrinc->nLeft   = 5;
    $oJanelaPrinc->nWidth  = 400;   // Largura
    $oJanelaPrinc->nHeight = 0;     // Altura
	$oJanelaPrinc->nLeft  += ($nTela_W/2)-($oJanelaPrinc->nWidth/2);
    $oJanelaPrinc->sTitulo = 'Backup do sistema';
	//
	$sJavaTravarJ = "document.getElementById('".$oJanelaPrinc->sIdObj."_Travar').style.visibility='visible'; ";
    $sPulaLinha = CHR(13).CHR(10);
	//
    // Preparar para gerar o backup
    If ( $sAcao=="BKP_1" ) {
	   //
	   // Antes de efetuar backup verificar tamanho das tabelas, quando a tabela ultrapassar 2Mb colocar ela em arquivo SQL separado
	   // SELECT table_name AS Tabela, (data_length + index_length) As Tamanho FROM information_schema.TABLES WHERE table_schema = "ecook_dados_sange" ORDER BY (data_length + index_length) DESC;
	   @$aSessao[$sModulo.'_St_Backup'] = 0;
	   //
       $sRet_Javs .=
	       "parent.JanEspera(true,'Iniciando o backup de dados do sistema, aguarde...');".
		   "setTimeout( function () { ".		   
		      "var vff = parent.document.forms.fmPBackup_R2;".
		      "vff.acao.value='BKP_2'; ".
		      "vff.submit();".
		   "}, 1000);".
		   "setTimeout( function () { ".
	          "parent.JanEspera(false);".
              "parent.Alerta_Simples(".JAVA_CharCode("O servidor não respondeu há tempo para gerar o backup.").",1,'Erro no backup');".
		      "var vff = parent.document.forms.fmPBackup_R;".
		      "vff.acao.value='AT'; ".
		      "vff.submit();".
		   "}, ".($nTempoMaximo*1000).");".
		   "".
		   "";
    //
    // Gerar o backup
    } ElseIf ( $sAcao=="BKP_2" ) {
	   SET_TIME_LIMIT($nTempoMaximo);    // Tempo de execução do PHP
   	   // Verifica pasta temporaria
       If ( ! IS_DIR( $sCaminho_Dir ) ) {
          MKDIR( $sCaminho_Dir );
       }
	   // Nome e caminho do arquivo ZIP
	   $sArq_Zip = $sCaminho_Dir.'/db-backup-'.DATE("d-m-Y_H-s-i").'.zip';
	   //
	   $a_Lista_Se = @$aSessao[$sModulo.'_Lista_Se'];
	   $a_Lista_Ju = @$aSessao[$sModulo.'_Lista_Ju'];
	   $a_Lista_Aq = @$aSessao[$sModulo.'_Lista_Aq'];
	   $s_Mensagem = "Efetuando o backup de dados do sistema [PERCENTUAL]...";
	   //
	   // Coletar informações da tabela
	   If ( @$aSessao[$sModulo.'_St_Backup']==0 ) {
	      $sScript_SQL = 
	        'SELECT '.
		       'table_name '.               'AS Tabela ,'.
               '(data_length + index_length) AS Tamanho '.
		    'FROM information_schema.TABLES '.
		    'WHERE table_schema = "'.$aSessao['BD_APONTADO_ACESSO'].'" '.
		    'ORDER BY (data_length + index_length) DESC '.
	        ";";
          $v_Rows = MYSQL_QUERY($sScript_SQL);
	      $a_Lista_Se = ARRAY();
	      $a_Lista_Ju = ARRAY();
          While( $a_Row = MYSQL_FETCH_ARRAY($v_Rows,MYSQL_ASSOC) ) {
		    If ( $a_Row['Tamanho'] >= (2*1024*1024) ) {
      	       $a_Lista_Se[] = $a_Row;
		    } Else {
      	       $a_Lista_Ju[] = $a_Row;
		    }
          }
		  $aSessao[$sModulo.'_Lista_Se'] = $a_Lista_Se;
		  $aSessao[$sModulo.'_Lista_Ju'] = $a_Lista_Ju;
		  $aSessao[$sModulo.'_Lista_Aq'] = ARRAY();
		  $aSessao[$sModulo.'_St_Backup'] = 1;
		  $aSessao[$sModulo.'_Se_Backup'] = 0;
		  $s_Mensagem = STR_REPLACE("[PERCENTUAL]","1 %",$s_Mensagem);
		  //
	   // Gerar backup das tabelas no mesmo arquivo
	   } ElseIf ( @$aSessao[$sModulo.'_St_Backup']==1 ) {
	      // Nome e caminho dos arquivos
	      $sArq_Tmp = $sCaminho_Dir.'/db-backup-'.DATE("d-m-Y_H-s-i").'.tmp';
	      $sArq_Sql = 'db-backup-'.DATE("d-m-Y_H-s-i").'.sql';
	      // Gerar o script SQL
          $nHandleArqTmp = FOPEN($sArq_Tmp,'w+');                    // Criar arquivo temporário
	      $sScript_SQL = 
	         'CREATE DATABASE IF NOT EXISTS ecook;'.$sPulaLinha.
		     'USE ecook;'.$sPulaLinha.
             'DROP TABLE IF EXISTS cad_acesso;'.$sPulaLinha.
             'CREATE TABLE cad_acesso ('.
               'ACS_CODIGOI int(8) NOT NULL,'.
               'ACS_APELID char(16) NOT NULL,'.
               'ACS_NOMEBD varchar(40) NOT NULL,'.
               'PRIMARY KEY (ACS_CODIGOI)'.
             ') ENGINE=MyISAM DEFAULT CHARSET=latin1;'.$sPulaLinha.
		     "INSERT INTO cad_acesso (ACS_CODIGOI,ACS_APELID,ACS_NOMEBD) values (".$aSessao['LOG_ACS_CODIGOI'].",'".$aSessao['LOG_ACS_APELIDO']."','ecook_dados');".$sPulaLinha.
	         'CREATE DATABASE IF NOT EXISTS ecook_dados;'.$sPulaLinha.
		     'USE ecook_dados;'.$sPulaLinha.
		     '';
	      //
		  $s_Lista_Ju = '';
		  ForEach ( $a_Lista_Ju As $a_Item_Ju ) {
			 $s_Lista_Ju .= ( EMPTY($s_Lista_Ju) ? "" : "," ).$a_Item_Ju['Tabela'];
		  }
          FWRITE($nHandleArqTmp,$sScript_SQL);                       // Gravar script inicial
		  If ( ! EMPTY($s_Lista_Ju) ) {
	         Ext_Tabelas_SQL($s_Lista_Ju,$nHandleArqTmp);            // Gerar script e gravar direto no arquivo temporiario
		  }
          FCLOSE($nHandleArqTmp);
		  $aSessao[$sModulo.'_Lista_Aq'][] = ARRAY( $sArq_Tmp, $sArq_Sql );
	      //
		  $aSessao[$sModulo.'_St_Backup'] = 2;
		  $s_Mensagem = STR_REPLACE("[PERCENTUAL]","2 %",$s_Mensagem);
		  //
	   // Gerar backup das tabelas em arquivos separados
	   } ElseIf ( @$aSessao[$sModulo.'_St_Backup']==2 ) {
		  //
		  $n_Se_Backup = @$aSessao[$sModulo.'_Se_Backup']+0;
		  If ( $n_Se_Backup==COUNT($a_Lista_Se) ) {
		     $s_Mensagem = "Compactando backup...";
		     $aSessao[$sModulo.'_St_Backup'] = 97;
			 //
		  } Else {
			 //
			 $s_Tabela = $a_Lista_Se[$n_Se_Backup]['Tabela'];
	         $sArq_Tmp = $sCaminho_Dir.'/db-backup-'.DATE("d-m-Y_H-s-i").'_'.$s_Tabela.'.tmp';
	         $sArq_Sql = 'db-backup-'.DATE("d-m-Y_H-s-i").'_'.$s_Tabela.'.sql';
	         // Gerar o script SQL
             $nHandleArqTmp = FOPEN($sArq_Tmp,'w+');                    // Criar arquivo temporário
	         Ext_Tabelas_SQL($s_Tabela,$nHandleArqTmp);                 // Gerar script e gravar direto no arquivo temporiario
             FCLOSE($nHandleArqTmp);
			 $n_Se_Backup++;
			 $aSessao[$sModulo.'_Se_Backup'] = $n_Se_Backup;
		     $aSessao[$sModulo.'_Lista_Aq'][] = ARRAY( $sArq_Tmp, $sArq_Sql );
			 //
		     $s_Mensagem = STR_REPLACE("[PERCENTUAL]",ROUND( ($n_Se_Backup/COUNT($a_Lista_Se))*100 ,0)." %",$s_Mensagem);
			 //
		  }
	      //
	   // Compactar Backup
       } ElseIf ( $aSessao[$sModulo.'_St_Backup']==97 ) {
		  // Compactar
          If ( FILE_EXISTS($sArq_Zip) ) { UNLINK($sArq_Zip); }
	      $oArq_Zip = new ZipArchive();
          If ( $oArq_Zip->open($sArq_Zip, ZIPARCHIVE::CREATE) ) {
	         //$oArq_Zip->setPassword('Simsoft');    // ANDRE: está função coloca senha no arquivo ZIP mas só funciona apartir do PHP 5.6
		     ForEach( $a_Lista_Aq As $a_Item_Aq ) {
                $oArq_Zip->addFile($a_Item_Aq[0],$a_Item_Aq[1]);
			 }
             //$oArq_Zip->addFile($sArq_Tmp,'Banco_de_Dados.sql');
          } Else {
		     $sRet_Javs .= Info_Evento('ALERTA: Não foi possível criar o arquivo compactado',1);
          }
          $oArq_Zip->close();
		  //
		  ForEach( $a_Lista_Aq As $a_Item_Aq ) {
             If ( FILE_EXISTS($a_Item_Aq[0]) ) { UNLINK($a_Item_Aq[0]); }
          }
		  $aSessao[$sModulo.'_St_Backup'] = 98;
          $s_Mensagem = "Finalizando backup...";
		  //
	   //
	   // Finalizar
       } ElseIf ( $aSessao[$sModulo.'_St_Backup']==98 ) {
		  //
		  $aSessao[$sModulo.'_St_Backup'] = 99;
		  //
       }
	   //
	   // Fim do Backup
       If ( $aSessao[$sModulo.'_St_Backup']==99 ) {
	      //
          $sRet_Javs .=
		      "setTimeout( function () { ".		   
	            "parent.JanEspera(false);".
		        "var vff = parent.document.forms.fmPBackup_R;".
		        "vff.acao.value='AT'; ".
		        "vff.submit();".
		      "}, 1500);".
              "";
		  //
	   // Continuar com o Backup
	   } Else {
	      //
          $sRet_Javs .=
	       "parent.JanEspera(true,'".$s_Mensagem."');".
		   "setTimeout( function () { ".		   
		      "var vff = parent.document.forms.fmPBackup_R;".
		      "vff.acao.value='BKP_2'; ".
		      "vff.submit();".
		   "}, 10);".
		   "";
	      //
	   }
	   //
    //
    // Atualizar lista
    } ElseIf ( $sAcao=="AT" ) {
	   //
	   $aArq_Nome = ARRAY();
	   $aArq_Data = ARRAY();
       If ( IS_DIR( $sCaminho_Dir ) ) {
	      $aListaArqs = DIR($sCaminho_Dir);
	      While ( $sArquivo = $aListaArqs->READ() ){
	          If ( STRLEN($sArquivo)>3) {
		         $nArq_DtHr = FILEMTIME($sCaminho_Dir.'/'.$sArquivo);
		   	     $aArq_Nome[] = $sArquivo;
		   	     $aArq_Data[] = $nArq_DtHr;
		      }
          }
	      ARSORT($aArq_Data);    // Ordem decrescente pelo valo
	   }
	   //
	   $sListaHtml = '';
	   $nContador = 0;
	   FOREACH ( $aArq_Data as $nPosicao => $nArq_DtHr ) {
	       If ($nContador==30) { BREAK; }
	       $nContador++;
	       $sArquivo = $aArq_Nome[$nPosicao];
           $sOnClkJav =
              "var vff = parent.document.forms.fmPBackup_R2;".
              "vff.acao.value='PUXAR_ARQ'; ".
              "vff.ARQ.value='".$sArquivo."'; ".
              "vff.submit();".
              "";
           $sListaHtml .=
              '<table>'.
               '<tr>'.
                '<td align="right" width="40px">'.
                 '<img src="./images/img_db_down.png" border="0" width="26px" height="26px" title="Baixar e salvar." onclick="'.$sOnClkJav.'" style="cursor:pointer;">'.
                '</td>'.
                '<td style="font-size:13px;" valign="middle" valign="middle">'.
                 "&nbsp;&nbsp;".DATE("d/m/Y H:i:s",$nArq_DtHr).
           	    '</td>'.
           	   '</tr>'.
              '</table>';
	   }
	   SQLVarConfigG( 'DATA_ULT_BKP', DATE("Y-m-d") );
       $sRet_Javs .=
	      'parent.document.getElementById("dv_BackupLista").innerHTML='.JAVA_CharCode($sListaHtml).';'.
		  "";
    //
    // Baixar Arquivo
    } ElseIf ( $sAcao=="PUXAR_ARQ" ) {
	   If ( @$aSessao['BACKUP_ABERTO'] ) {
	      $sArquivo = @$_POST['ARQ'];
	      HEADER("Content-Type: application/sql");
	      HEADER("Content-Length: ".FILESIZE($sCaminho_Dir.'/'.$sArquivo));
	      HEADER("Content-Disposition: attachment; filename=".$sArquivo);
	      READFILE($sCaminho_Dir.'/'.$sArquivo);
	      EXIT;
	   }
    //
    // FECHAR
    } ElseIf ( $sAcao=="FECHAR" ) {
	   $aSessao['BACKUP_ABERTO'] = False;
       $sRet_Javs .=
	      'parent.document.getElementById("dv_MenuL_Barra").style.visibility="visible";'.
	      "parent.RmElem('".$oJanelaPrinc->sIdObj."');".
	      "parent.Car_".$sNomeAcesso."2.location.href='about:blank';".
	      "parent.Car_".$sNomeAcesso."1.location.href='about:blank';".
		  "";
    //
    // JANELA TELA PRINCIPAL
	} Else {
	   $aSessao['BACKUP_ABERTO'] = True;
	   //
	   $oJanelaPrinc->sJavOnClickF =
	       "document.forms.fmPBackup_R.acao.value='FECHAR'; ".
           "document.forms.fmPBackup_R.submit();";
	   //$oJanelaPrinc->sJavKeyDown = "return Car_".$sNomeAcesso."1.Teclas_F(this,event);";
	   //
       // Tela HTML
       $sRet_TelaJ_HTML =
    	  $oJanelaPrinc->MontaJanHTML(True).
          '<form name="fmPBackup_R" accept-charset="utf-8" method="post" action="./car_js.php" target="car_'.$sNomeAcesso.'2">'.
           '<input name="mod" type="hidden" value="'.$sModulo.'">'.
           '<input name="submod" type="hidden" value="'.$sSubModulo.'">'.
           '<input name="acao" type="hidden" value="">'.
    	   '<input name="nomeacs" type="hidden" value="'.$sNomeAcesso.'">'.
          '</form>'.
          '<form name="fmPBackup_R2" accept-charset="utf-8" method="post" action="./car_js.php" target="car_'.$sNomeAcesso.'3">'.
           '<input name="mod" type="hidden" value="'.$sModulo.'">'.
           '<input name="submod" type="hidden" value="'.$sSubModulo.'">'.
           '<input name="acao" type="hidden" value="">'.
           '<input name="ARQ" type="hidden" value="">'.
    	   '<input name="nomeacs" type="hidden" value="'.$sNomeAcesso.'">'.
          '</form>'.
		  '<table border="0">'.
		   '<tr>'.
		    '<td>'.
		     '&nbsp;&nbsp;&nbsp;Lista dos backups efetuados:'.
			 '<div id="dv_BackupLista" style="width:380px; height:200px; overflow:auto;">'.
			 '</div>'.
		    '</td>'.
		   '</tr>'.
		  '</table>'.
		  //
          '<table width="100%" style="background-color:'.$sCorBarraInf.';"></tr>'.
           '<td width="4px" height="40px">&nbsp;</td>'.
           '<td align="left">'.
            HTML_Botao( 3, 'objBackup_BT_Bkp', "var vff = document.forms.fmPBackup_R;".
		                                       "vff.acao.value='BKP_1'; ".
                                               "vff.submit();".
											   //$sJavaTravarJ.
											   ""
                         , 'Gerar backup' ,'images/btimg_bd_add.png').
		   '</td>'.
           '<td align="right">'.
            HTML_Botao( 3, 'objBackup_BT_Fch', $oJanelaPrinc->sJavOnClickF
                         , 'Sair' ,'images/btimg_fechar.png').		    
		   '</td>'.
           '<td width="4px">&nbsp;</td>'.
		   '</tr></table>'.		   
		  //
     	  $oJanelaPrinc->MontaJanHTML(False);
       //
	   // Java anterior
       $sRet_Javs .=
	      'parent.document.getElementById("dv_MenuL_Barra").style.visibility="hidden";'.
	      "";
       // Java posterior
       $sRet_JavsPos .=
          "var vff = parent.document.forms.fmPBackup_R;".
          "vff.acao.value='AT'; ".
          "vff.submit();".
	      "";
    }
}
//
Function Ext_Tabelas_SQL($tables = '*', $nHandle=0) {
	Global $aSessao;
	//
	//get all of the tables
	If ($tables == '*')	{
		$tables = ARRAY();
		$result = MYSQL_QUERY('SHOW TABLES');
		While($row = mysql_fetch_row($result)) {
			$tables[] = $row[0];
		}
	} Else {
		$tables = is_array($tables) ? $tables : explode(',',$tables);
	}
	// Capturar triggers
	$r_Triggers = MYSQL_QUERY('SHOW TRIGGERS;');
	$a_Triggers = ARRAY();
	While ( $a_Trigger = MYSQL_FETCH_ARRAY($r_Triggers, MYSQL_ASSOC) ) {
	   $a_Triggers[$a_Trigger['Table']][$a_Trigger['Trigger']] = $a_Trigger;
	}
	//
	$return = '';
	//cycle through
	FOREACH ($tables as $table)	{
		$result = MYSQL_QUERY('SELECT * FROM '.$table);
		$num_fields = MYSQL_NUM_FIELDS($result);
		$return.= 'DROP TABLE IF EXISTS '.$table.';';
		$row2 = MYSQL_FETCH_ROW(MYSQL_QUERY('SHOW CREATE TABLE '.$table));
		$return.= "\n\n".$row2[1].";\n\n";
        If ( $nHandle>0 ) {
           FWRITE($nHandle,$return);
		   $return = '';
	    }
		For ($i = 0; $i < $num_fields; $i++) {
		    $nComprimentoLinha = 0;
			While ($row = MYSQL_FETCH_ROW($result)) {
				//$return.= 'INSERT INTO '.$table.' VALUES(';
				If ( $nComprimentoLinha==0 ) { $return .= 'INSERT INTO '.$table; $nComprimentoLinha += 30; }
				$return .= ' VALUES(';
				$nComprimentoLinha += 10;
				For ($j=0; $j<$num_fields; $j++) {
                    //$row[$j] = ereg_replace("\n","\\n",$row[$j]);
                    //$row[$j] = PREG_REPLACE("\n","\\n",$row[$j]);
					$sDadosColuna = '';
                    If ( ISSET($row[$j]) ) {
                       If ( STRLEN($row[$j])>1000 ) {
                          $sDadosColuna = SQL_Bin($row[$j]);
                       } Else {
                          $sDadosC = ADDSLASHES($row[$j]);
                          $sDadosColuna = '"'.$sDadosC.'"' ;
                       }
                    } Else {
                       $sDadosColuna = '""';
                    }
					$return .= $sDadosColuna;
                    If ($j<($num_fields-1)) { $return.= ','; }
			        $nComprimentoLinha += STRLEN($sDadosColuna)+1;
				}
				$return .= ")";
				If ( $nComprimentoLinha>200000 Or $j==$num_fields ) { $nComprimentoLinha=0; }
				//
				If ( $nComprimentoLinha==0 ) { $return .= ";\n"; }
				//
                If ( $nHandle>0 ) {
                   FWRITE($nHandle,$return);
		           $return = '';
	            }
				//
			}
		}
		// Script de triggers
		If ( ! EMPTY( $a_Triggers[$table] ) ) {
		   $a_Lista_Trg = $a_Triggers[$table];
		   FOREACH ( $a_Lista_Trg As $a_Trigger ) {
              $return .=
			     "DELIMITER $$\n".
				 "DROP TRIGGER /*!50032 IF EXISTS */ ".$a_Trigger['Trigger']." $$\n".
                 "CREATE TRIGGER ".$a_Trigger['Trigger']." ".
                 $a_Trigger['Timing']." ".$a_Trigger['Event']." on ".$a_Trigger['Table']." ".
				 "\n".
                 "FOR EACH ROW ".
                 $a_Trigger['Statement'].
                 ";\n".
                 "$$\n".
				 "DELIMITER ;".
				 "\n";
		   }
		}
		$return .= "\n\n";
		//
        If ( $nHandle>0 ) {
           FWRITE($nHandle,$return);
		   $return = '';
	    }
		//
	}
	// Script de procedures
	$sSQL_Query =
	  "SELECT * ".
	  "FROM INFORMATION_SCHEMA.ROUTINES ".
	  "WHERE ".
	       "ROUTINE_SCHEMA = '".$aSessao['BD_APONTADO_ACESSO']."' ".
	   "AND ROUTINE_TYPE = 'PROCEDURE' ".
	  ";";
	$r_RegProcs = MYSQL_QUERY($sSQL_Query);
	While ( $a_Reg_Proc = MYSQL_FETCH_ARRAY($r_RegProcs, MYSQL_ASSOC) ) {
	   $s_Criar_Proc = MYSQL_QUERY("SHOW CREATE PROCEDURE ".$a_Reg_Proc['SPECIFIC_NAME'].";");
	   $s_Criar_Proc = MYSQL_FETCH_ARRAY($s_Criar_Proc, MYSQL_ASSOC);
	   $s_Criar_Proc = $s_Criar_Proc['Create Procedure'];
	   $return .=
          "/*!50003 DROP PROCEDURE IF EXISTS ".$a_Reg_Proc['SPECIFIC_NAME']." */;\n".
          "DELIMITER $$\n".
          //"/*!50003 CREATE DEFINER=`root`@`localhost` PROCEDURE `atualizacao_total_venda`(codigo_fat_geral int)\n".
          "/*!50003 ".$s_Criar_Proc.
          //$a_Reg_Proc['ROUTINE_DEFINITION']." */$$\n".
          " */$$\n".
          "DELIMITER ;\n".
	      "\n";
	}
	$return .= "\n";
	//
    If ( $nHandle>0 ) {
       FWRITE($nHandle,$return);
	   $return = '';
	}
    //
	Return $return;
}
//
?>