<?php

set_error_handler("customError");

function customError($error_level,$error_message,
$error_file,$error_line,$error_context) {
  // if($error_level == 8)
  //   return;
  // logError($error_level, $error_message);
  if(strpos($error_message, "ibase_query") !== false) {
    logQuery(
      "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
      . PHP_EOL
      . PHP_EOL
      . $error_message 
      . PHP_EOL
      . PHP_EOL
      . "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
    );
  }
}

// executa a query e j? monta o array com os nomes dos campos
// para depois usar no mostra (que acessa dados a partir do nome)
// &$nome_array = passado por referencia, assim que chama esta fun??o define qual ser? o nome do array e aqui usa sempre com o mesmo nome
function qry($con, $sql,&$nome_array) {
  include "conecta.inc.php";
  include '../auxiliar/parametros.inc';
  
  if($p_ambiente_de_homologacao == 1)
    logQuery($sql);

  $res = ibase_query( $con, $sql );
 //echo $sql;
  // carrega um array chamado Campos com o nome dos campos
  // campos[0] tera o nome do primeiro campo, e assim por diante
  // depois da para acessar pelo nome
  $ct=0;
  while(list($campo,$alias) = ibase_field_info($res,$ct)) {
    $nome_array[$ct] = $alias;
    $ct++;
  }
  
  return $res;
} 

function preparedQuery($con, $sql, $args) {
  $p_sql = ibase_prepare($con, $sql);
  $resource = ibase_execute($p_sql, $args);
  $results = array();
  while($row = ibase_fetch_row($resource)){
    $results[] = $row;
  }
  return $results;
}


function getFunctionArgsForLog($args) {
  $response = array();
  foreach ($args as $a) {
    if(!is_string($a)) {
      $response[] = $a;
      continue;
    }

    
    if(strlen($a) > 20) {
      $a = substr($a, 0, 20) . '...';
    }

    $a = preg_replace( "/\r|\n/", "<br>", $a );
    $response[] = '"' . $a . '"';
  }

  return implode(", ", $response);
}

function logQuery($sql) {
  include '../auxiliar/parametros.inc';
  if ($p_gravalogs == 1) {
    $handle = fopen('../logs/' . date('Y-m-d') . '-querys.log', 'a+');
    $stack = debug_backtrace();
    $separador = "==================================================================================================";
    fwrite($handle, $separador . PHP_EOL);
    fwrite($handle, $separador . PHP_EOL);
    fwrite($handle, $separador . PHP_EOL);
    fwrite($handle, $separador . PHP_EOL);

    foreach (array_reverse($stack) as $row) {
      fwrite($handle, PHP_EOL . "[" . date('d/m/Y H:i:s') . "] " . $row["file"] . "(" . $row["line"] . ") - " . $row['function'] . "(" . getFunctionArgsForLog($row['args']) . ")");
    }
    fwrite($handle, PHP_EOL . PHP_EOL . $sql . PHP_EOL . PHP_EOL . PHP_EOL . PHP_EOL);

    fclose($handle);
  };
}


function logInfo($message) {
  include '../auxiliar/parametros.inc';
  if ($p_gravalogs == 1) {
    $handle = fopen('../logs/' . date('Y-m-d') . '-info.log', 'a+');
    $stack = debug_backtrace();
    // $separador = "==================================================================================================";
    // fwrite($handle, $separador . PHP_EOL);
    // fwrite($handle, $separador . PHP_EOL);

    // foreach (array_reverse($stack) as $row) {
    //   fwrite($handle, PHP_EOL . "[" . date('d/m/Y H:i:s') . "] " . $row["file"] . "(" . $row["line"] . ") - " . $row['function'] . "(" . getFunctionArgsForLog($row['args']) . ")");
    // }
    fwrite($handle, PHP_EOL ."[" . date('d/m/Y H:i:s') . "] => " . $message . PHP_EOL);

    fclose($handle);
  };
}


function getErrorLevelLabel($error_level) {
  switch ($error_level) {
    case 1:
      return "ERROR";
    case 2:
      return "WARNING";
    case 8:
      return "NOTICE";
    case 2048:
      return "STRICT";
    default:
      return "*";
  }
}

function logError($error_level, $errorMessage) {
  include '../auxiliar/parametros.inc';
  if ($p_gravalogs == 1) {

    $handle = fopen('../logs/' . date('Y-m-d') . '-error.log', 'a+');
    $stack = debug_backtrace();
    $separador = "==================================================================================================";
    fwrite($handle, $separador . PHP_EOL);
    fwrite($handle, $separador . PHP_EOL);
    fwrite($handle, $separador . PHP_EOL);
    fwrite($handle, $separador . PHP_EOL);

    foreach (array_reverse($stack) as $row) {
      fwrite($handle, PHP_EOL . "[" . date('d/m/Y H:i:s') . "] " . $row["file"] . "(" . $row["line"] . ") - " . $row['function'] . "(" . getFunctionArgsForLog($row['args']) . ")");
    }
    fwrite($handle, PHP_EOL . PHP_EOL . "[" . getErrorLevelLabel($error_level) . "]    " . $errorMessage . PHP_EOL . PHP_EOL . PHP_EOL . PHP_EOL);

    fclose($handle);
  };
}


//
// Numero de linhas do select 
//
function ibase_num_rows($res) { //I have pick it from bg_idol@hotmail.com
 $i = 0;
 while (ibase_fetch_row($res)) {
   $i++;
  }
return $i;
}

// Cria um array com ref. por nome do campo como o pg_fecth_array
$afvnoisrev = base64_decode('IDIzLjExLjUuMQ==');
// feito para substituir a fun??o mostra (ficou bem mais pratico, porque da para aproveitar mais c?digo antigo j? que o array vai ficar igual)
// $a_reg = id do resultado do select
// $a_campos = array com a lista de campos do select
// $nome_array  = nome do array que ser? criado
// Retorna false se n?o tinha mais linha
function cria_array_campos(&$a_reg,$a_campos,&$nome_array) {

   $lin = ibase_fetch_row($a_reg);
   for ($n=0; $n<=sizeof($a_campos) ; $n=$n+1) {
     $nome_campo = strtolower($a_campos[$n]);
	 $nome_array[$nome_campo] = $lin[$n]; 	
   }
   if ( !$lin ) {
     return false;
   } else {
     return true;
   }	 	
} 

// Retorna o conteudo de um campo a partir de um registro
// $a_reg = registro
// $a_campos = array com a lista de campos do select
// $a_campo  = campos a qual se quer o valor
function Mostra($a_reg,$a_campos,$a_campo) {
//  	echo  "a_campo ao entrar ". $a_campo. '<br />';
   $ind  = ProcElemArray($a_campos , $a_campo);	 
   $resu = $a_reg[$ind];
   return $resu;
} 


// Procura um elemento ($elemento) num array ($array_proc)
function ProcElemArray($array_proc , $elemento) {
  $resu = 9999;
//  	echo  "elemento ao entrar ". $elemento. $b;
  for ($n=0; $n<=sizeof($array_proc) ; $n=$n+1) {	 	  
    if ( strtoupper($array_proc[$n]) == strtoupper($elemento) ) {
//	echo 'iff '. $array_proc[$n] . " = ". $elemento. '<br />';
	    $resu = $n;
	}	     
  } //for  
  if(  $resu == 9999) {
  	   echo 'ERRO!!! Campo n?o Encontrado...';
	   die;
  }
  return $resu;
} // function ProcElemArray($array_proc , $elemento) {


// retorna verdadeiro se existir sub-grupos para o grupo passado como parametro
function tem_subgrupo($codgru) {
 global $con ; 
 //ve se tem sub - grupos
 $sql_cts = "SELECT count(codgru) as total FROM subgrupos WHERE codgru = $codgru";
 $res_sgrp = qry($con,$sql_cts,$campo_cts);
 $ct_subgrupo = ibase_fetch_row($res_sgrp);
 $total = mostra($ct_subgrupo,$campo_cts,'total');
 return ($total>0) ?  true : false; 
}//function tem_subgrupo() {



/*
RICARDO  - 19-05-2008
*/

// Cria uma matriz com ref. por nome do campo como o pg_fecth_array - semelhante a fun??o cria_array_campos so que essa cria para todas as linhas do resultado do select
// feito para substituir a fun??o mostra (ficou bem mais pratico, porque da para aproveitar mais c?digo antigo j? que o array vai ficar igual)
// $a_reg = id do resultado do select
// $a_campos = array com a lista de campos do select
// $nome_array  = nome do array que ser? criado
// Retorna false se n?o tinha mais linha
function cria_matriz_campos(&$a_reg,$a_campos,&$nome_array) {
	 include_once '../auxiliar/strings.inc';
        $rows=0;
	$lin = ibase_fetch_row($a_reg);
	while ($lin) {
		for ($n=0; $n<=sizeof($a_campos) ; $n=$n+1) {
			$nome_campo = strtolower($a_campos[$n]);
                        $nome_array[$rows][$nome_campo] = retiraacentos($lin[$n]); 
				
		}
		$lin = ibase_fetch_row($a_reg);
		$rows++;
	} 	
	return $rows;
} 

//$sql = comando select 
//&$nome_array = array q tera os dados do select - por referencia
function cria_matriz_campos_pelo_sql($sql,&$nome_array) {
	 include_once '../auxiliar/strings.inc';
	$a_reg = qry($con, $sql, $a_campos);
	$rows=0;
	$lin = ibase_fetch_row($a_reg);
	while ($lin) {
		for ($n=0; $n<=sizeof($a_campos) ; $n=$n+1) {
			$nome_campo = strtolower($a_campos[$n]);
			$nome_array[$rows][$nome_campo] = retiraacentos($lin[$n]); 
				
		}
		$lin = ibase_fetch_row($a_reg);
		$rows++;
	} 	
	return $rows;
}



function exec_sql_simples($con, $comando){
  include '../auxiliar/parametros.inc';
	include 'conecta.inc.php';

	$sql = ibase_query($con, $comando);
  
  if($p_ambiente_de_homologacao == 1)
    logQuery($comando);
	ibase_commit($con);
	return $sql;
}

function recebevar($nomevar){
	$var = $_GET[$nomevar];
	if (!$var){
	   $var = $_POST[$nomevar];
	}
	return $var;
}

function lecookie($nomecookie){
    $cookie = $_COOKIE["$nomecookie"]; //pega o cookie
    if ($cookie =='deleted'){ // se n?o existir o cookie o palm retorna o valor 'deleted'
       $cookie = false;
	  // echo $nomecookie.' = '. $cookie; so pra testar
    }
	
    return $cookie;
}

function tratacamponulo($campo){
	if ($campo) {
		return $campo;
	}else{
		return 'null';
	}
}


function TrazValorCampo($tabela, $campo, $chave, $ValorChave){
    $l_select = "SELECT $campo as campo FROM $tabela WHERE ($chave = $ValorChave)";
    $a_reg = qry($con, $l_select, $a_campos);

    if (cria_matriz_campos($a_reg,$a_campos,$l_a_sql)) {
        return  $l_a_sql[0]['campo'];
    }
    else {   return '' ; }
}


function TrazValorCampoWhere($tabela, $campo, $where){
    $l_select = "SELECT $campo as campo FROM $tabela WHERE $where";
    $a_reg = qry($con, $l_select, $a_campos);

    if (cria_matriz_campos($a_reg,$a_campos,$l_a_sql)) {
        return  $l_a_sql[0]['campo'];
    }
    else {   return '' ; }
}


?>