• User Attivo

    Esportazione DB, consigli su ottimizzazione codice sorgente

    Salve a tutti, ho scritto una classe php che esporta la struttura e i dati di un DB in un file .sql.
    La classe in questione utilizza l'information schema quindi non funziona con DB che non lo supportano.
    Da notare che la classe in questione utilizza un altra classe per eseguire effettivamente le query al DB, non richiede parametri ma l' ho scritta per un mio DB in cui mi servivano solo le tabelle che iniziavano con zz_NOMETABELLA.
    Posto il codice, volevo sapere dagli esperti come può essere ottimizzato,se sarebbe meglio cambiare logica lasciando stare l'information schema, se a livelli di tempi di esecuzione, considerando eventualmente DB di grosse dimensioni risulterebbe lento e macchinoso e via dicendo, insomma pareri e consigli...

    
    <?php 
    	class cDB_Export{
    
    		 
    		var $file_content=null;
    		function __construct(){
    			$tot_tables = $this->sel_count();
    			$val_tables = $this->sel_name();
    			
    			for($b = 0; $b<$tot_tables[0]['tot']; $b++){
    				$structure_table = $this->get_StructureTable($val_tables**["TABLE_NAME"]);
    				
    				$this->CreateTable_query($structure_table,$val_tables**["TABLE_NAME"]);
    				$this->file_content .= "\n";
    				$this->CreateInsert_query($structure_table,$val_tables**["TABLE_NAME"]);
    				$this->file_content .= "\n\n";
    				$this->file_content .= "----------------------------------------------------------------------------------------------------\n\n";
    			}
    			
    			$this->save_on_file();
    			$this->create_zip_file();
    			echo "operazione terminata";
    		}
    		
    		function __destruct(){}
    
    		public function __get($valore){
    			return $this->value[$valore];
    		}
    
    		public function __set($attributo, $valore){
    			/*$ut = new scUtility();
    			$ut->str = $valore;
    			$this->value[$attributo] = $ut->check_input();*/
    		}
    
    		//FIRST STEP - get table structure
    		private function get_StructureTable($tbl_name){
    			$conn = new scConnect();
    			$conn->stampa = false;
    
    			$conn->query = " DESCRIBE " . $tbl_name . " ";
    			$conn->descrizione = "describe table";
    
    			$val = $conn->select();
    			unset($conn);
    			return $val;
    		}
    		
    		//SECOND STEP - "create the 'create query'"
    		private function CreateTable_query($tbl_structure,$tbl_name){
    			$create_query = "DROP TABLE IF EXISTS `" . $tbl_name . "`; CREATE TABLE IF NOT EXISTS `" . $tbl_name . "` (\n";
    			
    			for($i=0; $i<count($tbl_structure); $i++){
    				if(($tbl_structure*['Null'] == "no") || ($tbl_structure*['Null'] == "NO")){	
    					$create_query .= "`" . $tbl_structure*['Field'] . "` " . $tbl_structure*['Type'] . " NOT NULL ";	
    				}else{
    					$create_query .= "`" . $tbl_structure*['Field'] . "` " . $tbl_structure*['Type'] . " DEFAULT NULL " ;
    				}
    				
    				if(($tbl_structure*['Key'] == "pri") || ($tbl_structure*['Key'] == "PRI"))
    					$create_query .= " PRIMARY KEY " . $tbl_structure*['Extra'];
    				
    				if($i < count($tbl_structure)-1)
    					$create_query .= ",";
    				
    				$create_query .= "\n";
    			}
    			$create_query .= ")  ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;";
    			$this->file_content .= $create_query;
    		}
    		
    		//THIRD STEP - create the insert query of the values
    		private function CreateInsert_query($tbl_structure,$tbl_name){
    			$conn = new scConnect();
    			$conn->stampa = false;
    			
    			$insert_query = "";
    			
    			$conn->query = "SELECT COUNT(*) AS tot FROM " . $tbl_name;
    			$conn->descrizione = "SELECT COUNT";
    			$val_tot = $conn->select();
    			
    			$conn->query = "SELECT * FROM " . $tbl_name;
    			$conn->descrizione = "SELECT *";
    			$val = $conn->select();
    			
    			for($ii=0; $ii<$val_tot[0]['tot']; $ii++){
    				$appoggio_query = "INSERT INTO " . $tbl_name . "(";
    				
    				for($i=0; $i<count($tbl_structure); $i++){
    					$appoggio_query .= " " . $tbl_structure*['Field'] ;
    					
    					if($i < count($tbl_structure)-1)
    						$appoggio_query .= ",";
    					else
    						$appoggio_query .= ") VALUES ( ";
    				}	
    				
    				for($a=0; $a<count($tbl_structure); $a++){
    					$appoggio_query .= "'" . $val[$ii][$a] . "'";
    					if($a < count($tbl_structure)-1)
    						$appoggio_query .= ",";
    					else
    						$appoggio_query .= ")";
    				}
    				
    				$insert_query .= $appoggio_query . "\n\n"; 
    			}
    			
    			$this->file_content .= $insert_query;
     			unset($conn);
    		}
    		
    		private function save_on_file(){
    			$myFile = $this->today_date() . "_BACKUP_DB.sql";
    			$fh = fopen($myFile, 'w') or die("can't open file");
    			fwrite($fh, $this->file_content);
    			fclose($fh);
    		}
    		
    		private function sel_count(){
    			$conn = new scConnect();
    			$conn->stampa = false;
    			$conn->query = "SELECT COUNT(*) AS tot FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE 'zz_%'";
    			$conn->descrizione = "select tot elenco table";
    			return $conn->select();
    		}
    		
    		private function sel_name(){
    			$conn = new scConnect();
    			$conn->stampa = false;
    			$conn->query = "SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME LIKE 'zz_%'";
    			$conn->descrizione = "select elenco table";
    			return $conn->select();
    		}
    		
    		private function create_zip_file(){
    			$data = $this->today_date();
    			
    			$backupFile = $data . "_BACKUP_DB.zip";
    			//Se esiste già, lo cancello  
    			if (file_exists($backupFile)) @unlink($backupFile);  
    			
    			$archive = new PclZip($backupFile);  
    			//Una lista di nomi di files da comprimere  
    			$listOfFilesToCompress = $data . "_BACKUP_DB.sql";  
    			//Aggiungo i files all'archivio  
    			$v_list = $archive->add($listOfFilesToCompress);  
    			if ($v_list == 0) {  
    				die("Error : ".$archive->errorInfo(true));  
    			}  
    			
    			unlink($listOfFilesToCompress);
    		}
    		
    		private function today_date(){
    			$data = date ("d/m/Y");
    			$appoggio = split("/", $data);
    			return $appoggio[0] . "" . $appoggio[1] . "" . $appoggio[2];
    		}
    	}
    ?>