//----------------------------------------------------------- void Tipo::converterParametrosFuncoes(bool conv_inversa) { unsigned i, conf_funcs[]={ FUNCAO_INPUT, FUNCAO_RECV, FUNCAO_OUTPUT, FUNCAO_SEND }; TipoFuncao conf_func; Parametro param; Funcao *funcao=NULL; for(i=0; i < 4; i++) { funcao=funcoes[conf_funcs[i]]; if(funcao) { /* Para as funções OUTPUT e SEND a conversão normal é mudar o tipo do primeiro parâmetro de 'any' para o tipo 'this' já a conversão inversa faz o processo contrário */ if(conf_funcs[i]==FUNCAO_OUTPUT || conf_funcs[i]==FUNCAO_SEND) { param=funcao->obterParametro(0); funcao->removerParametro(0); if(!conv_inversa) { param.definirTipo(TipoPgSQL(this)); funcao->adicionarParametro(param); } else { param.definirTipo(TipoPgSQL("any")); funcao->adicionarParametro(param); } } /* Para as funções INPUT e RECV a conversão normal é mudar o tipo de retorno de 'any' para o tipo 'this' já a conversão inversa faz o processo contrário */ else if(conf_funcs[i]==FUNCAO_INPUT || conf_funcs[i]==FUNCAO_RECV) { if(!conv_inversa) funcao->definirTipoRetorno(TipoPgSQL(this)); else funcao->definirTipoRetorno(TipoPgSQL("any")); } } } }
//---------------------------------------------------------- Parametro FuncaoWidget::obterParametro(TabelaObjetosWidget *tab, unsigned idx_lin) { Parametro param; QString str_aux; if(tab) { try { /* Configura o nome do parâmetro com o texto da coluna de nome da linha especificada da tabela */ param.definirNome(tab->obterTextoCelula(idx_lin,0)); //Configura o tipo do parâmetro com o tipo armazenado na linha atual da tabela param.definirTipo(tab->obterDadoLinha(idx_lin).value<TipoPgSQL>()); //Obtendo informações específicas quando se trata da tabela de parâmetros if(tab==tab_parametros) { //Marcando se o parâmetro é de entrada/saída de acordo com o texto da coluna da tabela str_aux=tab->obterTextoCelula(idx_lin, 2); param.definirEntrada(str_aux.contains("IN")); param.definirSaida(str_aux.contains("OUT")); //Configura o valor padrâo do parâmetro param.definirValorPadrao(tab->obterTextoCelula(idx_lin,3)); } } catch(Excecao &e) { throw Excecao(e.obterMensagemErro(),e.obterTipoErro(),__PRETTY_FUNCTION__,__FILE__,__LINE__, &e); } } return(param); }
//---------------------------------------------------------- void FuncaoWidget::aplicarConfiguracao(void) { try { Funcao *func=NULL; unsigned qtd, i; Parametro param; QString str_aux; //Inicia a configuração da função iniciarConfiguracao<Funcao>(); //Faz a conversão do objeto editado (genérico) para o tipo função func=dynamic_cast<Funcao *>(this->objeto); //Atribui os valores básicos configurados no formulário para a função func->definirLinguagem(modelo->obterObjeto(linguagem_cmb->currentText(), OBJETO_LINGUAGEM)); func->definirTipoFuncao(tipo_func_cmb->currentText()); func->definirFuncaoJanela(func_janela_chk->isChecked()); func->definirCustoExecucao(custo_exec_spb->value()); func->definirQuantidadeLinhas(linhas_ret_sbp->value()); func->definirTipoComportamento(comportamento_cmb->currentText()); func->definirTipoSeguranca(seguranca_cmb->currentText()); /* Remove todos os parâmetros da função para adicionar os que foram configurados no formulário */ func->removerParametros(); //Obtém a quantidade de parâmetros configurados no formulário qtd=tab_parametros->obterNumLinhas(); for(i=0; i < qtd; i++) { /* Cria um parâmetro auxiliar e os configura de acordo com os valores do parâmetro atual (i) na tabela */ param.definirNome(tab_parametros->obterTextoCelula(i,0)); param.definirTipo(tab_parametros->obterDadoLinha(i).value<TipoPgSQL>()); str_aux=tab_parametros->obterTextoCelula(i,2); param.definirEntrada(str_aux.indexOf("IN") >= 0); param.definirSaida(str_aux.indexOf("OUT") >= 0); param.definirValorPadrao(tab_parametros->obterTextoCelula(i,3)); //Uma vez configurado esse parâmetro e inserido na função func->adicionarParametro(param); } /* Caso a linguagem selecionada no formulário for a C indica que a função está definida em uma biblioteca externa para tanto os valores dos campos biblioteca e simbolo serão atribuídos à função que está sendo configurada */ if(linguagem_cmb->currentText()==~TipoLinguagem(TipoLinguagem::c)) { func->definirBiblioteca(biblioteca_edt->text()); func->definirSimbolo(simbolo_edt->text()); } /* Caso a linguagem seja diferente de C atribui o código fonte definido no destacador de código do formulário */ else func->definirCodigoFonte(codigofonte_txt->toPlainText()); //Caso o tipo de retorno configurado no formulário seja simples ou conjunto if(simples_rb->isChecked() || conjunto_rb->isChecked()) { /* Define o tipo de retorno da função obtendo o tipo definido no widget de configuração de tipos pgsql */ func->definirTipoRetorno(tipo_ret->obterTipoPgSQL()); /* Marca na função se a mesma retorna um conjunto de dados de acordo com o estado do radiobox 'conjunto_rb' */ func->definirRetornaSetOf(conjunto_rb->isChecked()); } //Caso a função retorna uma tabela, a mesma é atribuída à função else { func->removerTiposRetTabela(); qtd=tab_retorno->obterNumLinhas(); /* Adiciona uma coluna na tabela de retorno com os dados configurados na tabela respectiva do formulário */ for(i=0; i<qtd; i++) { func->adicionarTipoRetTabela(tab_retorno->obterTextoCelula(i,0), tab_retorno->obterDadoLinha(i).value<TipoPgSQL>()); } } //Finaliza a configuração da função ObjetoBaseWidget::aplicarConfiguracao(); /* Executa a validação da função em relação aos objetos das classes ConversaoCodificacao, ConversaoTipo, ElemClasseOperadores, FuncaoAgregada, Gatilho, Linguagem, Operador, Tipo */ validarFuncaoConfigurada(); finalizarConfiguracao(); } catch(Excecao &e) { /* Cancela a configuração o objeto removendo a ultima operação adicionada referente ao objeto editado/criado e desaloca o objeto caso o mesmo seja novo */ cancelarConfiguracao(); throw Excecao(e.obterMensagemErro(),e.obterTipoErro(),__PRETTY_FUNCTION__,__FILE__,__LINE__, &e); } }