Skip to content
Browse files

Correção de bug na forma como o código XML/SQL era gerado pelo Modelo,

restrições, gatilhos e índices especiais não eram gerados no SQL.
Correção de bug na classe Referencia a qual não estava aceitando alias
em branco.
Corrição de uma série de bugs relacionados à janela de edição de views.
Correção no método Restricao::referenciaColunaIncRelacao() que em
determinadas situações entrava em loop infinito.
  • Loading branch information...
1 parent 2289a9b commit b09b17c4063ee9669a0a7554a9de9737e3bef675 @rkhaotix rkhaotix committed Sep 3, 2012
View
105 libpgmodeler/src/modelobd.cpp
@@ -1414,7 +1414,6 @@ void ModeloBD::obterXMLObjetosEspeciais(void)
}
}
-
/* Varre a lista de visões para verificar aquelas as quais possam estar
referenciando colunas adicionadas por relacionamentos. */
itr=visoes.begin();
@@ -4668,7 +4667,7 @@ Restricao *ModeloBD::criarRestricao(ObjetoBase *objeto)
ERR_PGMODELER_ALOCPKFORMAINVALIDA,__PRETTY_FUNCTION__,__FILE__,__LINE__);
//Efetuando configurações específicas para chaves estrangeiras
- if(tipo_rest==TipoRestricao::foreign_key && tipo_objeto==OBJETO_TABELA)
+ if(tipo_rest==TipoRestricao::foreign_key /*&& tipo_objeto==OBJETO_TABELA*/)
{
//Define se a restrição é postergavel (apenas para chaves estrangeiras)
postergavel=(atributos[AtributosParsers::POSTERGAVEL]==AtributosParsers::VERDADEIRO);
@@ -4754,27 +4753,27 @@ Restricao *ModeloBD::criarRestricao(ObjetoBase *objeto)
//Varre a lista de nomes de colunas e as obtém da tabela a qual possuirá a restrição
for(i=0; i < qtd; i++)
{
- if(tipo_objeto==OBJETO_TABELA)
+ if(tipo_coluna==Restricao::COLUNA_ORIGEM)
{
- if(tipo_coluna==Restricao::COLUNA_ORIGEM)
+ if(tipo_objeto==OBJETO_TABELA)
{
coluna=tabela->obterColuna(lista_cols[i]);
//Caso a coluna não for encontrada, tenta obtê-la referenciando seu nome antigo
if(!coluna)
coluna=tabela->obterColuna(lista_cols[i], true);
}
else
- {
- tabela_aux=dynamic_cast<Tabela *>(tabela_ref);
- coluna=tabela_aux->obterColuna(lista_cols[i]);
- //Caso a coluna não for encontrada, tenta obtê-la referenciando seu nome antigo
- if(!coluna)
- coluna=tabela_aux->obterColuna(lista_cols[i], true);
- }
+ //Para os demais tipos de relacionamento as colunas a serem obtidas são os atributos do relacionamento
+ coluna=dynamic_cast<Coluna *>(relacao->obterObjeto(lista_cols[i], OBJETO_COLUNA));
}
else
- //Para os demais tipos de relacionamento as colunas a serem obtidas são os atributos do relacionamento
- coluna=dynamic_cast<Coluna *>(relacao->obterObjeto(lista_cols[i], OBJETO_COLUNA));
+ {
+ tabela_aux=dynamic_cast<Tabela *>(tabela_ref);
+ coluna=tabela_aux->obterColuna(lista_cols[i]);
+ //Caso a coluna não for encontrada, tenta obtê-la referenciando seu nome antigo
+ if(!coluna)
+ coluna=tabela_aux->obterColuna(lista_cols[i], true);
+ }
//Adiciona a coluna à restrição
restricao->adicionarColuna(coluna, tipo_coluna);
@@ -4789,7 +4788,15 @@ Restricao *ModeloBD::criarRestricao(ObjetoBase *objeto)
{
//Caso a restrição criada não seja uma chave primária insere-a normalmente na tabela
if(restricao->obterTipoRestricao()!=TipoRestricao::primary_key)
+ {
tabela->adicionarRestricao(restricao);
+
+ /* Caso a tabela receptora da restrição esteja inserida no modelo, força o seu redesenho.
+ Isso é útil para atualizar tabelas as quais tiveram restrições adicionadas após a sua
+ criação */
+ if(this->obterIndiceObjeto(tabela) >= 0)
+ tabela->definirModificado(true);
+ }
}
}
catch(Excecao &e)
@@ -5997,7 +6004,7 @@ QString ModeloBD::obterDefinicaoObjeto(unsigned tipo_def, bool exportar_arq)
tipo_def_str=(tipo_def==ParserEsquema::DEFINICAO_SQL ? "SQL" : "XML");
Tipo *tipo_usr=NULL;
map<unsigned, ObjetoBase *> mapa_objetos;
- vector<unsigned> vet_id_objs;
+ vector<unsigned> vet_id_objs, vet_id_objs_tab;
Tabela *tabela=NULL;
Indice *indice=NULL;
Gatilho *gatilho=NULL;
@@ -6073,7 +6080,7 @@ QString ModeloBD::obterDefinicaoObjeto(unsigned tipo_def, bool exportar_arq)
/* Para definição XML todos os 16 tipos da lista 'tipos_objs' são tratados.
Para definição SQL são tratados apenas os 12 primeiros (tabelas, relacionamentos, visões e sequências)
são tratadas separadamente pois existe uma ordem específica em que elas precisam ser criadas e essa
- ordem é definina na interação após a ordenação dos objetos */
+ ordem é definida na interação após a ordenação dos objetos */
if(tipo_def==ParserEsquema::DEFINICAO_XML)
qtd=16;
else
@@ -6111,13 +6118,14 @@ QString ModeloBD::obterDefinicaoObjeto(unsigned tipo_def, bool exportar_arq)
}
}
- /* Caso a definição seja XML executa um trecho especial que é
- a obtenção e armazenamento dos objetos especiais (os quais
+ /* ** Trecho especial **:
+ Obtenção e armazenamento dos objetos especiais (os quais
referenciam colunas de tabelas adicionadas por relacionamentos)
- no mapa de objetos. Para isso a lista de tabelas é varrida novamente
- e suas restrições e índices são validados como especiais ou não */
- if(tipo_def==ParserEsquema::DEFINICAO_XML)
- {
+ no mapa de objetos e seus ids em um vetor auxiliar de ids 'vet_id_objs_tab'.
+ Para isso a lista de tabelas é varrida novamente e suas restrições e índices
+ são validados como especiais ou não. O vetor de ids é concatenado ao vetor de ids principal
+ antes de sua ordenação quando a definição é XML ou concatenado após a ordenação para def. SQL, desta
+ forma os objetos especiais são criados de forma correta em ambas as linguagens */
itr=tabelas.begin();
itr_end=tabelas.end();
@@ -6140,7 +6148,7 @@ QString ModeloBD::obterDefinicaoObjeto(unsigned tipo_def, bool exportar_arq)
//Armazena o objeto em si no mapa de objetos
mapa_objetos[restricao->obterIdObjeto()]=restricao;
//Armazena o id do objeto na lista de ids usada para referenciar os objetos no mapa
- vet_id_objs.push_back(restricao->obterIdObjeto());
+ vet_id_objs_tab.push_back(restricao->obterIdObjeto());
}
}
@@ -6156,7 +6164,7 @@ QString ModeloBD::obterDefinicaoObjeto(unsigned tipo_def, bool exportar_arq)
//Armazena o objeto em si no mapa de objetos
mapa_objetos[gatilho->obterIdObjeto()]=gatilho;
//Armazena o id do objeto na lista de ids usada para referenciar os objetos no mapa
- vet_id_objs.push_back(gatilho->obterIdObjeto());
+ vet_id_objs_tab.push_back(gatilho->obterIdObjeto());
}
}
@@ -6172,11 +6180,15 @@ QString ModeloBD::obterDefinicaoObjeto(unsigned tipo_def, bool exportar_arq)
//Armazena o objeto em si no mapa de objetos
mapa_objetos[indice->obterIdObjeto()]=indice;
//Armazena o id do objeto na lista de ids usada para referenciar os objetos no mapa
- vet_id_objs.push_back(indice->obterIdObjeto());
+ vet_id_objs_tab.push_back(indice->obterIdObjeto());
}
}
}
- }
+
+ /* Concatena o vetor de ids auxiliar (ids de objetos especiais) ao vetor de ids principal
+ antes da ordenação caso a definição seja XML */
+ if(tipo_def==ParserEsquema::DEFINICAO_XML)
+ vet_id_objs.insert(vet_id_objs.end(), vet_id_objs_tab.begin(), vet_id_objs_tab.end());
//Ordena o vetor de identificadores em ordem crescente
sort(vet_id_objs.begin(), vet_id_objs.end());
@@ -6235,6 +6247,11 @@ QString ModeloBD::obterDefinicaoObjeto(unsigned tipo_def, bool exportar_arq)
}
}
+ /* Concatena o vetor de ids auxiliar (ids de objetos especiais) ao vetor de ids principal
+ após a ordenação caso a definição seja SQL */
+ if(tipo_def==ParserEsquema::DEFINICAO_SQL)
+ vet_id_objs.insert(vet_id_objs.end(), vet_id_objs_tab.begin(), vet_id_objs_tab.end());
+
atribs_aux[AtributosParsers::TIPOS_SHELL]="";
/* Caso a definição seja SQL e existam tipos definidos pelo usuário
@@ -6290,6 +6307,10 @@ QString ModeloBD::obterDefinicaoObjeto(unsigned tipo_def, bool exportar_arq)
else
atribs_aux[atrib]+=this->__obterDefinicaoObjeto(tipo_def);
}
+ else if(tipo_obj==OBJETO_RESTRICAO)
+ {
+ atribs_aux[atrib]+=dynamic_cast<Restricao *>(objeto)->obterDefinicaoObjeto(tipo_def, true);
+ }
else
{
/* Desprezando as linguagens c e sql
@@ -7519,8 +7540,8 @@ void ModeloBD::obterReferenciasObjeto(ObjetoBase *objeto, vector<ObjetoBase *> &
Coluna *coluna=dynamic_cast<Coluna *>(objeto);
vector<ObjetoBase *> *lista_obj=NULL;
vector<ObjetoBase *>::iterator itr, itr_end;
- TipoObjetoBase tipos_obj[]={ OBJETO_SEQUENCIA, OBJETO_VISAO, OBJETO_TABELA };
- unsigned i, qtd=3;
+ TipoObjetoBase tipos_obj[]={ OBJETO_SEQUENCIA, OBJETO_VISAO, OBJETO_TABELA, OBJETO_RELACAO };
+ unsigned i, qtd=4;
for(i=0; i < qtd && (!modo_exclusao || (modo_exclusao && !refer)); i++)
{
@@ -7548,9 +7569,20 @@ void ModeloBD::obterReferenciasObjeto(ObjetoBase *objeto, vector<ObjetoBase *> &
else if(tipos_obj[i]==OBJETO_TABELA)
{
Tabela *tab=dynamic_cast<Tabela *>(*itr);
- unsigned qtd_gat, idx, qtd1, i1;
+ unsigned qtd_gat, qtd_rest, idx, qtd1, i1;
Gatilho *gat=NULL;
+ qtd_rest=tab->obterNumRestricoes();
+ for(idx=0; idx < qtd_rest && (!modo_exclusao || (modo_exclusao && !refer)); idx++)
+ {
+ if(tab->obterRestricao(idx)->colunaExistente(coluna, Restricao::COLUNA_ORIGEM) ||
+ tab->obterRestricao(idx)->colunaExistente(coluna, Restricao::COLUNA_REFER))
+ {
+ refer=true;
+ vet_refs.push_back(tab->obterRestricao(idx));
+ }
+ }
+
qtd_gat=tab->obterNumGatilhos();
for(idx=0; idx < qtd_gat && (!modo_exclusao || (modo_exclusao && !refer)); idx++)
{
@@ -7567,6 +7599,23 @@ void ModeloBD::obterReferenciasObjeto(ObjetoBase *objeto, vector<ObjetoBase *> &
}
}
}
+ else if(tipos_obj[i]==OBJETO_RELACAO)
+ {
+ Relacionamento *rel=dynamic_cast<Relacionamento *>(*itr);
+ unsigned qtd_rest, idx;
+
+ qtd_rest=rel->obterNumRestricoes();
+ for(idx=0; idx < qtd_rest && (!modo_exclusao || (modo_exclusao && !refer)); idx++)
+ {
+ if(rel->obterRestricao(idx)->colunaExistente(coluna, Restricao::COLUNA_ORIGEM) ||
+ rel->obterRestricao(idx)->colunaExistente(coluna, Restricao::COLUNA_REFER))
+ {
+ refer=true;
+ vet_refs.push_back(rel);
+ }
+ }
+ }
+
itr++;
}
}
View
4 libpgmodeler/src/referencia.cpp
@@ -13,8 +13,8 @@ Referencia::Referencia(Tabela *tabela, Coluna *coluna, const QString &alias_tab,
/* Caso o alias atribuido à tabela/expressão ou coluna seja inválido
de acordo com a regra de nomenclatura do PostgreSQL */
- else if(!ObjetoBase::nomeValido(alias_tab) ||
- !ObjetoBase::nomeValido(alias_col))
+ else if((!alias_tab.isEmpty() && !ObjetoBase::nomeValido(alias_tab)) ||
+ (!alias_col.isEmpty() && !ObjetoBase::nomeValido(alias_col)))
throw Excecao(ERR_PGMODELER_ATRNOMEOBJINV,__PRETTY_FUNCTION__,__FILE__,__LINE__);
/* Caso se tente criar uma referência a uma coluna cuja tabela pai seja
View
17 libpgmodeler/src/relacionamento.cpp
@@ -75,7 +75,7 @@ Relacionamento::Relacionamento(const QString &nome, unsigned tipo_rel, Tabela *t
qtd_cols_rejeitadas=0;
definirIdentificador(identificador);
- atributos[AtributosParsers::RESTRICAO]="";
+ atributos[AtributosParsers::RESTRICOES]="";
atributos[AtributosParsers::TABELA]="";
atributos[AtributosParsers::RELAC_NN]="";
atributos[AtributosParsers::RELAC_GEN]="";
@@ -2280,11 +2280,22 @@ QString Relacionamento::obterDefinicaoObjeto(unsigned tipo_def)
{
if(fk_rel1n && (tipo_relac==RELACIONAMENTO_11 || tipo_relac==RELACIONAMENTO_1N))
{
+ unsigned qtd, i;
+
atributos[AtributosParsers::RELAC_1N]="1";
- atributos[AtributosParsers::RESTRICAO]=fk_rel1n->obterDefinicaoObjeto(tipo_def);
+ atributos[AtributosParsers::RESTRICOES]=fk_rel1n->obterDefinicaoObjeto(tipo_def);
if(uq_rel11)
- atributos[AtributosParsers::RESTRICAO]+=uq_rel11->obterDefinicaoObjeto(tipo_def);
+ atributos[AtributosParsers::RESTRICOES]+=uq_rel11->obterDefinicaoObjeto(tipo_def);
+
+ qtd=restricoes_rel.size();
+ for(i=0; i < qtd; i++)
+ {
+ if(dynamic_cast<Restricao *>(restricoes_rel[i])->obterTipoRestricao()!=TipoRestricao::primary_key)
+ atributos[AtributosParsers::RESTRICOES]+=dynamic_cast<Restricao *>(restricoes_rel[i])->
+ obterDefinicaoObjeto(tipo_def, false);
+
+ }
atributos[AtributosParsers::TABELA]=obterTabelaReceptora()->obterNome(true);
}
View
2 libpgmodeler/src/restricao.cpp
@@ -361,7 +361,7 @@ bool Restricao::referenciaColunaIncRelacao(void)
e nenhuma das colunas desta vieram de relacionamentos, a
lista de colunas referenciadas é que será varrida com o
mesmo intuito */
- if(itr==itr_end && !enc)
+ if(itr==itr_end && itr_end!=colunas_ref.end() && !enc)
{
itr=colunas_ref.begin();
itr_end=colunas_ref.end();
View
21 libpgmodeler_ui/src/modelowidget.cpp
@@ -245,9 +245,6 @@ ModeloWidget::ModeloWidget(QWidget *parent) : QWidget(parent)
connect(cena, SIGNAL(s_menupopupRequisitado(vector<ObjetoBase*>)), this, SLOT(exibirMenuObjetoTabela(vector<ObjetoBase *>)));
connect(cena, SIGNAL(s_objetoSelecionado(ObjetoGraficoBase*,bool)), this, SLOT(configurarSelecaoObjetos(void)));
-
- viewport->horizontalScrollBar()->installEventFilter(this);
- viewport->verticalScrollBar()->installEventFilter(this);
}
//----------------------------------------------------------
ModeloWidget::~ModeloWidget(void)
@@ -291,6 +288,15 @@ bool ModeloWidget::eventFilter(QObject *objeto, QEvent *evento)
return(QWidget::eventFilter(objeto, evento));
}
//----------------------------------------------------------
+void ModeloWidget::keyReleaseEvent(QKeyEvent *evento)
+{
+ if(evento->key()==Qt::Key_Control)
+ {
+ viewport->horizontalScrollBar()->removeEventFilter(this);
+ viewport->verticalScrollBar()->removeEventFilter(this);
+ }
+}
+//----------------------------------------------------------
void ModeloWidget::keyPressEvent(QKeyEvent *evento)
{
//Cancela a ação de inserção do objeto quando ESC é pressionado
@@ -299,6 +305,11 @@ void ModeloWidget::keyPressEvent(QKeyEvent *evento)
this->cancelarAdicaoObjeto();
cena->clearSelection();
}
+ else if(evento->key()==Qt::Key_Control)
+ {
+ viewport->horizontalScrollBar()->installEventFilter(this);
+ viewport->verticalScrollBar()->installEventFilter(this);
+ }
}
//----------------------------------------------------------
void ModeloWidget::mousePressEvent(QMouseEvent *evento)
@@ -343,6 +354,7 @@ void ModeloWidget::wheelEvent(QWheelEvent * evento)
else
//Aumenta o zoom
this->aplicarZoom(this->zoom_atual + INC_ZOOM);
+ viewport->centerOn(viewport->mapToScene(evento->pos()));
}
}
//----------------------------------------------------------
@@ -355,9 +367,10 @@ void ModeloWidget::aplicarZoom(float zoom)
viewport->resetTransform();
//Aplica a matriz de escala para ampliar/reduzir a visão
viewport->scale(zoom, zoom);
+
+ viewport->centerOn(0,0);
//Armazena o zoom aplicado como atual
this->zoom_atual=zoom;
-
emit s_zoomModificado();
}
}
View
1 libpgmodeler_ui/src/modelowidget.h
@@ -113,6 +113,7 @@ class ModeloWidget: public QWidget {
void mousePressEvent(QMouseEvent *evento);
void keyPressEvent(QKeyEvent *evento);
void focusInEvent(QFocusEvent *evento);
+ void keyReleaseEvent(QKeyEvent *evento);
//Modifica o zoom do viewport quando se pressiona CONTROL e utiliza o wheel do mouse
void wheelEvent(QWheelEvent * evento);
View
4 libpgmodeler_ui/src/restricaowidget.cpp
@@ -500,6 +500,10 @@ void RestricaoWidget::aplicarConfiguracao(void)
restricao->definirTipoAcao(TipoAcao(acao_delete_cmb->currentText()),false);
restricao->definirTipoAcao(TipoAcao(acao_update_cmb->currentText()),true);
+ //Caso seja uma chave estrangeira, atribui a tabela referenciada
+ if(restricao->obterTipoRestricao()==TipoRestricao::foreign_key)
+ restricao->definirTabReferenciada(sel_tabela_ref->obterObjeto());
+
//Remove todas as colunas da restrição para inserir as presentes na tabela
restricao->removerColunas();
for(tipo_col=Restricao::COLUNA_ORIGEM; tipo_col <= Restricao::COLUNA_REFER; tipo_col++)
View
7 libpgmodeler_ui/src/visaowidget.cpp
@@ -59,10 +59,15 @@ VisaoWidget::VisaoWidget(QWidget *parent): ObjetoBaseWidget(parent, OBJETO_VISAO
connect(tab_referencias, SIGNAL(s_linhaAdicionada(int)), this, SLOT(manipularReferencia(int)));
connect(tab_referencias, SIGNAL(s_linhaAtualizada(int)), this, SLOT(manipularReferencia(int)));
connect(tab_referencias, SIGNAL(s_linhaEditada(int)), this, SLOT(editarReferencia(int)));
-
+ /*
+ connect(tab_referencias, SIGNAL(s_linhaAtualizada(int)), this, SLOT(atualizarPrevisaoCodigo(void)));
connect(tab_referencias, SIGNAL(s_linhasMovidas(int,int)), this, SLOT(atualizarPrevisaoCodigo(void)));
connect(tab_referencias, SIGNAL(s_linhasRemovidas(void)), this, SLOT(atualizarPrevisaoCodigo(void)));
connect(tab_referencias, SIGNAL(s_linhaRemovida(int)), this, SLOT(atualizarPrevisaoCodigo(void)));
+ connect(sel_esquema, SIGNAL(s_objetoSelecionado(void)), this, SLOT(atualizarPrevisaoCodigo(void)));
+ connect(sel_esquema, SIGNAL(s_objetoRemovido(void)), this, SLOT(atualizarPrevisaoCodigo(void)));*/
+
+ connect(tabWidget, SIGNAL(currentChanged(int)), this, SLOT(atualizarPrevisaoCodigo(void)));
janela_pai->setMinimumSize(650, 630);
selecionarTipoReferencia();
View
2 schemas/sql/common/relationship.sch
@@ -11,7 +11,7 @@
# you are doing.
%if @{rel1n} %then
- @{constraint}
+ @{constraints}
%end
%if @{relgen} %then

0 comments on commit b09b17c

Please sign in to comment.
Something went wrong with that request. Please try again.