Example #1
0
void OperationListWidget::redoOperation(void)
{
	try
	{
		connect(model_wgt->op_list, SIGNAL(s_operationExecuted(int,QString,unsigned)), task_prog_wgt, SLOT(updateProgress(int,QString,unsigned)));
		task_prog_wgt->setWindowTitle(trUtf8("Redoing operations..."));
		task_prog_wgt->show();

		model_wgt->op_list->redoOperation();

		task_prog_wgt->close();
		disconnect(model_wgt->op_list, nullptr, task_prog_wgt, nullptr);

		notifyUpdateOnModel();

		model_wgt->scene->clearSelection();
	}
	catch(Exception &e)
	{
		task_prog_wgt->close();
		this->updateOperationList();
		disconnect(model_wgt->op_list, nullptr, task_prog_wgt, nullptr);
		throw Exception(e.getErrorMessage(),e.getErrorType(),__PRETTY_FUNCTION__,__FILE__,__LINE__, &e);
	}
}
//-----------------------------------------------------------
void ListaOperacoesWidget::refazerOperacao(void)
{
 try
 {
  //Exibe o progresso de operações de refazer
  connect(modelo_wgt->lista_op, SIGNAL(s_operacaoExecutada(int,QString,unsigned)), prog_tarefa, SLOT(executarProgesso(int,QString,unsigned)));
  prog_tarefa->setWindowTitle(trUtf8("Redoing operations..."));
  prog_tarefa->show();

  modelo_wgt->lista_op->refazerOperacao();

  prog_tarefa->close();
  disconnect(modelo_wgt->lista_op, NULL, prog_tarefa, NULL);

  atualizarModeloObjetos();

  //Limpa a seleção na cena
  modelo_wgt->cena->clearSelection();
 }
 catch(Excecao &e)
 {
  prog_tarefa->close();
  disconnect(modelo_wgt->lista_op, NULL, prog_tarefa, NULL);
  throw Excecao(e.obterMensagemErro(),e.obterTipoErro(),__PRETTY_FUNCTION__,__FILE__,__LINE__, &e);
 }
}
Example #3
0
	void ClientConnection::run()
	{
		DEBUG_ONLY(Mara::MLogger::log(Mara::LogLevel::Debug, QString("Creating connection socket.")));
		setStatus(MaraClient::Connection_Inactive);
		_userDisconnected = false;

		Mara::MTcpSocket socket;
		_socket = &socket;

		_socketError = "";

		_connectTimer = new QTimer(&socket);

		QObject::connect(_connectTimer, SIGNAL(timeout()), this, SLOT(checkConnection()));
		_connectTimer->setSingleShot(true);

		QObject::connect(_socket, SIGNAL(connected()), this, SLOT(socketConnected()));
		QObject::connect(_socket, SIGNAL(disconnected()), this, SLOT(socketDisconnected()));
		QObject::connect(_socket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(socketError(QAbstractSocket::SocketError)));
		QObject::connect(this, SIGNAL(signalSendPacket(const Mara::MPacket*)), 
						 _socket, SLOT(sendPacket(const Mara::MPacket*)));
		QObject::connect(_socket, SIGNAL(packetReceived(Mara::MPacket*)),
						 _packetHandler, SLOT(handlePacket(Mara::MPacket*)));

		DEBUG_ONLY(Mara::MLogger::log(Mara::LogLevel::Debug, QString("Connecting to %1:%2.").arg(_serverAddress).arg(_serverPort)));
		setStatus(MaraClient::Connection_Connecting);
		_socket->connectToHost(_serverAddress, _serverPort);

		_connectTimer->start(10000);

		_socketActive = true;
		exec();
		_socketActive = false;
		
		_socket->close();

		_serverAddress = "";
		_serverPort = 0;

		if(_connectTimer && _connectTimer->isActive())
			_connectTimer->stop();

		if(_status != MaraClient::Connection_Error)
			setStatus(MaraClient::Connection_Inactive);
	}
Example #4
0
void ModelExportForm::exportModel(void)
{
	try
	{
		this->resize(this->maximumSize());

		progress_pb->setValue(0);
		ln2_frm->setVisible(true);
		progress_lbl->setVisible(true);
		progress_pb->setVisible(true);
		ico_lbl->setVisible(false);

		if(export_to_img_rb->isChecked())
		{
			QPixmap pix;
			QRectF ret=model->scene->itemsBoundingRect();
			bool exibir_grade, exibir_lim, alin_objs;

			ObjectsScene::getGridOptions(exibir_grade, alin_objs, exibir_lim);
			ObjectsScene::setGridOptions(show_grid_chk->isChecked(), false, show_delim_chk->isChecked());

			pix=QPixmap(ret.size().toSize());
			QPainter p(&pix);
			model->scene->clearSelection();
			model->scene->update();
			model->scene->render(&p, QRectF(QPointF(0,0), pix.size()), ret);

			ObjectsScene::setGridOptions(exibir_grade, alin_objs, exibir_lim);
			model->scene->update();

			if(!pix.save(image_edt->text()))
				throw Exception(Exception::getErrorMessage(ERR_FILE_NOT_WRITTEN).arg(Utf8String::create(image_edt->text())),
												ERR_FILE_NOT_WRITTEN,__PRETTY_FUNCTION__,__FILE__,__LINE__);



		}
		else
		{
			int type_id;
			QString  version, sql_buf, sql_cmd;
			DBConnection *conn=NULL, new_db_conn;
			unsigned i, count;
			bool db_created=false;
			int objs_idx[]={-1, -1};
			ObjectType types[]={OBJ_ROLE, OBJ_TABLESPACE};
			BaseObject *object=NULL;
			vector<Exception> errors;

			/* Error codes treated in this method
					42P04 	duplicate_database
					42723 	duplicate_function
					42P06 	duplicate_schema
					42P07 	duplicate_table
					42710 	duplicate_object

				 Reference:
					http://www.postgresql.org/docs/current/static/errcodes-appendix.html*/
			QString error_codes[]={"42P04", "42723", "42P06", "42P07", "42710"};
			vector<QString> err_codes_vect;

			try
			{
				for(i=0; i < 5; i++)
					err_codes_vect.push_back(error_codes[i]);

				task_prog_wgt->setWindowTitle(trUtf8("Generating source code..."));
				task_prog_wgt->show();
				connect(this->model->db_model, SIGNAL(s_objetoCarregado(int,QString,unsigned)),
								task_prog_wgt, SLOT(updateProgress(int,QString,unsigned)));

				progress_lbl->setText(trUtf8("Initializing model export..."));
				progress_lbl->repaint();

				if(export_to_file_rb->isChecked())
				{
					//Sets the SQL version for the output code
					SchemaParser::setPgSQLVersion(pgsqlvers_cmb->currentText());
					progress_lbl->setText(trUtf8("Saving file '%1'").arg(file_edt->text()));
					model->db_model->saveModel(file_edt->text(), SchemaParser::SQL_DEFINITION);
					progress_pb->setValue(25);
				}
				//Exporting directly to DBMS
				else
				{
					//Get the selected connection to database
					conn=reinterpret_cast<DBConnection *>(connections_cmb->itemData(connections_cmb->currentIndex()).value<void *>());
					conn->connect();

					//Retrive the DBMS version in order to generate the correct code
					version=(conn->getDBMSVersion()).mid(0,3);

					//Overriding the DBMS version case the checkbox is marked
					if(pgsqlvers_chk->isChecked())
						SchemaParser::setPgSQLVersion(pgsqlvers1_cmb->currentText());
					else
						SchemaParser::setPgSQLVersion(version);


					//Creates the roles and tablespaces separately from the other objects
					for(type_id=0; type_id < 2; type_id++)
					{
						count=model->db_model->getObjectCount(types[type_id]);
						for(i=0; i < count; i++)
						{
							object=model->db_model->getObject(i, types[type_id]);
							progress_lbl->setText(trUtf8("Creating object '%1' (%2)...").arg(Utf8String::create(object->getName())).arg(object->getTypeName()));
							progress_lbl->repaint();

							try
							{
								conn->executeDDLCommand(object->getCodeDefinition(SchemaParser::SQL_DEFINITION));
							}
							catch(Exception &e)
							{
								if(!ignorar_dup_chk->isChecked() ||
									 (ignorar_dup_chk->isChecked() &&
										std::find(err_codes_vect.begin(), err_codes_vect.end(), e.getExtraInfo())==err_codes_vect.end()))
									throw Exception(e.getErrorMessage(),
																	e.getErrorType(),__PRETTY_FUNCTION__,__FILE__,__LINE__,&e);
								else
									errors.push_back(e);
							}

							progress_pb->setValue((10 * (type_id+1)) + ((i/static_cast<float>(count)) * 10));
							objs_idx[type_id]++;
						}
					}

					//Creating the database on the DBMS
					progress_lbl->setText(trUtf8("Creating database '%1'...").arg(Utf8String::create(model->db_model->getName())));
					progress_lbl->repaint();

					try
					{
						conn->executeDDLCommand(model->db_model->__getCodeDefinition(SchemaParser::SQL_DEFINITION));
						db_created=true;
					}
					catch(Exception &e)
					{
						if(!ignorar_dup_chk->isChecked() ||
							 (ignorar_dup_chk->isChecked() &&
								std::find(err_codes_vect.begin(), err_codes_vect.end(), e.getExtraInfo())==err_codes_vect.end()))
							throw Exception(e.getErrorMessage(),
															e.getErrorType(),__PRETTY_FUNCTION__,__FILE__,__LINE__,&e);
						else
							errors.push_back(e);
					}

					progress_pb->setValue(30);

					new_db_conn=(*conn);
					new_db_conn.setConnectionParam(DBConnection::PARAM_DB_NAME, model->db_model->getName());
					progress_lbl->setText(trUtf8("Connecting to database '%1'...").arg(Utf8String::create(model->db_model->getName())));
					progress_lbl->repaint();
					new_db_conn.connect();
					progress_pb->setValue(50);

					//Creating the other object types
					progress_lbl->setText(trUtf8("Creating objects on database '%1'...").arg(Utf8String::create(model->db_model->getName())));
					progress_lbl->repaint();

					//Gera o código SQL de todo o banco
					sql_buf=model->db_model->getCodeDefinition(SchemaParser::SQL_DEFINITION, false);

					/* Extract each SQL command from the buffer and execute them separately. This is done
					 to permit the user, in case of error, identify what object is wrongly configured. */
					i=0;
					count=sql_buf.size();

					while(i < count)
					{
						try
						{
							sql_cmd.clear();
							sql_cmd=sql_cmd.trimmed();

							//Extract the characters until the end of buffer o a semicolon
							while(i < count)
							{
								if(sql_buf.at(i)==';' && sql_buf.at(i+1)=='\n')
								{
									sql_cmd+=';';
									break;
								}
								else
									sql_cmd+=sql_buf.at(i);
								i++;
							}

							//Executes the extracted command
							if(!sql_cmd.isEmpty())
							{
								i++;
								new_db_conn.executeDDLCommand(sql_cmd);
							}

							progress_pb->setValue(50 + ((i/static_cast<float>(count)) * 10));
						}
						catch(Exception &e)
						{
							if(!ignorar_dup_chk->isChecked() ||
								 (ignorar_dup_chk->isChecked() &&
									std::find(err_codes_vect.begin(), err_codes_vect.end(), e.getExtraInfo())==err_codes_vect.end()))
								throw Exception(Exception::getErrorMessage(ERR_EXPORT_FAILURE).arg(Utf8String::create(sql_cmd)),
																ERR_EXPORT_FAILURE,__PRETTY_FUNCTION__,__FILE__,__LINE__,&e);
							else
								errors.push_back(e);
						}
					}
				}

				task_prog_wgt->close();
				disconnect(this->model->db_model, NULL, task_prog_wgt, NULL);
			}
			catch(Exception &e)
			{
				QString drop_cmd=QString("DROP %1 %2;");

				task_prog_wgt->close();
				disconnect(this->model->db_model, NULL, task_prog_wgt, NULL);

				//In case of error during the export all created object are removed
				if(db_created || objs_idx[0] >= 0 || objs_idx[1] >= 0)
				{
					if(new_db_conn.isStablished())
						new_db_conn.close();

					if(db_created)
						conn->executeDDLCommand(drop_cmd
																			 .arg(model->db_model->getSQLName())
																			 .arg(model->db_model->getName(true)));

					for(type_id=1; type_id >=0; type_id--)
					{
						while(objs_idx[type_id] >= 0)
						{
							object=model->db_model->getObject(objs_idx[type_id], types[type_id]);

							try
							{
								conn->executeDDLCommand(drop_cmd
																					 .arg(object->getSQLName())
																					 .arg(object->getName(true)));
							}
							catch(Exception &e)
							{}

							objs_idx[type_id]--;
						}
					}
				}

				if(errors.empty())
					throw Exception(e.getErrorMessage(),e.getErrorType(),__PRETTY_FUNCTION__,__FILE__,__LINE__, &e);
				else
				{
					errors.push_back(e);
					throw Exception(e.getErrorMessage(),__PRETTY_FUNCTION__,__FILE__,__LINE__, errors);
				}
			}
		}

		progress_pb->setValue(100);
		progress_lbl->setText(trUtf8("Exporting process sucessfuly ended!"));
		progress_lbl->repaint();
		ico_lbl->setPixmap(QPixmap(QString(":/icones/icones/msgbox_info.png")));
		ico_lbl->setVisible(true);

		QTimer::singleShot(5000, this, SLOT(hideExportProgress(void)));
	}
	catch(Exception &e)
	{
		MessageBox msg_box;

		progress_lbl->setText(trUtf8("Error on export!"));
		progress_lbl->repaint();
		ico_lbl->setPixmap(QPixmap(QString(":/icones/icones/msgbox_erro.png")));
		ico_lbl->setVisible(true);

		QTimer::singleShot(5000, this, SLOT(hideExportProgress(void)));
		msg_box.show(e);
	}
}
Example #5
0
//-----------------------------------------------------------
void FormExportacao::exportarModelo(void)
{
 try
 {
  //Redimensiona a janela para exibição dos widgets de progresso
  this->resize(this->maximumSize());

  //Exibe os widgets de progresso
  prog_pb->setValue(0);
  ln2_frm->setVisible(true);
  rot_prog_lbl->setVisible(true);
  prog_pb->setVisible(true);

  //Inicialmente o ícone de sucesso/erro da exportação fica escondido
  ico_lbl->setVisible(false);

  if(exportacao_png_rb->isChecked())
  {
   QPixmap pix;
   QRectF ret=modelo_wgt->cena->itemsBoundingRect();
   bool exibir_grade, exibir_lim, alin_objs;

   //Faz um backup das opções de grade da cena
   CenaObjetos::obterOpcoesGrade(exibir_grade, alin_objs, exibir_lim);

   //Redefine as opções da grade conforme os checkboxes
   CenaObjetos::definirOpcoesGrade(grade_chk->isChecked(), false, lim_paginas_chk->isChecked());

   //Cria o pixmap
   pix.resize(ret.size().toSize());

   ///Desenha a cena no pixmap e faz a escala correta
   QPainter p(&pix);
   modelo_wgt->cena->update();
   modelo_wgt->cena->render(&p, QRectF(QPointF(0,0), pix.size()), ret);

   //Restaura as definições da grade
   CenaObjetos::definirOpcoesGrade(exibir_grade, alin_objs, exibir_lim);
   modelo_wgt->cena->update();

   //Caso a imagem não possa ser salva, retorna um erro
   if(!pix.save(imagem_edt->text()))
    throw Excecao(Excecao::obterMensagemErro(ERR_PGMODELER_ARQNAOGRAVADO).arg(QString::fromUtf8(imagem_edt->text())),
                  ERR_PGMODELER_ARQNAOGRAVADO,__PRETTY_FUNCTION__,__FILE__,__LINE__);



  }
  else
  {
   int id_tipo;
   QString  versao, buf_sql, cmd_sql;
   ConexaoBD *conexao=NULL, conex_novo_bd;
   unsigned i, qtd;
   bool bd_criado=false;
   int idx_objs[]={-1, -1};
   TipoObjetoBase vet_tipos[]={OBJETO_PAPEL, OBJETO_ESPACO_TABELA};
   ObjetoBase *objeto=NULL;
   vector<Excecao> vet_erros;


   /* Vetor que armazena os códigos de erros referentes a objetos duplicados no PostgreSQL:
    Estes erros podem ser consultados na íntegra em:
      http://www.postgresql.org/docs/current/static/errcodes-appendix.html

    Códigos usados neste método:
     42P04 	duplicate_database
     42723 	duplicate_function
     42P06 	duplicate_schema
     42P07 	duplicate_table
     42710 	duplicate_object
  */
   QString cod_erros[]={"42P04", "42723", "42P06", "42P07", "42710"};
   vector<QString> vet_cod_erros;

   try
   {
    for(i=0; i < 5; i++)
     vet_cod_erros.push_back(cod_erros[i]);

    //Configura o widget de progresso para capturar o progresso da geração do código
    prog_tarefa->setWindowTitle(trUtf8("Generating source code..."));
    prog_tarefa->show();
    connect(this->modelo_wgt->modelo, SIGNAL(s_objetoCarregado(int,QString,unsigned)),
            prog_tarefa, SLOT(executarProgesso(int,QString,unsigned)));

    rot_prog_lbl->setText(trUtf8("Initializing model export..."));
    rot_prog_lbl->repaint();

    //Caso seja exportação em arquivo
    if(exportacao_arq_rb->isChecked())
    {
     //Define a versão do postgresql a ser adotada
     ParserEsquema::definirVersaoPgSQL(pgsqlvers_cmb->currentText());

     rot_prog_lbl->setText(trUtf8("Saving file '%1'").arg(arquivo_edt->text()));

     //Salva o modelo em arquivo
     modelo_wgt->modelo->salvarModelo(arquivo_edt->text(), ParserEsquema::DEFINICAO_SQL);
     prog_pb->setValue(25);
    }
    //Caso seja exportação direto para o SGBD
    else
    {
     //Obtém a conexão selecionada no combo
     conexao=reinterpret_cast<ConexaoBD *>(conexoes_cmb->itemData(conexoes_cmb->currentIndex()).value<void *>());
     //Tenta se conectar
     conexao->conectar();
     //Obtém a versão do servidor PostgreSQL. Essa versão é usada na geração de código a seguir
     versao=(conexao->obterVersaoSGBD()).mid(0,3);

     /* Caso o checkbox de versão esteja marcada então a versão do servidor é ignorada
      usando aquela escolhida no combo */
     if(pgsqlvers_chk->isChecked())
      ParserEsquema::definirVersaoPgSQL(pgsqlvers1_cmb->currentText());
     else
      ParserEsquema::definirVersaoPgSQL(versao);


     //Cria os Papéis e espaços de tabela separadamente dos demais
     for(id_tipo=0; id_tipo < 2; id_tipo++)
     {
      qtd=modelo_wgt->modelo->obterNumObjetos(vet_tipos[id_tipo]);
      for(i=0; i < qtd; i++)
      {
       objeto=modelo_wgt->modelo->obterObjeto(i, vet_tipos[id_tipo]);
       rot_prog_lbl->setText(trUtf8("Creating object '%1' (%2)...").arg(QString::fromUtf8(objeto->obterNome())).arg(objeto->obterNomeTipoObjeto()));
       rot_prog_lbl->repaint();

       try
       {
        conexao->executarComandoDDL(objeto->obterDefinicaoObjeto(ParserEsquema::DEFINICAO_SQL));
       }
       catch(Excecao &e)
       {
        /* Caso o checkbox de ignorar duplicidade não esteja marcado ou se este está marcado porém a
         informação adicinal da exceção não carrega um dos códigos indicando duplicidade de objeto
         redireciona o erro, caso contrário apenas o ignora */
        if(!ignorar_dup_chk->isChecked() ||
           (ignorar_dup_chk->isChecked() &&
            std::find(vet_cod_erros.begin(), vet_cod_erros.end(), e.obterInfoAdicional())==vet_cod_erros.end()))
         throw Excecao(e.obterMensagemErro(),
                       e.obterTipoErro(),__PRETTY_FUNCTION__,__FILE__,__LINE__,&e);
        else
         vet_erros.push_back(e);
       }

       prog_pb->setValue((10 * (id_tipo+1)) + ((i/static_cast<float>(qtd)) * 10));
       idx_objs[id_tipo]++;
      }
     }

     //Cria o banco de dados no servidor
     rot_prog_lbl->setText(trUtf8("Creating database '%1'...").arg(QString::fromUtf8(modelo_wgt->modelo->obterNome())));
     rot_prog_lbl->repaint();

     try
     {
      conexao->executarComandoDDL(modelo_wgt->modelo->__obterDefinicaoObjeto(ParserEsquema::DEFINICAO_SQL));
      bd_criado=true;
     }
     catch(Excecao &e)
     {
      /* Caso o checkbox de ignorar duplicidade não esteja marcado ou se este está marcado porém a
       informação adicinal da exceção não carrega um dos códigos indicando duplicidade de objeto
       redireciona o erro, caso contrário apenas o ignora */
      if(!ignorar_dup_chk->isChecked() ||
         (ignorar_dup_chk->isChecked() &&
          std::find(vet_cod_erros.begin(), vet_cod_erros.end(), e.obterInfoAdicional())==vet_cod_erros.end()))
       throw Excecao(e.obterMensagemErro(),
                     e.obterTipoErro(),__PRETTY_FUNCTION__,__FILE__,__LINE__,&e);
      else
       vet_erros.push_back(e);
     }

     prog_pb->setValue(30);

     conex_novo_bd=(*conexao);
     conex_novo_bd.definirParamConexao(ConexaoBD::PARAM_NOME_BD, modelo_wgt->modelo->obterNome());
     rot_prog_lbl->setText(trUtf8("Connecting to database '%1'...").arg(QString::fromUtf8(modelo_wgt->modelo->obterNome())));
     rot_prog_lbl->repaint();
     conex_novo_bd.conectar();
     prog_pb->setValue(50);

     //Cria os demais objetos no novo banco
     rot_prog_lbl->setText(trUtf8("Creating objects on database '%1'...").arg(QString::fromUtf8(modelo_wgt->modelo->obterNome())));
     rot_prog_lbl->repaint();

     //Gera o código SQL de todo o banco
     buf_sql=modelo_wgt->modelo->obterDefinicaoObjeto(ParserEsquema::DEFINICAO_SQL, false);

     /* Extrai cada comando SQL do buffeer e o executa separadamente, isso é feito
      para que, em caso de erro, o usuário saiba exatamente a SQL que gerou a
      exceção uma vez que a libpq não proporciona este nível de detalhes */
     i=0;
     qtd=buf_sql.size();

     while(i < qtd)
     {
      try
      {
       cmd_sql.clear();

       //Executa um trimm no comando SQL extraído
       cmd_sql=cmd_sql.trimmed();

       //Extrai os caracteres até encontrar o final do buffer ou um ';'
       while(i < qtd)
       {
        /* Caso o caracter seja um ';' e o próximo seja uma quebra de linha, significa o final do comando SQL
           assim a varredura será interrompida */
        if(buf_sql.at(i)==';' && buf_sql.at(i+1)=='\n')
        {
         cmd_sql+=';';
         break;
        }
        else
         cmd_sql+=buf_sql.at(i);
        i++;
       }

       //Executa um trimm no comando SQL extraído
       //cmd_sql=cmd_sql.trimmed();

       //Caso o comando não esteja vazio
       if(!cmd_sql.isEmpty())
       {
        i++;
        //Executa-o na conexão
        conex_novo_bd.executarComandoDDL(cmd_sql);
       }

       prog_pb->setValue(50 + ((i/static_cast<float>(qtd)) * 10));
      }
      catch(Excecao &e)
      {
       /* Caso o checkbox de ignorar duplicidade não esteja marcado ou se este está marcado porém a
        informação adicinal da exceção não carrega um dos códigos indicando duplicidade de objeto
        redireciona o erro, caso contrário apenas o ignora */
       if(!ignorar_dup_chk->isChecked() ||
          (ignorar_dup_chk->isChecked() &&
           std::find(vet_cod_erros.begin(), vet_cod_erros.end(), e.obterInfoAdicional())==vet_cod_erros.end()))
        throw Excecao(Excecao::obterMensagemErro(ERR_PGMODELERUI_FALHAEXPORTACAO).arg(QString::fromUtf8(cmd_sql)),
                      ERR_PGMODELERUI_FALHAEXPORTACAO,__PRETTY_FUNCTION__,__FILE__,__LINE__,&e);
       else
        vet_erros.push_back(e);
      }
     }
    }

    prog_tarefa->close();
    disconnect(this->modelo_wgt->modelo, NULL, prog_tarefa, NULL);
   }
   catch(Excecao &e)
   {
    QString drop_cmd=QString("DROP %1 %2;");

    prog_tarefa->close();
    disconnect(this->modelo_wgt->modelo, NULL, prog_tarefa, NULL);

    /* Caso os algum objeto tenha sido criado é preciso excluí-los do banco.
     Para isso, os mesmos são removidos na ordem contrária de criação:
     banco de dados, espaço de tabelas e papéis */
    if(bd_criado || idx_objs[0] >= 0 || idx_objs[1] >= 0)
    {
     if(conex_novo_bd.conexaoEstabelecida())
      conex_novo_bd.fechar();

     //Caso o banco de dados foi criado, exclui o mesmo
     if(bd_criado)
      conexao->executarComandoDDL(drop_cmd
                                  .arg(modelo_wgt->modelo->obterNomeSQLObjeto())
                                  .arg(modelo_wgt->modelo->obterNome(true)));

     //Removendo os espaços de tabela e papéis
     for(id_tipo=1; id_tipo >=0; id_tipo--)
     {
      while(idx_objs[id_tipo] >= 0)
      {
       objeto=modelo_wgt->modelo->obterObjeto(idx_objs[id_tipo], vet_tipos[id_tipo]);

       try
       {
        conexao->executarComandoDDL(drop_cmd
                                    .arg(objeto->obterNomeSQLObjeto())
                                    .arg(objeto->obterNome(true)));
       }
       catch(Excecao &e)
       {}

       idx_objs[id_tipo]--;
      }
     }
    }

    if(vet_erros.empty())
     throw Excecao(e.obterMensagemErro(),e.obterTipoErro(),__PRETTY_FUNCTION__,__FILE__,__LINE__, &e);
    else
    {
     vet_erros.push_back(e);
     throw Excecao(e.obterMensagemErro(),__PRETTY_FUNCTION__,__FILE__,__LINE__, vet_erros);
    }
   }
  }

  //Finaliza o progresso da exportação
  prog_pb->setValue(100);
  rot_prog_lbl->setText(trUtf8("Exporting process sucessfuly ended!"));
  rot_prog_lbl->repaint();
  ico_lbl->setPixmap(QPixmap(QString(":/icones/icones/msgbox_info.png")));
  ico_lbl->setVisible(true);

  //Oculta os widgets de progresso após 10 segundos
  QTimer::singleShot(5000, this, SLOT(ocultarProgressoExportacao(void)));
 }
 catch(Excecao &e)
 {
  //Exibe no progresso a mensagem de falha
  rot_prog_lbl->setText(trUtf8("Error on export!"));
  rot_prog_lbl->repaint();
  ico_lbl->setPixmap(QPixmap(QString(":/icones/icones/msgbox_erro.png")));
  ico_lbl->setVisible(true);

  //Oculta os widgets de progresso após 10 segundos
  QTimer::singleShot(5000, this, SLOT(ocultarProgressoExportacao(void)));
  caixa_msg->show(e);
 }
}