<?php
session_name('imediaco_geo');
session_start();

class BD extends PDO {

    protected $BD; //nome do BD
    protected $HOST; //servidor do BD
    protected $USUARIO; //usuario para acessar o BD
    protected $PWD; //senha do usuario para acessar o BD
    protected $SGBD; //o SGBD do BD
    protected $PORTA; //porta do BD
    
    private $bdc; //conexao com o BD
    private $bdstatement; //Represents a prepared statement and, after the statement is executed, an associated result set.
    private $quantidadeRegistros; //quantidade de registros retornados por um sql

    public function __construct($BD = 'imediaco_geo', $HOST = 'localhost', $USUARIO = 'imediaco_geo', $PWD = '3913@Juan', $SGBD = 'mysql', $PORTA = '3306') {
        if(!empty($_SESSION[erro]) && is_string($_SESSION[erro])) {
            $_SESSION[erro] = array($_SESSION[erro]);
        }

        $this->BD = $BD;
        $this->HOST = $HOST;
        $this->USUARIO = $USUARIO;
        $this->PWD = $PWD;
        $this->SGBD = $SGBD;
        $this->PORTA = $PORTA;

        $arraydriveroptions = null;
        if ($SGBD == 'mysql') {
            $arraydriveroptions = array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES \'UTF8\'');
        }

        if ($SGBD == 'postgres') {
            $SGBD = 'pgsql';
        }

        try {
            $this->bdc = new PDO("$SGBD: dbname=$BD;host=$HOST;port=$PORTA", "$USUARIO", "$PWD", $arraydriveroptions);
        } catch (Exception $e) {
            die('Não foi possível conectar-se com o banco de dados: ' . $BD . ' no endereço: ' . $HOST . ' porta: ' . $PORTA . '! ' . $e->getMessage());
        }

        $this->bdstatement = $this->bdc;
    }

    public function executarSQL($sql) {
        $this->bdstatement = $this->bdc->query($sql); //executando o codigo sql
        if ($this->bdstatement === FALSE) {
            $erro = $this->bdc->errorInfo();
//            $_SESSION[erro][] = "Erro ao executar um comando SQL [ $sql ]<br/>" . $erro[2];
            $_SESSION[erro][] = "Erro ao executar um comando SQL<br/>";
            return FALSE;
        }
        //atribuindo a quantidade de registros retornados (SELECT) ou afetados (INSERT, UPDATE...) pelo sql
        if ($this->bdstatement->rowCount() > 0) {//atribuindo a quantidade de registros retornados
            $this->quantidadeRegistros = $this->bdstatement->rowCount();
        } else {
            $this->quantidadeRegistros = NULL;
        }
        return TRUE;
    }

    public function getResultado() {
        if ($this->bdstatement !== false)
            return $this->bdstatement;
        else
            return false;
    }

    public function getObjeto() {
        if ($this->bdstatement !== false)
            return $this->bdstatement->fetchObject();
        else
            return false;
    }

    public function getObjetos() {
        if ($this->bdstatement !== false) {
            $arrayobj = array();
            while ($obj = $this->bdstatement->fetchObject()) {
                $arrayobj[] = $obj;
            }
            return $arrayobj;
        } else
            return false;
    }

    public function getLinha($fetch_style=null) {
        if ($this->bdstatement !== false)
            return $this->bdstatement->fetch($fetch_style);
        else
            return false;
    }

    public function getQuantidadeRegistros() {
        return $this->quantidadeRegistros;
    }

    public function getQuantidadeColunas() {
        return $this->bdstatement->columnCount();
    }

    public function getMetaDadosColuna($i) {
        return $this->bdstatement->getColumnMeta($i);
    }

    public function substituiVazioPorNull($sql) {
        $sql = str_replace("''", 'NULL', $sql);
        return $sql;
    }

    public function getBD() {
        return $this->BD;
    }

    public function getSGBD(){
        return $this->SGBD;
    }
    
    public function log($operacao=null, $query=null, $identificacaotupla=null){
        $ip = $_SERVER['REMOTE_ADDR'].' :: '.$_SERVER['HTTP_X_FORWARDED_FOR'];
        $operacao = Pagina::acertarString($operacao, true);
        $query = Pagina::acertarString($query, true);
        $identificacaotupla = Pagina::acertarString($identificacaotupla, true);
        $usuario = Pagina::acertarString("$_SESSION[uid]::$_SESSION[equipe_id]");
        $sql = "INSERT INTO imediaco_geo.log(usuario, operacao, query, identificacaotupla, ip) VALUES('$usuario', '$operacao', '$query', '$identificacaotupla', '$ip')";
        $this->executarSQL($sql);
    }

}
