#!/usr/bin/php -q 0, "prestadora" => 1, "ini" => 2, "fim" => 3, "spid" => 5); /* * Quantidade de carecteres do campo referido. */ $arLen = array(0 => 7, 1 => 30, 2 => 4, 3 => 4); /* * Posição do campo no arquivo. */ $arPos = array(0 => 0, 1 => 7, 2 => 37, 3 => 41); /* * Campos que não constam no arquivo e são obtidos através de um campo lido no arquivo. */ $arCompl = array(); /* * Diretorio da aplicação. */ $baseDir = dirname(__FILE__); /* * Diretorio para download dos arquivos. */ $dir = "arquivos_cnl"; /* * Nome para o arquivo remoto. */ $remoteFile = sprintf("cnl_movel_%s.zip", date('Y-m-d')); //Arqjuivo compactado. /* * Contera o nome do arquivo de dados descompactados, sempre um txt. */ $workFile = ''; //Arqjuivo txt. /* * url para o arquivo na anatel. */ MsgCnl("acessando local do arquivo!"); $urlFile = "http://sistemas.anatel.gov.br/areaarea/N_Download/Tela.asp?varTIPO=CentralCNL&varPRESTADORA=&varCENTRAL=M&varUF=&varPERIODO=&acao=c&cmd=&varMOD=Publico"; //$urlFile = "http://127.0.0.1/tmp/CE_M_185012.ZIP"; MsgCnl("local do arquivo encontrado!"); /* * Caminho completo para o diretório de download. */ $workDir = sprintf("%s/%s/", $baseDir, $dir); /* * Caminho completo para o arquivo baixado. */ $remoteFile = sprintf("%s%s", $workDir, $remoteFile); try { /* * Verifica se o diretorio exitir apaga seu conteudo do contrario irá cria-lo. */ MsgCnl("Verificando diretorios para download!"); if (!file_exists($workDir)) { mkdir($workDir); } else { system(sprintf("rm -rf %s/*", $workDir)); } /* * Baixa o aquivo remoto. */ MsgCnl("Baixando o arquivo remoto!"); downloadFile($urlFile, $remoteFile); if (!file_exists($remoteFile)) { GeraExcept("Não foi possível baixar o arquivo!"); } /* * Desconpacta o arquivo baixado. */ MsgCnl("Descompactando o arquivo remoto!"); system(sprintf("unzip -q %s -d %s", $remoteFile, $workDir)); /* * Pega o nome do arquivo que será im?ortado. */ $workFile = sprintf("%s%s", $workDir, GetFileByStr($workDir, ".txt")); /* * Verifica se o arquivo foi descompactado. */ if (!file_exists($workFile)) { GeraExcept("Não foi possível descompactar o arquivo!"); } /* * Importa o arquivo para o banco de dados */ MsgCnl("Iniciando a leitura do arquivo!"); if (!($handle = fopen($workFile, 'r'))) { GeraExcept("Não foi possível abrir o arquivo! $workFile "); } /* * Comando para o banco de dados. */ $cmd = sprintf("insert into prefixos(%s)values(%s);\n", GetArrayKey($arCampos), '%s'); /* * Conexão para o banco de daods; */ $connStr = sprintf("host='%s' port='%s' dbname='%s' user='%s' password='%s'", '192.168.115.12', '5432', 'portabilidade', 'contacte', 'ctepgSQL'); //$connStr = sprintf("host='%s' port='%s' dbname='%s' user='%s' password='%s'", '127.0.0.1', '5432', 'pbx', 'contacte', 'ctepgSQL'); $conn = CnpFGetConnection($connStr); /* * Inicia transação com o banco de dados. */ if (!pg_query($conn, "begin")) { GeraExcept("Não foi possível iniciar uma transação!"); } MsgCnl("Transação com banco de dados iniciada!"); MsgCnl("Removendo registros existentes!"); if (!pg_query($conn, "truncate table prefixos")) { GeraExcept("Não foi possível remover os registros existentes!"); } MsgCnl("Registros existentes removidos!"); MsgCnl("Zerando contadores!"); if (!pg_query($conn, "SELECT setval('public.prefixos_id_reg_seq', 1, true)")) { GeraExcept("Não foi possível zerar contadores!"); } MsgCnl("Contadores zerados!"); $i = 0; $numLines = 0; $query = ""; while (!feof($handle)) { $buffer = trim(fgets($handle)); if (!$buffer) { continue; } $values = ''; //Define a operadora $prestadora = trim(substr($buffer, 7, 30)); foreach ($arCampos as $key => $value) { if ($value <= 3) { $pos = GetPosLine($value); $tam = GetPosLine($value, false); $str = trim(substr($buffer, $pos, $tam)); } else { $str = spid($conn, $prestadora); } $values .= !$values ? QuotedStr($str) : ',' . QuotedStr($str); } $query .= sprintf($cmd, $values); $numLines++; if (++$i >= NUM_PACK_INSERT) { if (!pg_query($conn, $query)) { GeraExcept("Não foi possível inserir os registros na base de dados!"); } MsgCnl(sprintf("Inserido %s registros no banco de dados!", str_pad($numLines, 6, '0', STR_PAD_LEFT)), true); $query = ''; $i = 0; } } /* * Se $i < 500 ainda devem ter registros para inserir. */ if ($query) { if (!pg_query($conn, $query)) { GeraExcept("Não foi possível inserir os registros finais na base de dados!"); } MsgCnl(sprintf("Inserido %s registros no banco de dados!", str_pad($numLines, 6, '0', STR_PAD_LEFT))); } /* * verifica se há algum registro na tabela sem SIPD */ $qtde = verificaPrefixo($conn); if ($qtde > 0) MsgCnl("ALERTA: foram inseridos $qtde registros sem SPID, favor verificar!"); /* * Finaliza a transação. */ if (!pg_query($conn, "commit")) { GeraExcept("Não foi possível finalizar a transação!"); } MsgCnl("Operação finalizada com sucesso!"); fclose($handle); } catch (Exception $ex) { $path = '/var/log/asterisk/importa_cnlm.log'; $log = trim($ex->getMessage() . "\n" . GetLasterror() . "\n"); MsgCnl("Erro ao realizar operação: \n" . $log); WriteLog(str_repeat("-", 255) . "\n", $path); WriteLog(sprintf("[Data: %s]\n", date('Y-m-d H:i:s')), $path); WriteLog($log, $path); WriteLog($query, $path); WriteLog(str_repeat("-", 255) . "\n", $path); MsgCnl("Para mais informações consulte o log: $path\n"); } function GetPosLine($key, $pos = true) { global $arLen, $arPos; if ($pos) return $arPos[$key]; else return $arLen[$key]; } function CnpFGetConnection($connStr = '') { /* * Se precisar de uma conexão diferente da padrão, espcifique sua propria connection string. * $connStr = sprintf("host='%s' port='%s' dbname='%s' user='%s' password='%s'", '127.0.0.1', '5432', 'pbx', 'contacte', 'ctepgSQL'); */ $connStr = !$connStr ? GetDefStrDb() : $connStr; $conn = pg_pconnect($connStr); if (!$conn) { GeraExcept("Não foi possível estabelecer uma conexão com o banco de dados!"); } return $conn; } function MsgCnl($msg, $bLine = false) { global $display; if ($display) { echo "\r"; echo "\033[K"; // Erase to the end of the line echo $bLine ? trim(RemoveAcentos($msg)) : ( RemoveAcentos($msg) . "\n"); } } function spid($conn, $oper) { $dados = explode(" ", $oper); $operadora = $dados[0]; $sql = "select spid from atualiza_routing where upper(prestadora) like(upper('%$operadora%')) limit 1"; $result = pg_query($conn, $sql); $row = pg_fetch_row($result); return $row[0]; } function verificaPrefixo($conn) { $sql = "select count(*) from prefixos where (spid is null or spid = '')"; $result = pg_query($conn, $sql); $row = pg_fetch_row($result); return $row[0]; }