/**
  * {@inheritdoc}
  */
 public function commit()
 {
     if ($this->_pdoTransactionsSupported() === true) {
         parent::commit();
     } else {
         $this->exec('COMMIT TRANSACTION');
     }
 }
 public function importaPostgreSQL($arquivo)
 {
     $tmpdir = sys_get_temp_dir();
     $logger = $this->get('logger');
     $importacao = $tmpdir . '/importacao';
     // Tabelas
     $lista_tabelas = array("servidor_autenticacao", "local", "rede", "so", "aplicativo", "aplicativo_rede", "aquisicao", "tipo_licenca", "software", "aquisicao_item", "computador", "descricao_coluna_computador", "grupo_usuario", "insucesso_instalacao", "usuario", "local_secundario", "log", "unid_organizacional_nivel1", "unid_organizacional_nivel1a", "unid_organizacional_nivel2", "patrimonio", "patrimonio_config_interface", "rede_grupo_ftp", "rede_versao_modulo", "software_estacao", "srcacic_chat", "srcacic_conexao", "srcacic_sessao", "srcacic_transf", "teste", "tipo_software", "tipo_uorg", "uorg", "usb_vendor", "usb_device", "usb_log");
     // Sequências
     $lista_sequencias = array("aplicativo" => array("id_aplicativo", "aplicativo_id_aplicativo_seq"), "aquisicao" => array("id_aquisicao", "aquisicao_id_aquisicao_seq"), "computador" => array("id_computador", "computador_id_computador_seq"), "grupo_usuario" => array("id_grupo_usuario", "grupo_usuario_id_grupo_usuario_seq"), "insucesso_instalacao" => array("id_insucesso_instalacao", "insucesso_instalacao_id_insucesso_instalacao_seq"), "local" => array("id_local", "local_id_local_seq"), "log" => array("id_log", "log_id_log_seq"), "patrimonio" => array("id_patrimonio", "patrimonio_id_patrimonio_seq"), "rede_grupo_ftp" => array("id_ftp", "rede_grupo_ftp_id_ftp_seq"), "rede" => array("id_rede", "rede_id_rede_seq"), "rede_versao_modulo" => array("id_rede_versao_modulo", "rede_versao_modulo_id_rede_versao_modulo_seq"), "servidor_autenticacao" => array("id_servidor_autenticacao", "servidor_autenticacao_id_servidor_autenticacao_seq"), "so" => array("id_so", "so_id_so_seq"), "software" => array("id_software", "software_id_software_seq"), "srcacic_action" => array("id_srcacic_action", "srcacic_action_id_srcacic_action_seq"), "srcacic_chat" => array("id_srcacic_chat", "srcacic_chat_id_srcacic_chat_seq"), "srcacic_conexao" => array("id_srcacic_conexao", "srcacic_conexao_id_srcacic_conexao_seq"), "srcacic_sessao" => array("id_srcacic_sessao", "srcacic_sessao_id_srcacic_sessao_seq"), "srcacic_transf" => array("id_srcacic_transf", "srcacic_transf_id_srcacic_transf_seq"), "teste" => array("id_transacao", "teste_id_transacao_seq"), "tipo_licenca" => array("id_tipo_licenca", "tipo_licenca_id_tipo_licenca_seq"), "tipo_software" => array("id_tipo_software", "tipo_software_id_tipo_software_seq"), "tipo_uorg" => array("id_tipo_uorg", "tipo_uorg_id_tipo_uorg_seq"), "unid_organizacional_nivel1" => array("id_unid_organizacional_nivel1", "unid_organizacional_nivel1_id_unid_organizacional_nivel1_seq"), "unid_organizacional_nivel1a" => array("id_unid_organizacional_nivel1a", "unid_organizacional_nivel1a_id_unid_organizacional_nivel1a_seq"), "unid_organizacional_nivel2" => array("id_unid_organizacional_nivel2", "unid_organizacional_nivel2_id_unid_organizacional_nivel2_seq"), "uorg" => array("id_uorg", "uorg_id_uorg_seq"), "usb_log" => array("id_usb_log", "usb_log_id_usb_log_seq"), "usuario" => array("id_usuario", "usuario_id_usuario_seq"));
     // Cria um diretório temporário com todos os dados extraídos
     $zip = new ZipArchive();
     $x = $zip->open($arquivo);
     $logger->info("Extraindo arquivo de importação no diretorio {$importacao}");
     if ($x === TRUE) {
         $zip->extractTo($importacao);
         $zip->close();
         $logger->info('Arquivo.zip extraído com sucesso');
     } else {
         $logger->error("Erro na extração do arquivo {$x}");
         return false;
     }
     // Carrega configurações do banco de dados
     $dbhost = $this->container->getParameter('database_host');
     $db = $this->container->getParameter('database_name');
     $port = $this->container->getParameter('database_port');
     $user = $this->container->getParameter('database_user');
     $pass = $this->container->getParameter('database_password');
     if ($dbhost) {
         $dbcon = new PDOConnection("pgsql:host={$dbhost};dbname={$db};port={$port}", $user, $pass);
     } else {
         $dbcon = new PDOConnection("pgsql:dbname={$db};port={$port}", $user, $pass);
     }
     // Ou funciona tudo ou não funciona nada
     $dbcon->beginTransaction();
     // Primeiro apaga os dados por tabela
     $excluir = array('configuracao_local');
     $excluir = array_reverse(array_merge($lista_tabelas, $excluir));
     foreach ($excluir as $tabela) {
         $logger->info("Apagando a tabela {$tabela}");
         try {
             // Apaga a tabela e carrega os dados do arquivo CSV
             $dbcon->exec("DELETE FROM {$tabela} CASCADE");
         } catch (Exception $e) {
             // Falha, dá um rollback e retorna falso
             $logger->error("Erro na exclusão \n" . $e->getMessage());
             $dbcon->rollBack();
             return false;
         }
     }
     // Agora carrega os dados
     foreach ($lista_tabelas as $tabela) {
         if (file_exists("{$importacao}/{$tabela}.csv")) {
             $logger->info("Importando a tabela {$tabela}");
             try {
                 // Apaga a tabela e carrega os dados do arquivo CSV
                 $dbcon->exec("COPY {$tabela} FROM '{$tmpdir}/importacao/{$tabela}.csv' DELIMITER ';' NULL E'\\\\N' CSV ESCAPE '\"'");
             } catch (Exception $e) {
                 // Falha, dá um rollback e retorna falso
                 $logger->error("Erro na importação \n" . $e->getMessage());
                 $dbcon->rollBack();
                 return false;
             }
         }
     }
     // Se tudo funcionou bem, é prciso ajustar o valor das sequências
     foreach ($lista_sequencias as $tabela => $value) {
         // Atualiza as sequencias de auto-increment
         $logger->info("Carregando a sequência para a tabela {$tabela} ....");
         foreach ($dbcon->query("SELECT MAX({$value[0]}) AS {$value['0']} FROM {$tabela}") as $row) {
             $result = $row["{$value[0]}"];
         }
         if ($result) {
             $logger->info("Ajustando a sequência {$value[1]}  para o valor máximo {$result} ...");
             $dbcon->exec("SELECT setval('{$value[1]}', {$result})");
         } else {
             $logger->error("Valor máximo não encontrado para a tabela {$tabela}, ID {$value[0]} e sequência {$value[1]}");
         }
     }
     // Finaliza a transação
     $dbcon->commit();
     // Armazena as senhas para todos os usuários criados
     $arrUsuarios = $this->getDoctrine()->getRepository('CacicCommonBundle:Usuario')->findAll();
     foreach ($arrUsuarios as $usuario) {
         $logger->info("Corrige a senha do usuario {$usuario->getNmUsuarioCompleto()} .....");
         $encoder = $this->container->get('security.encoder_factory')->getEncoder($usuario);
         // Guarda a senha criptografada
         $usuario->setTeSenha($encoder->encodePassword($usuario->getTeSenha(), $usuario->getSalt()));
         $this->getDoctrine()->getManager()->persist($usuario);
         $this->getDoctrine()->getManager()->flush();
     }
     // Finaliza a importação e apaga os arquivos
     $fs = new Filesystem();
     $fs->remove($importacao);
     return true;
 }