<?php
ini_set('date.timezone', 'America/Fortaleza');
/*************************************************************************************************************  
 * @author William F. Leite                                                                                   *  
 * Data: 20/06/2014                                                                                           *  
 * Descrição: Classe elaborada com o objetivo de auxlilar nas operações CRUDs em diversos SGBDS, possui       *  
 * funcionalidades para construir instruções de INSERT, UPDATE E DELETE onde as mesmas podem ser executadas   *  
 * nos principais SGBDs, exemplo SQL Server, MySQL e Firebird. Instruções SELECT são recebidas integralmente  *  
 * via parâmetro.                                                                                             *  
 *************************************************************************************************************/


/*
 * Constantes de parâmetros para configuração da conexão
 */
define('SGBD', 'postgre');
define('HOST', 'localhost');
define('DBNAME', 'w_food');
define('CHARSET', 'utf8');
define('USER', 'postgres');
define('PASSWORD', 'postgres');
define('SERVER', 'windows');
define('PORT', '5432');

class conexao
{

    /*
     * Atributo estático de conexão
     */
    private static $pdo;

    /*
     * Escondendo o construtor da classe
     */
    private function __construct()
    {
        //
    }

    /*
     * Método privado para verificar se a extensão PDO do banco de dados escolhido
     * está habilitada
     */
    private static function verificaExtensao()
    {

        switch (SGBD):
            case 'mysql':
                $extensao = 'pdo_mysql';
                break;
            case 'mssql': {
                    if (SERVER == 'linux'):
                        $extensao = 'pdo_dblib';
                    else:
                        $extensao = 'pdo_sqlsrv';
                    endif;
                    break;
                }
            case 'postgre':
                $extensao = 'pdo_pgsql';
                break;
        endswitch;

        if (!extension_loaded($extensao)):
            echo "<h1>Extensão {$extensao} não habilitada!</h1>";
            exit();
        endif;
    }

    /*
     * Método estático para retornar uma conexão válida
     * Verifica se já existe uma instância da conexão, caso não, configura uma nova conexão
     */
    public static function getInstance()
    {

        self::verificaExtensao();

        if (!isset(self::$pdo)) {
            try {
                $opcoes = [];
                switch (SGBD):
                    case 'mysql':
                        $opcoes = array(\PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES UTF8');
                        self::$pdo = new \PDO("mysql:host=" . HOST . "; dbname=" . DBNAME . ";", USER, PASSWORD, $opcoes);
                        break;
                    case 'mssql': {
                            if (SERVER == 'linux'):
                                self::$pdo = new \PDO("dblib:host=" . HOST . "; database=" . DBNAME . ";", USER, PASSWORD, $opcoes);
                            else:
                                self::$pdo = new \PDO("sqlsrv:server=" . HOST . "; database=" . DBNAME . ";", USER, PASSWORD, $opcoes);
                            endif;
                            break;
                        }
                    case 'postgre':
                        self::$pdo = new \PDO("pgsql:host=" . HOST . "; dbname=" . DBNAME . ";port=" . PORT . ";", USER, PASSWORD, $opcoes);
                        break;
                endswitch;
                self::$pdo->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
            } catch (PDOException $e) {
                print "Erro: " . $e->getMessage();
            }
        }
        return self::$pdo;
    }

    public static function isConectado()
    {

        if (self::$pdo):
            return true;
        else:
            return false;
        endif;
    }
}
