<?php

/*****************************************************************************
 .::. PostgreClass .::.
@Autor:   Aldrin Echeverry Higgins -- @Modificado por: Federico A. Ocampo
@Email:   aldrin@adanetwork.net    -- federico@mcanet.com.ar
@Empresa: Ada Network              -- MCAnet
@Descripcion: Una Clase diseniada con los conceptos de POO en PHP.
@Version: 1.1
*****************************************************************************/
class PostgreClass
{
  //Atributos Basicos de la clase
  var $servidor; //Nombre de la maquina donde se encuentra la BD generalmente es localhost
  var $nombreBD; //Nombre de la Base de Datos
  var $nombreDeUsuario; //Nombre del usuario autorizado para entrar a la Base de Datos
  var $contrasena; //ContraseƱa del Usuario

  //Atributos Modificados
  var $enlace;//Almacena el enlace con la Base de Datos una vez establecido
  var $resultado;//Almacena el resultado obtenido por la consulta a la BD
  var $consulta;//Almacena la consulta realizada con el metodo consultaBD();
  var $procesoCorrecto;

  //Constructor de la Clase - Inicializa algunos atributos basicos
  function PostgreClass($servidor,$nombreBD,$nombreDeUsuario,$contrasena)
  {
    $this->servidor = $servidor;
    $this->nombreBD = $nombreBD;
    $this->nombreDeUsuario = $nombreDeUsuario;
    $this->contrasena = $contrasena;
  }

  //---------------Metodos y Procedimientos----------------
  //conectarBD(); Te permite conectar y enlazar la BD, el enlace a
  //la BD es almacenado modificando el atributo $enlace
  function conectarBD()
  {
    $retConexionExitosa = true;
    
    $this->enlace=pg_connect(" host     = ". $this->servidor        .
                             " user     = ". $this->nombreDeUsuario .
                             " password = ". $this->contrasena      .
                             " dbname   = ". $this->nombreBD . 
			     " port     = 5432");

    //Si la conexion fue exitosa
    if(!$this->enlace)
    {
      $retConexionExitosa = false;
    }
    
    return $retConexionExitosa;
  }

  //consultarBD() permite realizar consultas en la BD enlazada
  function consultarBD($sentenciaSQL)
  {
    $retConsultaExitosa = true;

    if(!function_exists("pg_query")){
      $this->consulta = pg_exec($this->enlace,$sentenciaSQL);
    }
    else{
      $this->consulta = pg_query($this->enlace,$sentenciaSQL);
    }
    if(!$this->consulta){
        $retConsultaExitosa = false;
    }

    return $retConsultaExitosa;
  }

  //Devuelve los resultados de una fila dada en forma de arreglo asociativo
  function obtenerFilaArray($fila)
  {
    $this->resultado = pg_fetch_array($this->consulta, $fila);
    return $this->resultado;
  }

  //Devuelve todas las filas del resultados en un arreglo asociativo
  function obtenerTotalFilasArray()
  {
    //Comprueba si en la version de PHP actual existe la funcion pg_fetch_all. Si no usa una implem. propia
    if (!function_exists("pg_fetch_all")){
      $this->pg_fetch_all_Aux($this->consulta,"assoc");
    }
    else{
      $this->resultado = pg_fetch_all($this->consulta);
    }
    return $this->resultado;
  }
  

  function pg_fetch_all_Aux($res, $kind="assoc")
  {
    $i = 0; // this is needed for the row integer in the looped pg_fetch_array
    $array_out = NULL;
    if ($kind == "assoc")
    {
      while ($row = pg_fetch_array($res, $i, PGSQL_ASSOC))
      {
          $array_out[] = $row;
          $i++;
      }
    }
    else
    {
      while ($row = pg_fetch_array($res))
      {
          $array_out[] = $row;
      }
    }

    $this->resultado = $array_out;
    return $this->resultado;
  }

  function obtenerConsulta()
  {
    return $this->consulta;
  }

  function insertarRegistro($sentenciaSQL)
  {
    pg_query($this->enlace,$sentenciaSQL);
  }

  function cantidadFilasResultado()
  {
    return pg_numrows($this->consulta);
  }

  function cantidadCamposResultado()
  {
    return pg_numfields($this->consulta);
  }


  //libera el contenido del atributo que almacena las consultas
  function liberarConsulta()
  {
    pg_freeresult($this->consulta);
  }

  function desconectarBD()
  {
    pg_close($this->enlace);
  }

  
  function Begin_Transaction()
{
	$SQL_BEGIN = 'BEGIN;';
	
	$this->procesoCorrecto  = true;
	$procesoCorrect=$this->conectarBD();
	if($procesoCorrect)
	{
		$procesoCorrect = $this->consultarBD($SQL_BEGIN);
		if($procesoCorrect)
		{
			$ret_datos = $this->obtenerTotalFilasArray();
			$this->procesoCorrecto  = true;
		}
		else
			$this->procesoCorrecto  = false;
	
		$this->liberarConsulta();
		$this->desconectarBD();
	}
	else
		$this->procesoCorrecto  = false;
		
	return $ret_datos;
}

  /**
  * Termina un bloque de transaccion
  * @return array Retorna un arreglo multidimensional de la forma arreglo[codigo][descrip]
  */
  function End_Transaction()
  {
	$SQL_END = 'COMMIT;';
	
	$this->procesoCorrecto  = true;
	$procesoCorrect=$this->conectarBD();
	if($procesoCorrect)
	{
		$procesoCorrect = $this->consultarBD($SQL_BEGIN);
		if($procesoCorrect)
		{
			$ret_datos = $this->obtenerTotalFilasArray();
			$this->procesoCorrecto  = true;
		}
		else
			$this->procesoCorrecto  = false;
	
		$this->liberarConsulta();
		$this->desconectarBD();
	}
	else
		$this->procesoCorrecto  = false;
		
	return $ret_datos;
  }

  /**
  * Vuelve atras las operaciones de un bloque de transaccion
  * @return array Retorna un arreglo multidimensional de la forma arreglo[codigo][descrip]
  */
  function Rollback_Transaction()
  {
	$SQL_END = 'ROLLBACK;';
	
	$this->procesoCorrecto  = true;
	$procesoCorrect=$this->conectarBD();
	if($procesoCorrect)
	{
		$procesoCorrect = $this->consultarBD($SQL_BEGIN);
		if($procesoCorrect)
		{
			$ret_datos = $this->obtenerTotalFilasArray();
			$this->procesoCorrecto  = true;
		}
		else
			$this->procesoCorrecto  = false;
	
		$this->liberarConsulta();
		$this->desconectarBD();
	}
	else
		$this->procesoCorrecto  = false;
		
	return $ret_datos;
  }
  
  
}//Fin de la Clase PostgreClass
?>