getObjInfraIBanco(); $strTableDrive = get_parent_class($objInfraBanco); $strQuery = ''; switch($strTableDrive) { case 'InfraMySqli': $strQuery = sprintf("ALTER TABLE `%s` ALTER COLUMN `%s` SET DEFAULT '%s'", $strNomeTabela, $strNomeColuna, $strValorPadrao); break; case 'InfraSqlServer': $strQuery = sprintf("ALTER TABLE [%s] ADD DEFAULT('%s') FOR [%s]", $strNomeTabela, $strValorPadrao, $strNomeColuna); case 'InfraOracle': break; } if($bolRetornarQuery === false) { $objInfraBanco->executarSql($strQuery); } else { return $strQuery; } } /** * Verifica se o usuário do drive de conexão possui permissão para criar/ remover * estruturas * * @return PenMetaBD */ public function isDriverPermissao(){ $objInfraBanco = $this->getObjInfraIBanco(); if(count($this->obterTabelas('sei_teste'))==0){ $objInfraBanco->executarSql('CREATE TABLE sei_teste (id '.$this->tipoNumero().' NULL)'); } $objInfraBanco->executarSql('DROP TABLE sei_teste'); return $this; } /** * Verifica se o banco do SEI é suportador pelo atualizador * * @throws InfraException * @return PenMetaBD */ public function isDriverSuportado(){ $strTableDrive = get_parent_class($this->getObjInfraIBanco()); switch($strTableDrive) { case 'InfraMySqli': // Fix para bug de MySQL versão inferior ao 5.5 o default engine // é MyISAM e não tem suporte a FOREING KEYS $version = $this->getObjInfraIBanco()->consultarSql('SELECT VERSION() as versao'); $version = $version[0]['versao']; $arrVersion = explode('.', $version); if($arrVersion[0].$arrVersion[1] < 56){ $this->getObjInfraIBanco()->executarSql('@SET STORAGE_ENGINE=InnoDB'); } case 'InfraSqlServer': case 'InfraOracle': break; default: throw new InfraException('BANCO DE DADOS NAO SUPORTADO: ' . $strTableDrive); } return $this; } /** * Verifica se a versão sistema é compativel com a versão do módulo PEN * * @throws InfraException * @return PenMetaBD */ public function isVersaoSuportada($strRegexVersaoSistema, $strVerMinRequirida){ $numVersaoRequerida = intval(preg_replace('/\D+/', '', $strVerMinRequirida)); $numVersaoSistema = intval(preg_replace('/\D+/', '', $strRegexVersaoSistema)); if($numVersaoRequerida > $numVersaoSistema){ throw new InfraException('VERSAO DO FRAMEWORK PHP INCOMPATIVEL (VERSAO ATUAL '.$strRegexVersaoSistema.', VERSAO REQUERIDA '.$strVerMinRequirida.')'); } return $this; } /** * Apaga a chave primária da tabela * * @throws InfraException * @return PenMetaBD */ public function removerChavePrimaria($strNomeTabela, $strNomeChave){ if($this->isChaveExiste($strNomeTabela, $strNomeChave)) { $strTableDrive = get_parent_class($this->getObjInfraIBanco()); switch($strTableDrive) { case 'InfraMySqli': $this->getObjInfraIBanco()->executarSql('ALTER TABLE '.$strNomeTabela.' DROP PRIMARY KEY'); break; case 'InfraSqlServer': $this->getObjInfraIBanco()->executarSql('ALTER TABLE '.$strNomeTabela.' DROP CONSTRAINT '.$strNomeChave); break; case 'InfraOracle': break; } } return $this; } public function isChaveExiste($strNomeTabela = '', $strNomeChave = ''){ $objInfraBanco = $this->getObjInfraIBanco(); $strTableDrive = get_parent_class($objInfraBanco); switch($strTableDrive) { case 'InfraMySqli': $strSql = " SELECT COUNT(CONSTRAINT_NAME) AS EXISTE FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE CONSTRAINT_SCHEMA = '".$objInfraBanco->getBanco()."' AND TABLE_NAME = '".$strNomeTabela."' AND CONSTRAINT_NAME = '".$strNomeChave."'"; break; case 'InfraSqlServer': $strSql = " SELECT COUNT(CONSTRAINT_NAME) AS EXISTE FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE CONSTRAINT_CATALOG = '".$objInfraBanco->getBanco()."' AND TABLE_NAME = '".$strNomeTabela."' AND CONSTRAINT_NAME = '".$strNomeChave."'"; break; case 'InfraOracle': $strSql = "SELECT 0 AS EXISTE from dual"; break; } $strSql = preg_replace('/\s+/', ' ', $strSql); $arrDados = $objInfraBanco->consultarSql($strSql); return (intval($arrDados[0]['EXISTE']) > 0) ? true : false; } public function adicionarChaveUnica($strNomeTabela = '', $arrNomeChave = array()){ $this->getObjInfraIBanco() ->executarSql('ALTER TABLE '.$strNomeTabela.' ADD CONSTRAINT UK_'.$strNomeTabela.' UNIQUE('.implode(', ', $arrNomeChave).')'); } public function renomearTabela($strNomeTabelaAtual, $strNomeTabelaNovo){ if($this->isTabelaExiste($strNomeTabelaAtual)) { $objInfraBanco = $this->getObjInfraIBanco(); $strTableDrive = get_parent_class($objInfraBanco); $strQuery = ''; switch ($strTableDrive) { case 'InfraMySqli': $strQuery = sprintf("ALTER TABLE `%s` RENAME TO `%s`", $strNomeTabelaAtual, $strNomeTabelaNovo); break; case 'InfraSqlServer': $strQuery = sprintf("sp_rename '%s', '%s'", $strNomeTabelaAtual, $strNomeTabelaNovo); case 'InfraOracle': $strQuery = sprintf("RENAME TABLE %s TO %s", $strNomeTabelaAtual, $strNomeTabelaNovo); break; } $objInfraBanco->executarSql($strQuery); } } /** * Verifica se uma tabela existe no banco * * @throws InfraException * @return bool */ public function isTabelaExiste($strNomeTabela = ''){ $objInfraBanco = $this->getObjInfraIBanco(); $strTableDrive = get_parent_class($objInfraBanco); switch($strTableDrive) { case 'InfraMySqli': $strSql = "SELECT COUNT(TABLE_NAME) AS EXISTE FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = '".$objInfraBanco->getBanco()."' AND TABLE_NAME = '".$strNomeTabela."'"; break; case 'InfraSqlServer': $strSql = "SELECT COUNT(TABLE_NAME) AS EXISTE FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_CATALOG = '".$objInfraBanco->getBanco()."' AND TABLE_NAME = '".$strNomeTabela."'"; break; case 'InfraOracle': $strSql = "SELECT 0 AS EXISTE from dual"; break; } $strSql = preg_replace('/\s+/', ' ', $strSql); $arrDados = $objInfraBanco->consultarSql($strSql); return (intval($arrDados[0]['EXISTE']) > 0) ? true : false; } public function isColuna($strNomeTabela = '', $strNomeColuna = ''){ $objInfraBanco = $this->getObjInfraIBanco(); $strTableDrive = get_parent_class($objInfraBanco); switch($strTableDrive) { case 'InfraMySqli': $strSql = "SELECT COUNT(TABLE_NAME) AS EXISTE FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = '".$objInfraBanco->getBanco()."' AND TABLE_NAME = '".$strNomeTabela."' AND COLUMN_NAME = '".$strNomeColuna."'"; break; case 'InfraSqlServer': $strSql = "SELECT COUNT(COLUMN_NAME) AS EXISTE FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_CATALOG = '".$objInfraBanco->getBanco()."' AND TABLE_NAME = '".$strNomeTabela."' AND COLUMN_NAME = '".$strNomeColuna."'"; break; case 'InfraOracle': $strSql = "SELECT 0 AS EXISTE from dual"; break; } $strSql = preg_replace('/\s+/', ' ', $strSql); $arrDados = $objInfraBanco->consultarSql($strSql); return (intval($arrDados[0]['EXISTE']) > 0) ? true : false; } /** * Cria a estrutura da tabela no padrão ANSI * * @throws InfraException * @return PenMetaBD */ public function criarTabela($arrSchema = array()){ $strNomeTabela = $arrSchema['tabela']; if($this->isTabelaExiste($strNomeTabela)) { return $this; } $objInfraBanco = $this->getObjInfraIBanco(); $arrColunas = array(); $arrStrQuery = array(); foreach($arrSchema['cols'] as $strNomeColuna => $arrColunaConfig) { list($strTipoDado, $strValorPadrao) = $arrColunaConfig; if($strValorPadrao != self::SNULLO && $strValorPadrao != self::NNULLO) { $arrStrQuery[] = $this->adicionarValorPadraoParaColuna($strNomeTabela, $strNomeColuna, $strValorPadrao, true); $strValorPadrao = self::NNULLO; } $arrColunas[] = $strNomeColuna.' '.$strTipoDado.' '.$strValorPadrao; } $objInfraBanco->executarSql('CREATE TABLE '.$strNomeTabela.' ('.implode(', ', $arrColunas).')'); if(!empty($arrSchema['pk'])) { $this->adicionarChavePrimaria($strNomeTabela, 'pk_'.$strNomeTabela, $arrSchema['pk']); if(count($arrSchema['pk']) > 1) { foreach($arrSchema['pk'] as $strPk) { $n = 'idx_'.$strNomeTabela.'_'.$strPk; $n = substr($n, 0, 30); if($n=='idx_md_pen_recibo_tramite_envi' && $strNomeTabela=='md_pen_recibo_tramite_enviado' && $strPk=='numero_registro'){ $n="idx_md_pen_recibo_tramite_env2"; } if($n=='idx_md_pen_recibo_tramite_rece' && $strNomeTabela=='md_pen_recibo_tramite_recebido' && $strPk=='numero_registro'){ $n="idx_md_pen_recibo_tramite_rec2"; } if($n=='idx_md_pen_recibo_tramite_rece' && $strNomeTabela=='md_pen_recibo_tramite_recebido' && $strPk=='hash_assinatura'){ $n="idx_md_pen_recibo_tramite_rec3"; } if($n=='idx_md_pen_rel_processo_apensa' && $strNomeTabela=='md_pen_rel_processo_apensado' && $strPk=='id_procedimento_apensado'){ $n="idx_md_pen_rel_processo_apens2"; } if($n=='idx_md_pen_rel_tarefa_operacao' && $strNomeTabela=='md_pen_rel_tarefa_operacao' && $strPk=='codigo_operacao'){ $n="idx_md_pen_rel_tarefa_operaca2"; } if($n=='idx_md_pen_componente_digital_' && $strNomeTabela=='md_pen_componente_digital' && $strPk=='id_procedimento'){ $n="idx_md_pen_componente_digital2"; } if($n=='idx_md_pen_componente_digital_' && $strNomeTabela=='md_pen_componente_digital' && $strPk=='id_documento'){ $n="idx_md_pen_componente_digital3"; } if($n=='idx_md_pen_componente_digital_' && $strNomeTabela=='md_pen_componente_digital' && $strPk=='id_tramite'){ $n="idx_md_pen_componente_digital4"; } //CREATE INDEX idx_md_pen_componente_digital_ ON md_pen_componente_digital(id_tramite) //CREATE INDEX idx_md_pen_componente_digital_ ON md_pen_componente_digital(id_documento) //CREATE INDEX idx_md_pen_componente_digital_ ON md_pen_componente_digital(id_procedimento) //CREATE INDEX idx_md_pen_rel_tarefa_operacao ON md_pen_rel_tarefa_operacao(codigo_operacao) //CREATE INDEX idx_md_pen_rel_processo_apensa ON md_pen_rel_processo_apensado(id_procedimento_apensado) //CREATE INDEX idx_md_pen_recibo_tramite_rece ON md_pen_recibo_tramite_recebido(hash_assinatura) //CREATE INDEX idx_md_pen_recibo_tramite_rece ON md_pen_recibo_tramite_recebido(numero_registro) //idx_md_pen_recibo_tramite_env2 ON md_pen_recibo_tramite_enviado(numero_registro) //idx_md_pen_recibo_tramite_envi ON md_pen_recibo_tramite_enviado(id_tramite) $objInfraBanco->executarSql('CREATE INDEX '.$n.' ON '.$strNomeTabela.'('.$strPk.')'); } } } if(array_key_exists('uk', $arrSchema) && !empty($arrSchema['uk'])) { $this->adicionarChaveUnica($strNomeTabela, $arrSchema['uk']); } if(!empty($arrSchema['fks'])) { foreach($arrSchema['fks'] as $strTabelaOrigem => $array) { $strNomeFK = 'fk_'.$strNomeTabela.'_'.$strTabelaOrigem; $arrCamposOrigem = (array)array_shift($array); $arrCampos = $arrCamposOrigem; if(!empty($array)) { $arrCampos = (array)array_shift($array); } $this->adicionarChaveEstrangeira($strNomeFK, $strNomeTabela, $arrCampos, $strTabelaOrigem, $arrCamposOrigem); } } if(!empty($arrStrQuery)) { foreach($arrStrQuery as $strQuery) { $objInfraBanco->executarSql($strQuery); } } return $this; } /** * Apagar a estrutura da tabela no banco de dados * * @throws InfraException * @return PenMetaBD */ public function removerTabela($strNomeTabela = ''){ $this->getObjInfraIBanco()->executarSql('DROP TABLE '.$strNomeTabela); return $this; } public function adicionarChaveEstrangeira($strNomeFK, $strTabela, $arrCampos, $strTabelaOrigem, $arrCamposOrigem) { $strNomeFK = substr($strNomeFK, 0, 30); if($strNomeFK=='fk_md_pen_componente_digital_m' && $strTabela=='md_pen_componente_digital' && $strTabelaOrigem=='md_pen_tram' && $arrCampos[0]=='numero_registro'){ $strNomeFK='fk_md_pen_componente_digital_2'; } if($strNomeFK=='fk_md_pen_rel_doc_map_enviado_' && $strTabela=='md_pen_rel_doc_map_enviado' && $strTabelaOrigem=='md_pen_especie_documental' && $arrCampos[0]=='codigo_especie'){ $strNomeFK='fk_md_pen_rel_doc_map_enviado2'; } if($strNomeFK=='fk_md_pen_rel_doc_map_recebido' && $strTabela=='md_pen_rel_doc_map_recebido' && $strTabelaOrigem=='md_pen_especie_documental' && $arrCampos[0]=='codigo_especie'){ $strNomeFK='fk_md_pen_rel_doc_map_recebid2'; } //alter table md_pen_rel_doc_map_recebido add constraint fk_md_pen_rel_doc_map_recebido foreign key (codigo_especie) references md_pen_especie_documental (id_especie) //alter table md_pen_rel_doc_map_enviado add constraint fk_md_pen_rel_doc_map_enviado_ foreign key (codigo_especie) references md_pen_especie_documental (id_especie) //alter table md_pen_componente_digital add constraint fk_md_pen_componente_digital_m foreign key (numero_registro,id_tramite) references md_pen_tram (numero_registro,id_tramite) if(!$this->isChaveExiste($strTabela, $strNomeFK)) { parent::adicionarChaveEstrangeira($strNomeFK, $strTabela, $arrCampos, $strTabelaOrigem, $arrCamposOrigem); } return $this; } public function adicionarChavePrimaria($strTabela, $strNomePK, $arrCampos) { $strNomePK = substr($strNomePK, 0, 30); if(!$this->isChaveExiste($strTabela, $strNomePK)) { parent::adicionarChavePrimaria($strTabela, $strNomePK, $arrCampos); } return $this; } public function alterarColuna($strTabela, $strColuna, $strTipo, $strNull = '') { parent::alterarColuna($strTabela, $strColuna, $strTipo, $strNull); return $this; } public function excluirIndice($strTabela, $strIndex) { if($this->isChaveExiste($strTabela, $strFk)) { parent::excluirIndice($strTabela, $strIndex); } return $this; } public function excluirChaveEstrangeira($strTabela, $strFk) { if($this->isChaveExiste($strTabela, $strFk)) { parent::excluirChaveEstrangeira($strTabela, $strFk); } return $this; } }