<?php 
	include_once('xml/XMLS.php'); 	
	

	//AbrirSalida();
	//Anula la salida de errores y warnings
	$old = error_reporting();
	error_reporting(0);	


	//Genera la salida en XML (El resultado)
	$result = new XML();
	$result->AgregarNodo("Result");
		
	
	
	//Obtienen los parametros pasado desde FLEX
	$xmlstr = "".$_POST['parameters']."";	
	
	
	
	$xml =simplexml_load_string($xmlstr);	
	
	
	
	$hostname = $xml->hostname;
	$database = $xml->database;
	$username = $xml->username;
	$password = $xml->password;
	//if($xml->mododebug == "false"){
		$mododebug = false;
	//}else{
	//	$mododebug = true;		
	//}

	if($xml->contransaccion == "false"){
		$contransaccion = false;
	}else{
		$contransaccion = true;		
		salida("Transaccion True");
	}

	
	$sqlCount = $xml->SqlCount;
	$LinksCount  = $xml->LinksCount;
	 
	$ResultPendiente ="";
	
	if($mododebug){
		salida($xmlstr);		
	}
	salida($xml->Links->LinkCount);
	salida($xml->Links);
	
	
	$Error = false;		
	$ErrorDesc = "";		
	$LastErrorNro = 0;
	$LastErrorDesc = "";		
	$LastID = 0;
		
		
	
	//conecta a la base
	$dbdatabase = mysql_connect($hostname, $username, $password);
	if ( !dbdatabase) {			
		$Error = true;		
		$ErrorDesc = "Error: No se pudo conectar a la base de datos";		
		$LastErrorNro = mysql_errno();
		$LastErrorDesc = mysql_error();		
	}
	
	//Si no hubo error selecciona el esquema 
	if(!$Error){
		if (!mysql_select_db($database, $dbdatabase)) {			
			$Error = true;		
			$ErrorDesc = "Error: No se pudo seleccionar el esquema";		
			$LastErrorNro = mysql_errno();
			$LastErrorDesc = mysql_error();		
		}
			
	}					
	
	
	//Si  hubo error devuelve las variables de estados
	if($Error){		
		$result->AgregarNodo("Control");
		$result->AgregarItem("Error",$Error);
		$result->AgregarItem("ErrorDesc",utf8_encode($ErrorDesc));
		$result->AgregarItem("ErrorMySQL",utf8_encode($LastErrorDesc));
		$result->AgregarItem("ErrorNro",utf8_encode($LastErrorNro));	
		$result->AgregarItem("Conected","false");		
		$result->AgregarItem("SqlCount",$sqlCount);		
		$result->AgregarItem("Last_Id",$LastID);
		$result->CerrarNodo("Control");		
	}else
	{	
		
		// Agrega las instrucciones sql en el archivo para depurar (parametros.txt)
		if($mododebug){
			for ($NroSql=0; $NroSql<$sqlCount; $NroSql++){			
					salida(trim(decodificar($xml->Sql[$NroSql])))	;
					
				}			
		}

		if($contransaccion)	{
			salida("Comienza transaccion");			
			mysql_query("SET AUTOCOMMIT=0;;");
			mysql_query("START TRANSACTION;");
			 
		}
			
		//Recorrer todos los sqls que se recibieron
		for ($NroSql=0; $NroSql<$sqlCount; $NroSql++){			
			
			salida("Procesando:" .$xml->Sql[$NroSql]->Result);
			if($xml->Sql[$NroSql]->Open == "yes"){			
				salida("Armando estructura:");

				$strSql = trim(decodificar($xml->Sql[$NroSql]));
				for ($NroLink=0; $NroLink<$LinksCount; $NroLink++){										
					$strSql = str_replace($xml->Links[$NroLink]->Comodin,$xml->Links[$NroLink]->Valor,$strSql);					
				}
				salida($strSql);
				

				
				//Abre la consulta para luego poder tomar la definicion de los campos
				$rst = mysql_query($strSql, $dbdatabase);				
				if (!$rst) {						
					$Error = true;		
					$ErrorDesc = "Error: consulta sql incorrecta:" . trim(decodificar($xml->Sql[$NroSql]));
					$LastErrorNro = mysql_errno();
					$LastErrorDesc = mysql_error();	
					$ResultPendiente = $xml->Sql[$NroSql]->Result; 
					break;
				}	
				//Si hay una solisitud de Result o de tableDefs agrega el nodo "Result"
				if ($xml->Sql[$NroSql]->Result != "" ){				
					//Agregar la estructura de Result con el nombre indicado en el parametro Result
					$result->AgregarNodo($xml->Sql[$NroSql]->Result );
				} 				
				//Agregar la estructura TableDef (donde se encuentra los nombres de los campos del Result
				$result->AgregarNodoConAtributos("TableDefs","FieldsCount='". mysql_num_fields($rst) ."'");
				$i=0; 
				$cant =  mysql_num_fields($rst);
				while ($i < $cant){
					$attr = mysql_fetch_field($rst, $i);
					$result->AgregarNodo("Field");
					$result->AgregarItem("name",$attr->name);
					$result->AgregarItem("type",$attr->type);
					$result->AgregarItem("primary_key" , $attr->primary_key );
					$result->AgregarItem("unique_key" , $attr->unique_key );					
					$result->AgregarItem("multiple_key" , $attr->multiple_key );										
					$result->AgregarItem("not_null" , $attr->not_null );
					
					$result->AgregarItem("blob" , $attr->blob );
					$result->AgregarItem("numeric" , $attr->numeric );					
					
					
					$banderas = mysql_field_flags($rst, $i);
					$posicion = strpos($banderas, "auto_increment");					
					if ($posicion === false) {					
						$result->AgregarItem("auto_increment" , false );
					}else{
						$result->AgregarItem("auto_increment", true );					
					}
														
					$result->CerrarNodo("Field");
					
					
					$i++;
				}
				$result->CerrarNodo("TableDefs");									
							
			}
			
			
			if($xml->Sql[$NroSql]->Result != ""){  //Necesita un Result  (si no hay error previo)				
				
				salida("Armando datos");
				
				//Intenta reemplazar los campos comodines por los valores previamentes capturados
				$strSql = trim(decodificar($xml->Sql[$NroSql]));
				for ($NroLink=0; $NroLink<$LinksCount; $NroLink++){										
					$strSql = str_replace($xml->Links[$NroLink]->Comodin,$xml->Links[$NroLink]->Valor,$strSql);					
				}
				salida($strSql);
				
							
				
				$rst = mysql_query($strSql, $dbdatabase);				
				//$rst = mysql_query(trim($xml->Sql[$NroSql]), $dbdatabase);
				if (!$rst) {						
					$Error = true;		
					$ErrorDesc = "Error: consulta sql incorrecta:";
					$LastErrorNro = mysql_errno();
					$LastErrorDesc = mysql_error();	
					$ResultPendiente = $xml->Sql[$NroSql]->Result; 
					if($contransaccion){
						 salida("hizo rooback");
						 mysql_query("ROLLBACK;"); 
					}
					break;
				}	
			
				//Agrega el nodo RESULT	
				if($xml->Sql[$NroSql]->Open != "yes"){			
					$result->AgregarNodo($xml->Sql[$NroSql]->Result );
				}				
					
					
				//Agregar la cada uno de los registros que corresponden a la instruccion SQL actual
				$r=0;
				while ($row =  mysql_fetch_assoc($rst)) {	
					//$result->AgregarItemConatributos("Record","","RecordNro='".$r ."'");
					$result->AgregarNodoConAtributos("Record","RecordNro='".$r ."'");
					$i=0;
					while ($i <mysql_num_fields($rst)){
						
						//Intenta capturar los valores para los comodines
						
						for ($NroLink=0; $NroLink<$LinksCount; $NroLink++){
							//salida("tabla:" . $xml->Links[$NroLink]->Tabla . "    Result:" .$xml->Sql[$NroSql]->Result );
							if($xml->Links[$NroLink]->Tabla == $xml->Sql[$NroSql]->Result){
								if($xml->Links[$NroLink]->Campo == mysql_field_name($rst,$i)){
									//$xml->Links[$NroLink]['Valor'] = $row[mysql_field_name($rst,$i)];

									$xml->Links[$NroLink]->Valor = $row[mysql_field_name($rst,$i)];				//Si falla provar con esto
									salida("Nro link" . $NroLink + " campo:" +$xml->Links[$NroLink]->Campo + "  valor:" . $xml->Links[$NroLink]->Valor);
								}
							}
							
						}
						
						//agrega el campo y el valor en el xml
						$result->AgregarItem(mysql_field_name($rst,$i), SacarMayoresYMenores(utf8_encode($row[mysql_field_name($rst,$i)])));
						$i++;
					}
					$result->CerrarNodo("Record");									
					$r++;
				}		
				

				// Actualiza propiedades segun la cantidad de regitros existentes				
				if($r >0){
					$result->AgregarItem("NoMatch","false");
				}else{
				  	$result->AgregarItem("NoMatch","true");  
				}
				
				
			
			}else{		// No necesita Result  (es un execute)
				
				// esta es la rama de updates o insert 	
				$strSql = trim(decodificar($xml->Sql[$NroSql]));
				$strSql = str_replace("@LastId@",$LastID,$strSql);
												
				$rst = mysql_query($strSql, $dbdatabase);
				if (!$rst) {					
					salida("Dio error" . mysql_error());
					$Error = true;		
					$ErrorDesc = "Error: consulta sql incorrecta:" . $strSql ;
					$LastErrorNro = mysql_errno();
					$LastErrorNro = mysql_errno();
					$LastErrorDesc = mysql_error();	
					if($contransaccion){
						salida("hizo rooback");
						 mysql_query("ROLLBACK;");
					}
					break;
				}
				if (mysql_insert_id() > 0){
					$LastID  = mysql_insert_id();
				}				
				
			
			}
			
			//Si hubo una solisitud de Result o de tableDefs cierra el nodo "Result" (nombre de la tabla)
			if($xml->Sql[$NroSql]->Open == "yes" or $xml->Sql[$NroSql]->Result != "" ){								
				$result->CerrarNodo($xml->Sql[$NroSql]->Result);				
			} 			
					
		} // next del for para recorrer cada una de las instrucciones sql
		
		$result->AgregarNodo("Control");
		$result->AgregarItem("Debuger","true");
		$result->AgregarItem("Error",$Error );
		$result->AgregarItem("ErrorDesc",utf8_encode($ErrorDesc));
		$result->AgregarItem("ErrorMySQL",utf8_encode($LastErrorDesc));
		$result->AgregarItem("ErrorNro",utf8_encode($LastErrorNro));	
		$result->AgregarItem("Conected","true");		
		$result->AgregarItem("SqlCount",$sqlCount);		
		$result->AgregarItem("Last_Id",$LastID);								
		$result->CerrarNodo("Control");		
	}	

	$result->CerrarNodo("Result");		
	
	
	if(!$Error and $contransaccion){
		mysql_query("COMMIT;");
		salida("hizo commit");
	}
		
		
	// devuelve el resultado en formato XML
	echo $result->GetXML();
	if($mododebug){
		salida("\n");
		salida($result->GetXML());	
	}
	

	
	
	
	function codificar($string)
	{
	    $hex='';
	    for ($i=0; $i < strlen($string); $i++)
	    {
	        $hex .= dechex(ord($string[$i])). " ";
	    }
	    return $hex;
	}
	
	function decodificar($hex)
	{
		$buffer = split(" ",$hex);
	    $string='';
	    
	    foreach ($buffer as $valor)    
	    {
	        $string .= chr(hexdec($valor));
	    }
	    return $string;
	}
	
	
	function AbrirSalida(){
		$man = fopen("parametros.txt","w");
		fclose($man);	
	}
	
	
	function salida($texto){
		
		//$man = fopen("parametros.txt","a");
		//fwrite($man,utf8_decode($texto) . chr(13) . chr(10)) ;
		//fclose($man);		
	}
	
	function SacarMayoresYMenores($texto){
		
		// saca los <
		$res = str_replace("<","@ÊHH1Ê@",$texto);
		$res = str_replace(">","@ÊHH2Ê@",$res);
		return $res;
	}
	
?>
