*
$obj_conexion - El objeto de conexión con el que trabaja.
* $obj_errorConexion - Referencia al objeto de error global
*
*
* @version $Id: IgepConexion.php,v 1.28 2006-06-05 11:51:11 afelixf Exp $
* @author David:
* @author Keka:
* @author Vero:
* @author Raquel:
* @author Toni:
* @package igep
*/
class IgepConexion {
/**
* objeto conexion
*
* @var object obj_conexion
*/
var $obj_conexion;
/**
* variable de error
*
* @var object obj_errorConexion
*/
var $obj_errorConexion;
/**
* variable de que contiene la descripción del dsn al que se conecta
*
* @var array v_dsn
*/
var $v_dsn;
/**
* Constructor. Recibe como parámetro un array con la definición
* del dsn.
*
* @access public
* @param array $dsn
*/
function IgepConexion($dsn) {
//Cogemos la referencia de la variable de error global
global $g_error;
$this->obj_errorConexion = & $g_error;
//Realizamos la conexión
$this->v_dsn = $dsn;
$this->obj_conexion = $this->conectar();
}
//destructor
function _IgepConexion() {
$this->desconectar();
}
/**
* Realiza la conexión a la base de datos especificada
*
* @access public
* @return object
*/
function conectar(){
include_once('igep/include/igep_bd/IgepDB.php');
//$this->v_dsn =
IgepDB::preConexion($this->v_dsn);
$res = DB::connect($this->v_dsn);
if (DB::isError($res)) {
$this->obj_errorConexion->setError("IGEP-6",NOMBRE_FICHERO,"conectar",$res);
} else IgepDB::postConexion($this->v_dsn,$res);
return $res;
}// Fin de conectar
/**
* Realiza la desconexión a la base de datos a la que actualmente
* se está conectado.
*
* @access public
*/
function desconectar(){
if(isset($this->obj_conexion)) {
$res = DB::disconnect($this->obj_conexion);
if (DB::isError($res))
$this->obj_errorConexion->setError("IGEP-7",NOMBRE_FICHERO,"desconectar",$res);
}
}// Fin de desconectar
/**
* Devuelve el objeto conexión al que se está conectado.
*
* @access public
* @return object
*/
function getConexion(){
return $this->obj_conexion;
}//Fin de getConexion
/**
* Devuelve el dsn de la conexión.
*
* @access public
* @return array
*/
function getDsn(){
return $this->v_dsn;
}//Fin de getDsn
/**
* Empieza una transacción (BEGIN) en la conexión a la que
* está apuntando.
*
* @access public
*/
function empezarTransaccion()
{
//Debug:Indicamos que ejecutamos la consulta
IgepDebug::setDebug(DEBUG_IGEP,'Empezamos transacción.');
$res = IgepDB::empezarTransaccion($this->v_dsn,$this->obj_conexion);
if (DB::isError($res))
$this->obj_errorConexion->setError("IGEP-8",NOMBRE_FICHERO,"empezarTransaccion",$res);
}//Fin de empezarTransaccion
/**
* Finaliza una transacción (COMMIT o ROLLBACK) en la conexión a la que
* está apuntando. Recibe un parámetro que indica si el procesado de las
* diferentes operaciones que se han realizado ha concluido satisfactoriamente
* o no. Dependiendo de ello se realizará el COMMIT o el ROLLBACK. Dicho
* parámetro es $error
*
* - 0. No ha habido ningún error en el proceso. Realizamos COMMIT
* - 1. Ha habido algún error durante el proceso. Realizamos ROLLBACK
*
*
* @access public
* @param integer $error
*/
function acabarTransaccion($error){
//Debug:Indicamos que ejecutamos la consulta
IgepDebug::setDebug(DEBUG_IGEP,'Acabamos transacción con '.$error);
$res = IgepDB::acabarTransaccion($this->v_dsn,$this->obj_conexion,$error);
if (DB::isError($res))
$this->obj_errorConexion->setError("IGEP-9",NOMBRE_FICHERO,"acabarTransaccion",$res);
}//Fin de acabarTransaccion
/**
* Método encargado de construir las WHERE de las consultas.
* @access private
*/
function construirWhere($v_datos,$str_where){
//Esta función construye una WHERE igualando los valores con los nombres de los campos.
if (isset($v_datos)){
if($str_where!='')
$inicio_condicion=' OR (';
else
$inicio_condicion=' (';
$str_condicion='';
foreach($v_datos as $prop => $val) {
if ($str_condicion!='') {
$str_condicion.=' AND ';
}
$str_condicion.=$prop;
if (gettype($val)=='string') {
if($val!='')
$str_condicion.="='".$val."'";
else
$str_condicion.=' is null';
}
else {
if($val!='')
$str_condicion.='='.$val;
else
$str_condicion.=' is null';
}
}//FIN foreach
if(trim($str_condicion)!='')
$str_where.=$inicio_condicion.$str_condicion.')';
}
return $str_where;
} //Fin de construirWhere
/**
* Método encargado de construir las WHERE de las consultas incluyendo las condiciones de busqueda que ha seleccionado el programador a partir del parámetro gint_tipoConsulta
* @access private
*/
function construirWhereConLike($v_datos,$str_where,$tipoConsulta){
/*Dependiendo del valor de la variable global gint_tipoConsulta realiza una construcción de la Where u otra.Los tipos son:
- 0. Se contruye igualando los campos a los valores.
- 1. Se construye con like y comodines para cada campo.
- 2. Por defecto, se contruye con like sólo si el usuario ha especificado comodines.
*/
//Accedemos a la varible global que nos dice que tipo de Consulta debemos realizar para toda la aplicación.
if($tipoConsulta==0)
return $this->construirWhere($v_datos,$str_where);
else
//Construimos la Where
if (isset($v_datos)){
if($str_where!='')
$inicio_condicion =' OR (';
else
$inicio_condicion =' (';
$str_condicion='';
foreach($v_datos as $prop => $val){
if($val!=''){
if ($str_condicion!=''){
$str_condicion.=' AND ';
}
$str_condicion.=$prop;
if($tipoConsulta==2){
//Son 3 iguales porque si colocamos 2 no distinguimos entre algo que esté en la posición 0 y el false
if((strpos($val,'%')===false) and (strpos($val,'_')===false)){
if (gettype($val)=='string')
$str_condicion.="='".$val."'";
else
$str_condicion.='='.$val;
}
else {
$str_condicion.=" LIKE '".$val."'";
}
}//Fin tipoConsulta == 2
else {
$str_condicion.=" LIKE '%".$val."%'";
}
}
}//FIN foreach
if(trim($str_condicion)!='')
$str_where.=$inicio_condicion.$str_condicion.')';
}
return $str_where;
}//Fin de construirWhereConLike
/**
* Método encargado de, dadas una serie de cadenas, componerlas para crear una única
* cadena para la where de una SQL.
* @acces private
* @param array $v_cadenas Array que contiene las diferentes cadenas que componen la WHERE
* @return string
*/
function combinarWhere($v_cadenas){
$str_where = '';
foreach($v_cadenas as $cadena){
if(trim($cadena)!=''){
if ($str_where!='')
$str_where.= ') AND ';
$str_where.='('.$cadena;
}
}
if($str_where!='')
$str_where=' WHERE '.$str_where.')';
return $str_where;
}
/**
* Método encargado de construir el limit para las consultas
* @access private
*/
function construirLimite(& $str_where,$int_limiteConsulta=100){
if(is_int($int_limiteConsulta)){
$limite = IgepDB::obtenerLimit($str_where, $this->v_dsn, $int_limiteConsulta);
}
return $limite;
}//Fin de construirLimite
/**
* Esta función se encarga de cambiar los datos que vienen de la Base de datos, transformándolos al formato de presentación adecuado.
* P.E.: Cambia el formato de los números decimales colocando como separador decimal la coma.
*
* @access private
* @param $res Es el contenido del DBResult que se recibe por referencia para poder cambiarlo.
* @param $camposDecimalesHijo En el caso de recargar, tenemos que pasarle los campos decimales del hijo.
* @return mixed
*/
function presentaDatos(& $res,$camposExaminados){
//Si $camposExaminados tiene elementos
if(isset($camposExaminados)){
$carbd = IgepDB::caracteresNumericos($this->getDsn());
$carconf = ConfIgep::caracteresNumericos();
if ($carbd['DECIMAL'] != $carconf['DECIMAL']) {
//Recorremos todo el $res y por cada fila realizamos la transformación.
foreach($res as $indice => $fila){
foreach($camposExaminados as $campo){
$posUltPunto = strrpos($fila[$campo],$carbd['DECIMAL']);
if($posUltPunto>0)
$res[$indice][$campo] = substr_replace($fila[$campo],$carconf['DECIMAL'],$posUltPunto,1);
}//Fin de foeach de camposExaminados
}//Fin de foreach $res
}// Fin de if si hay que convertir los datos
}//Fin de if si hay decimales
}//Fin de presentaDatos
/**
* Dada una una consulta realiza la SELECT correspondiente.
*
* @access public
* @param string $str_select
* @return object
*/
function consultar($str_select){
//Debug:Indicamos que ejecutamos la consulta
IgepDebug::setDebug(DEBUG_IGEP,'IgepConexion: Ejecutamos consulta: '.$str_select);
$res = $this->obj_conexion->getAll($str_select,null,DB_FETCHMODE_ASSOC);
if (DB::isError($res)){
$this->obj_errorConexion->setError("IGEP-5",NOMBRE_FICHERO,"consultar",$res,$str_select);
return -1;
}
return $res;
}
/**
* Dada una una consulta realiza la SELECT correspondiente.
*
* @access public
* @param string $str_select
* @return object
*/
function operar($str_operar){
//Debug:Indicamos que ejecutamos la operacion
IgepDebug::setDebug(DEBUG_IGEP,'IgepConexion: Ejecutamos operación: '.$str_operar);
$res = $this->obj_conexion->simpleQuery($str_operar);
if (DB::isError($res)){
$this->obj_errorConexion->setError("IGEP-11",NOMBRE_FICHERO,"operar",$res,$str_operar);
return -1;
}
return $res;
}
/**
* Este método prepara los datos que se van a utilizar en una operación de la BD.
* Típicamente las comillas simples y las contrabarras en los INSERT, UPDATE o DELETE
*
* @access public
* @param string $a_parametros
* @return none
*/
function prepararOperacion(& $a_parametros){
if(is_array($a_parametros)){
foreach($a_parametros as $indice => $parametro){
$val = str_replace("'","''",$parametro);
$val = str_replace("\\","\\\\",$val);
$a_parametros[$indice]=$val;
}
}
else {
$val = str_replace("'","''",$a_parametros);
$val = str_replace("\\","\\\\",$val);
$a_parametros=$val;
}
}
/**
* Este método devuelve el valor de una secuencia programada en la base de datos
* para la conexion actual
*
* @param nombreSecuencia string nombre de la secuencia en la BD
* @return integer
*/
function calcularSecuenciaBD($nombreSecuencia){
$sql = IgepDB::obtenerSecuenciaBD($this->getDsn(),$nombreSecuencia);
IgepDebug::setDebug(DEBUG_IGEP,'IgepConexion: Calculamos secuencia BD: '.$sql);
$res = $this->obj_conexion->getAll($sql,null,DB_FETCHMODE_ASSOC);
if (DB::isError($res)){
$this->obj_errorConexion->setError('IGEP-12',NOMBRE_FICHERO,"calcularSecuenciaBD",$res);
return -1;
}
else
return $res[0]['nextval'];
}
/**
* Este método calcula una secuencia compuesta por varios campos de la misma tabla.
*
* @param tabla string nombre de la tabla de la BD
* @param campoSecuencia string campo del que se quiere obtener la secuencia
* @param camposDependientes array contiene el nombre de los campos de los cuales va a depender la secuencia y sus valores. Estructura [nombreBD] = valor
* @param valorInicial integer Fija el valor inicial que devuelve calcularSecuencia en el caso de que no exístan tuplas en la tabla el valor por defecto es 1
* @return integer
*/
function calcularSecuencia($tabla,$campoSecuencia,$camposDependientes, $valorInicial=1){
$i=0;
foreach($camposDependientes as $campo => $valor){
if($where!='')
$where.=' AND ';
else
$where = 'WHERE ';
$where.=$campo."='".$valor."' ";
$i++;
}
$sql = "SELECT max($campoSecuencia) as \"secuencia\" FROM $tabla $where";
IgepDebug::setDebug(DEBUG_IGEP,'IgepConexion: Calculamos secuencia: '.$sql);
$res = $this->obj_conexion->getAll($sql,null,DB_FETCHMODE_ASSOC);
if(DB::isError($res)) {
$this->obj_errorConexion->setError('IGEP-12',NOMBRE_FICHERO,'calcularSecuencia',$res);
return -1;
}
else {
if (($res[0]['secuencia']=='')||($res[0]['secuencia']==null)||(!isset($res[0]['secuencia'])))
return $valorInicial;
else
return ($res[0]['secuencia'] +1);
}
}//Fin de funcion calcularSecuencia
}//Fin clase IgepConexion
?>