<?php

require_once( dirname(__FILE__).'/../config/paths.inc.php' );
require_once( CONFIG );
require_once( CLASE_JSON_RESPUESTA );
require_once( CLASE_EXCEPCION_CONEXION );

class BD
{
  static protected $conexiones;
  
  protected $conexion = null;
  
  protected function __construct($objCon)
  {
      $this->conexion = $objCon;
  }

  static function conectar($ua = null)
  {
    global $bdGuarani;

    $bds = array();

    if ($ua)
    {
      if (!is_array($ua) ) {
        $bds[] = $ua;
      }
      else
      {
        $bds = $ua;
      }
    }
    else 
    {
      foreach ($bdGuarani as $ua => $unaBase)
      {
        $bds[] = $ua;
      }
    }


    $conexiones =array();

    foreach ($bds as $ua)
    {
      if(!isset(self::$conexiones[$ua]))
      {
        if (isset($bdGuarani[$ua])) {
          if (($bdGuarani[$ua]["tipo_conexion"] == "pdo_guarani") or ($bdGuarani[$ua]["tipo_conexion"] == "informix"))
          {
            $conexion = "informix:host=".trim($bdGuarani[$ua]["host"]).";db_locale=en_us.cp1252;service=".trim($bdGuarani[$ua]["service"]).";database=".trim($bdGuarani[$ua]["bd"]).";server=".trim($bdGuarani[$ua]["conexion"]).";protocol=".trim($bdGuarani[$ua]["protocolo"]).";EnableScrollableCursors=1";
          }
          elseif ($bdGuarani[$ua]["tipo_conexion"] == "mysql")
          {
            $conexion = 'mysql:host='. $bdGuarani[$ua]['host'].';' . ( $bdGuarani[$ua]['service']!= '' ? 'port='.$bdGuarani[$ua]['service'].';' : '').'dbname='.trim($bdGuarani[$ua]["bd"]);
          }
		  elseif ($bdGuarani[$ua]["tipo_conexion"] == "pgsql")
		  {
			$conexion = 'pgsql:host='. $bdGuarani[$ua]['host'].';' . ( $bdGuarani[$ua]['service']!= '' ? 'port='.$bdGuarani[$ua]['service'].';' : '').'dbname='.trim($bdGuarani[$ua]["bd"]);
		  }
          else 
          {
            throw new PDOConexionException( new PDOException($bdGuarani[$ua]["tipo_conexion"] .': No soportado.'), $ua);
          }
        }
        else
        {
          throw new PDOConexionException( new PDOException('No existe la UA'), $ua);
        }
        try 
        {
            $pdo = new PDO( $conexion, $bdGuarani[$ua]["usuario"], $bdGuarani[$ua]["clave"]);
            //$objCC->raiseErrorFn =  'verificarError';
            $pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
            $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
            $pdo->setAttribute(PDO::ATTR_CASE, PDO::CASE_NATURAL);			
            $conexiones[$ua] = self::$conexiones[$ua] = new static($pdo);			
			
			//Corro el schema que se configuro.
			if ($bdGuarani[$ua]["tipo_conexion"] == "pgsql") {
				$query = $pdo->prepare("SET search_path to '".$bdGuarani[$ua]['schema']."'");
				$query->execute();
			}
			
        }
        catch (PDOException $e)
        {
            throw new PDOConexionException( $e, $ua);
        }
      }
      else
      {
        $conexiones[$ua] = self::$conexiones[$ua];
      }
    }

    return $conexiones;
  }
  
  protected static function error(PDOException $e, $extra = null)
  {
    $respuesta = new JSONRespuesta( -1, $e->getMessage() . ($extra?': '.$extra:'') );
    $respuesta->mostrar();
  }
  
  public function consultar($strSql, $params = null, $es_actualizacion = false)
  {
      $query = $this->conexion->prepare($strSql);
      if ($params and is_array($params) and !empty($params))
      {
          foreach ($params as $k => $v)
          {
            //$query->bindParam(':'.trim($k), $v); //No funciona
            $query->bindValue(':'.trim($k), $v);
          }
      }
      $resultado = $query->execute();
      
      if ($es_actualizacion)
      {
          return $resultado;
      }
      return $query->fetchAll();
  }
  
}
