<?php
//-----------------------------------------------------------------
class ConexDMUG  //Version 2014-7-1 
{
	var $ipserver;
	var $portserver;
	var $hs;
	var $service;
	var $query;
	var $name;
	var $info;
	var $reporte;
	var $version;
	var $user;
	var $password;
	var $database;
	var $schema;
	var $table;
	var $index;
	var $lock;
	var $program;
	var $xmldoc;
	var $xmldocres;
	var $xmlresult;
	var $xmlstring;
    var $estado;
    var $socket;
	var $xmlrequest;
	var $xmlraw;
	var $xmlout;
	var $row;
    var $colum;
    var $pos;
	var $nro_error;
	var $text_error;
   	var $filas;
	var $matriz;
	
	function ConexDMUG( $p_ipserver, $p_portserver , $p_hs , $p_user , $p_password  ) 
	{
		$this->ipserver   = $p_ipserver;
		$this->portserver = $p_portserver;
		$this->hs = $p_hs;
		$this->user = $p_user;
		$this->password = $p_password;
  		$this->xmlstring = '<?xml version="1.0" ?> <document></document>' ;
  		$this->xmldoc = new SimpleXMLElement( $this->xmlstring );
  		$this->estado = 0;
  		$this->lock = 0;
		$this->service = ""; 
  		$this->name = "";

		$this->row = 0;
		$this->table  = "";
        $this->matriz = "";
    	$this->colum=0;
    	$this->filas=0;
    	$this->pos= -1;
		$this->nro_error=0;
		$this->text_error="EXACTO";

	}
		
	function _ConexDMUG() 
	{
		delete($this);
	}
	

	function SetCursor( $p_database , $p_schema , $p_table , $p_index ) 
	{
		$this->service  = "CURSOR"; 
		$this->database = $p_database;
		$this->schema   = $p_schema;
		$this->table    = $p_table;
		$this->index    = $p_index;

	}

	function SetQuery( $p_schema , $p_query  ) 
	{
		$this->service = "QUERY"; 
		$this->schema  = $p_schema;
		$this->query   = $p_query;
	}
	

	function SetEsquema( $p_schema ) 
	{
		$this->schema = $p_schema;
	}

	function SetDataBase($p_database ) 
	{
        $this->database = $p_database;
	}


	function SetProgram ( $p_program ) 
	{
		$this->service = "PROGRAM"; 
		$this->program = $p_program; 
	}

	function SetParameter( $p_par , $p_val ) 
	{
		$this->xmldoc->addChild( $p_par , $p_val );
	}

	function SetMCAREP ( $p_reporte ,  $p_version ) 
	{
		$this->service = "MCAREP"; 
		$this->reporte = $p_reporte;
		$this->version = $p_version;
	}

	function SetInfo($p_info) 
	{
  		$this->info = $p_info;	
	}

	private function SetXML() 
	{
  	
        $this->xmldoc->addChild('hs'      , $this->hs       );
		$this->xmldoc->addChild('service' , $this->service  );
		$this->xmldoc->addChild('info'    , $this->info     );
		$this->xmldoc->addChild('user'    , $this->user     );
		$this->xmldoc->addChild('password', $this->password );
		$this->xmldoc->addChild('lock'    , $this->lock     );
		$this->xmldoc->addChild('query'   , $this->query    );
		$this->xmldoc->addChild('name'    , $this->name     );
		$this->xmldoc->addChild('REPORTE' , $this->reporte  );
		$this->xmldoc->addChild('VERSION' , $this->version  );
		$this->xmldoc->addChild('program' , $this->program  );
		$this->xmldoc->addChild('DATABASE', $this->database );
		$this->xmldoc->addChild('SCHEMA'  , $this->schema    );
		$this->xmldoc->addChild('TABLE'   , $this->table    );
		$this->xmldoc->addChild('INDEX'   , $this->index    );
		
	}
    
	public function AddParam( $p_par , $p_val ) 
	{
        $this->xmldoc->addChild( $p_par , $p_val );
	}
    
	public function NextRecord() 
	{
		
		if ( $this->estado == 0 ) 
			$this->Execute_DMUG();
		
		if( $this->estado == 1)		
			$this->NextRecord_DMUG();

		if( $this->estado == 1)
			return true;
  		else
  			return false;
  	}

	function Execute_DMUG()
	{

		$this->SetXML(); 
		
		/////$this->xmlout = html_entity_decode( $xmldoc->asXML() );

		$this->xmlout = $this->xmldoc->asXML();
		

		//echo $this->xmlout."\n";

		/* Crear un socket TCP/IP. */
		
		$this->socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
		
		if ($this->socket === false)
		{
    			echo "socket_create() fallo :" . socket_strerror(socket_last_error()) . "\n";
				return -1;			
		}
		else
		{
    			//echo "OK.\n";
		}

		///echo "ATENCION:Conectando a '$this->ipserver' en el puerto '$this->portserver'...";
		
		socket_set_option( $this->socket , SOL_SOCKET, SO_SNDTIMEO , array('sec' => 1 , 'usec' => 1 )); 
		socket_set_option( $this->socket , SOL_SOCKET, SO_RCVTIMEO , array('sec' => 2 , 'usec' => 1 ));
		
		$result = socket_connect( $this->socket , $this->ipserver , $this->portserver );
		

		if ($result === false)
		{
    			echo "ERROR EN CONEXION SOCKET ( Error:9800 !!!! )\n";
			return -1;
		}
		else
		{

		}

		socket_write($this->socket , $this->xmlout , strlen($this->xmlout));

		$out="";
		
		/////echo "Leyendo respuesta:\n\n";

		$this->xmlrequest="";
		
		//socket_set_nonblock($this->socket); 
                
		$count = 0;
		while ( 1 )
		{

			$out = socket_read( $this->socket , 10000 , PHP_BINARY_READ ); 
   		
    			$this->xmlrequest.=$out;
    			
			if (strstr(  $this->xmlrequest , "</document>") )
    				break;
		
			if ( $count > 3 )
			{
				echo "Se aborta Lectura Intento :".$count."\n";				
			        socket_close($this->socket);
				return -1;
			}
			if ( $out == "" )  $count++;
	
			

		}
		
		//GUARDAR EL RAW XML
		$this->xmlraw = $this->xmlrequest;

		//CONVERSION DEL STRING A OBJETO XML
		//error_log($this->xmlrequest);
		$this->xmlrequest = new SimpleXMLElement( $this->xmlrequest );

		$this->matriz = "";
		

		foreach ( $this->xmlrequest->children() AS $child )
		{
			$nametag =  $child->getname();
			if ( $nametag == "resulset" ) 
			{	
				$this->matriz = &$child;
            			break;
	            	}
        	}
		
		///$this->matriz = (string)$this->xmlrequest->resultset; 
		// var_dump( $this->xmlrequest ); 
		// var_dump( $this->matriz ); 
		
		///////////////////////////////////////
		//echo "MATRIZ=".$this->matriz."\n";
		//////////////////////////////////////			        
		//echo "MATRIZ=".$this->matriz ;		
		//echo "RESUL=". $this->xmlrequest->resultset;		
		
		$this->matriz  = explode("\n", $this->matriz  );
        
        $this->filas  = count($this->matriz) - 2;

        if( $this->filas <= 0 )
        {
			$this->estado = 9 ;		
			return 1 ;
        }              

        for($v_ii=0 ; $v_ii <= $this->filas ; $v_ii++)
		{
	        $this->matriz[$v_ii] = explode ( "\t", $this->matriz[$v_ii]  );
		}
                
        $this->colum = count($this->matriz[1])-1;
        
        $this->pos = 0 ;
        $this->row = 0 ;
		
		$this->nro_error = 0;
		$this->text_error = "EXACTO" ;
		$this->estado = 1;		
		
		return 1;
	
	}


	private function NextRecord_DMUG()
	{
		
		$this->row++;
        $this->pos++;
		
		if ( $this->row > $this->filas )
		{		
			  
			$this->estado = 9 ;		
			return 1;
		
		}			
		
		$this->estado = 1;		
		return 1;
	}
    

	public function CloseConex() 
	{
		//echo "\nCerrando socket...";
		
		socket_close($this->socket);
		
		//echo "\n";
		
		//delete $this->xmldoc;
		//delete $this->xmlrequest;
		//delete $this;

  	}
	
	public function GetField( $p_f )
	{
		return $this->matriz[ $this->row ][$p_f];
	}

	public function GetPos()
	{
		return $this->row;
	}
	public function GetEstado()
	{
		return $this->estado;
	}
	
	public function GetColum()
	{
		return $this->colum;
	}

	public function GetFilas()
	{
		return $this->filas;
	}

	public function GetNError() 
	{
		return $this->nro_error;
	}
	
	public function GetSError() 
	{
		return $this->text_error;
	}
	
	public function GetInfo() 
	{
	
		return (string)$this->info;
	
	}
	
	public function GetMatriz() 
	{
	
		return (string)$this->matriz;
	
	}
	
	public function GetChild( $tag ) 
	{
    
    	//$this->xmlrequest = new SimpleXMLElement( $this->xmlrequest  );
        $valor = "";
        
		foreach ( $this->xmlrequest->children() AS $child )
		{
	   	
			$nametag = $child->getname();
			if ( $nametag == $tag )  
			{
				$valor = &$child;
            	break;
            }
        }
		
		return $valor;
	    
	}
    


}
//------------------------------------------------------------------