Skip to content
Browse files

Refactoring checktpoint. Class "Resultado" now stands for "ResultSet"

  • Loading branch information...
1 parent f3deb79 commit 2b1c65a0525a60d635d901a4003fe548ef8c2164 @rkhaotix rkhaotix committed Oct 27, 2012
View
8 libdbconnect/libdbconnect.pro
@@ -6,8 +6,8 @@ DESTDIR = ../build/lib
OBJECTS_DIR = obj
LIBS += $$DESTDIR/$$LIBUTIL
-HEADERS += $$PWD/src/conexaobd.h \
- $$PWD/src/resultado.h
+HEADERS += $$PWD/src/dbconnection.h \
+ $$PWD/src/resultset.h
-SOURCES += $$PWD/src/conexaobd.cpp \
- $$PWD/src/resultado.cpp
+SOURCES += $$PWD/src/dbconnection.cpp \
+ $$PWD/src/resultset.cpp
View
8 libdbconnect/src/conexaobd.cpp → libdbconnect/src/dbconnection.cpp
@@ -1,4 +1,4 @@
-#include "conexaobd.h"
+#include "dbconnection.h"
const QString ConexaoBD::SSL_DESATIVADO="disable";
const QString ConexaoBD::SSL_PERMITIR="allow";
@@ -155,9 +155,9 @@ QString ConexaoBD::obterVersaoSGBD(void)
.arg(versao.mid(4,1).toInt()));
}
-void ConexaoBD::executarComandoDML(const QString &sql, Resultado &resultado)
+void ConexaoBD::executarComandoDML(const QString &sql, ResultSet &resultado)
{
- Resultado *novo_res=NULL;
+ ResultSet *novo_res=NULL;
PGresult *res_sql=NULL;
//Dispara um erro caso o usuário tente reiniciar uma conexão não iniciada
@@ -174,7 +174,7 @@ void ConexaoBD::executarComandoDML(const QString &sql, Resultado &resultado)
QString(PQresultErrorField(res_sql, PG_DIAG_SQLSTATE)));
}
- novo_res=new Resultado(res_sql);
+ novo_res=new ResultSet(res_sql);
//Copia o novo resultado para o resultado do parâmetro
resultado=*(novo_res);
//Desaloca o resultado criado
View
4 libdbconnect/src/conexaobd.h → libdbconnect/src/dbconnection.h
@@ -23,7 +23,7 @@
#ifndef CONEXAOBD_H
#define CONEXAOBD_H
-#include "resultado.h"
+#include "resultset.h"
#include <map>
class ConexaoBD {
@@ -96,7 +96,7 @@ class ConexaoBD {
/* Executa um comando DML no servidor usando a conexão aberta
retornando um objeto de resutlado da consulta */
- void executarComandoDML(const QString &sql, Resultado &resultado);
+ void executarComandoDML(const QString &sql, ResultSet &resultado);
/* Executa um comando DDL no servidor usando a conexão aberta
sem retorno de objetos de resultado */
View
104 libdbconnect/src/resultado.h
@@ -1,104 +0,0 @@
-/*
-# PostgreSQL Database Modeler (pgModeler)
-# Sub-project: Biblioteca libconexbd
-# Classe: Resultado
-# Description:o: Esta classe encapsula algumas funções de manipulação de resultados
-# de comandos SQL do PostgreSQL implementadas pela biblioteca libpq
-# Creation date:o: 14/07/2009
-#
-# Copyright 2006-2012 - Raphael Araújo e Silva <rkhaotix@gmail.com>
-#
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation version 3.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# The complete text of GPLv3 is at LICENSE file on source code root directory.
-# Also, you can get the complete GNU General Public License at <http://www.gnu.org/licenses/>
-*/
-#ifndef RESULTADO_H
-#define RESULTADO_H
-
-#include "exception.h"
-#include <libpq-fe.h>
-#include <cstdlib>
-
-class Resultado {
- private:
- /* Indica se o resultado foi copiado, este flag é utilizado
- para evitar falhas de segmentação na chamada do destrutor
- da classe, pois como o ponteiro resultado_sql é copiado
- para outro elementos, caso este seja destruído pode causar
- falha na referência. Sendo assim, tal ponteiro só é excluído
- quando este flag está marcado como falso */
- bool res_copiado;
- void destruirResultado(void);
-
- protected:
- //Armazena o índice atual da tupla, apenas para navegação
- int tupla_atual;
-
- /* Indica que o resultado foi gerado a partir de um comando
- o qual não gera tuplas. Exemplo: INSERT, DELETE, CREATE .. */
- bool res_sem_tuplas;
-
- //Armazena o objeto de resultado do comando SQL
- PGresult *resultado_sql;
-
- /* Esta classe só pode ser construída a partir de um
- resultado de comando SQL gerado na classe ConexaoBD */
- Resultado(PGresult *resultado_sql);
-
- public:
- //Constantes usadas na navegação nas tuplas de resultado
- static const unsigned TUPLA_INICIAL=0,
- TUPLA_FINAL=1,
- TUPLA_ANTERIOR=2,
- TUPLA_POSTERIOR=3;
-
- Resultado(void);
- ~Resultado(void);
-
- //Retorna o valor de uma determinada coluna
- char *obterValorColuna(const QString &nome_coluna);
- char *obterValorColuna(int idx_coluna);
-
- //Retorna o tamanho do dado alocado em uma determinada coluna
- int obterTamanhoColuna(const QString &nome_coluna);
- int obterTamanhoColuna(int idx_coluna);
-
- /* Retorna o número de linhas afetadas pelo comando que gerou
- o resultado caso este seja um INSERT, DELETE, UPDATE ou o
- número de tuplas vindas de um comando SELECT */
- int obterNumTuplas(void);
-
- //Retorna o número de colunas presentes em uma tupla
- int obterNumColunas(void);
-
- //Retorna o nome da coluna associada ao índice passado
- QString obterNomeColuna(int idx_coluna);
-
- //Retorna o índice da coluna associada ao nome passado
- int obterIndiceColuna(const QString &nome_coluna);
-
- //Retorna a tupla atual em que a navegação está
- int obterTuplaAtual(void);
-
- //Retorna se uma determinada coluna está em formato binário
- bool colunaFormatoBinario(const QString &nome_coluna);
- bool colunaFormatoBinario(int idx_coluna);
-
- //Método de navegação pelas tuplas do resultado
- bool acessarTupla(unsigned tipo_tupla);
-
- //Método de cópia entre resultados
- void operator = (Resultado &res);
-
- friend class ConexaoBD;
-};
-
-#endif
View
174 libdbconnect/src/resultado.cpp → libdbconnect/src/resultset.cpp
@@ -1,26 +1,26 @@
-#include "resultado.h"
+#include "resultset.h"
-Resultado::Resultado(void)
+ResultSet::ResultSet(void)
{
- resultado_sql=NULL;
- res_sem_tuplas=false;
- res_copiado=false;
- tupla_atual=-1;
+ sql_result=NULL;
+ empty_result=false;
+ is_res_copied=false;
+ current_tuple=-1;
}
-Resultado::Resultado(PGresult *resultado_sql)
+ResultSet::ResultSet(PGresult *sql_result)
{
QString str_aux;
- int estado_res;
+ int res_state;
- if(!resultado_sql)
+ if(!sql_result)
throw Exception(ERR_CONEXBD_ATRRESSQLNAOALOC, __PRETTY_FUNCTION__, __FILE__, __LINE__);
- this->resultado_sql=resultado_sql;
- estado_res=PQresultStatus(this->resultado_sql);
+ this->sql_result=sql_result;
+ res_state=PQresultStatus(this->sql_result);
//Trantando o estado do resultado
- switch(estado_res)
+ switch(res_state)
{
//Gerando um erro caso o servidor retorna uma resposta incompreensível
case PGRES_BAD_RESPONSE:
@@ -30,7 +30,7 @@ Resultado::Resultado(PGresult *resultado_sql)
//Gerando um erro caso o servidor retorne um erro fatal
case PGRES_FATAL_ERROR:
str_aux=QString(Exception::getErrorMessage(ERR_CONEXBD_SGBDERROFATAL))
- .arg(PQresultErrorMessage(resultado_sql));
+ .arg(PQresultErrorMessage(sql_result));
throw Exception(str_aux,ERR_CONEXBD_SGBDERROFATAL, __PRETTY_FUNCTION__, __FILE__, __LINE__);
break;
@@ -45,71 +45,71 @@ Resultado::Resultado(PGresult *resultado_sql)
case PGRES_COPY_OUT:
case PGRES_COPY_IN:
default:
- res_sem_tuplas=(estado_res!=PGRES_TUPLES_OK);
- tupla_atual=0;
- res_copiado=false;
+ empty_result=(res_state!=PGRES_TUPLES_OK);
+ current_tuple=0;
+ is_res_copied=false;
break;
}
}
-Resultado::~Resultado(void)
+ResultSet::~ResultSet(void)
{
- destruirResultado();
+ destroyResultSet();
}
-void Resultado::destruirResultado(void)
+void ResultSet::destroyResultSet(void)
{
/* Destrói o result-set do objeto caso este não foi copiado
para outra instância de classe (ver operador = ) */
- if(resultado_sql && !res_copiado)
- PQclear(resultado_sql);
+ if(sql_result && !is_res_copied)
+ PQclear(sql_result);
//Reinicia os demais atributos
- resultado_sql=NULL;
- res_sem_tuplas=false;
- res_copiado=false;
- tupla_atual=-1;
+ sql_result=NULL;
+ empty_result=false;
+ is_res_copied=false;
+ current_tuple=-1;
}
-QString Resultado::obterNomeColuna(int idx_coluna)
+QString ResultSet::getColumnName(int column_idx)
{
//Dispara um erro caso o índice da coluna seja inválido
- if(idx_coluna < 0 || idx_coluna >= obterNumColunas())
+ if(column_idx < 0 || column_idx >= getColumnCount())
throw Exception(ERR_CONEXBD_REFCOLTUPLAIDXINV, __PRETTY_FUNCTION__, __FILE__, __LINE__);
//Retorna o nome da coluna com índice especificado
- return(QString(PQfname(resultado_sql, idx_coluna)));
+ return(QString(PQfname(sql_result, column_idx)));
}
-int Resultado::obterIndiceColuna(const QString &nome_coluna)
+int ResultSet::getColumnIndex(const QString &column_name)
{
- int idx_coluna=-1;
+ int col_idx=-1;
//Obtém o índice da coluna usando o nome
- idx_coluna=PQfnumber(resultado_sql, nome_coluna.toStdString().c_str());
+ col_idx=PQfnumber(sql_result, column_name.toStdString().c_str());
/* Caso o índice seja negativo indica que a coluna não existe na tupla
desta forma um erro é disparado */
- if(idx_coluna < 0)
+ if(col_idx < 0)
throw Exception(ERR_CONEXBD_REFCOLTUPLANOMEINV, __PRETTY_FUNCTION__, __FILE__, __LINE__);
- return(idx_coluna);
+ return(col_idx);
}
-char *Resultado::obterValorColuna(const QString &nome_coluna)
+char *ResultSet::getColumnValue(const QString &column_name)
{
- int idx_coluna=-1;
+ int col_idx=-1;
try
{
/* Dispara um erro caso o usuário tente obter o valor de uma coluna em
uma tupla de um resultado vazio ou gerado a partir de um comando INSERT, DELETE, UPDATE,
ou seja, de comando os quais não retornam linhas mas apenas a atualizam/remove */
- if(obterNumTuplas()==0 || res_sem_tuplas)
+ if(getTupleCount()==0 || empty_result)
throw Exception(ERR_CONEXBD_REFTUPLANAOEXISTE, __PRETTY_FUNCTION__, __FILE__, __LINE__);
//Obtém o índice da coluna através do nome
- idx_coluna=obterIndiceColuna(nome_coluna);
+ col_idx=getColumnIndex(column_name);
}
catch(Exception &e)
{
@@ -118,32 +118,32 @@ char *Resultado::obterValorColuna(const QString &nome_coluna)
}
//Retorna o valor da coluna (idx_coluna) na linha atual (tupla_atual)
- return(PQgetvalue(resultado_sql, tupla_atual, idx_coluna));
+ return(PQgetvalue(sql_result, current_tuple, col_idx));
}
-char *Resultado::obterValorColuna(int idx_coluna)
+char *ResultSet::getColumnValue(int column_idx)
{
//Dispara um erro caso o índice da coluna seja inválido
- if(idx_coluna < 0 || idx_coluna >= obterNumColunas())
+ if(column_idx < 0 || column_idx >= getColumnCount())
throw Exception(ERR_CONEXBD_REFCOLTUPLAIDXINV, __PRETTY_FUNCTION__, __FILE__, __LINE__);
/* Dispara um erro caso o usuário tente obter o valor de uma coluna em
uma tupla de um resultado vazio ou gerado a partir de um comando INSERT, DELETE, UPDATE,
ou seja, de comando os quais não retornam linhas mas apenas a atualizam/remove */
- else if(obterNumTuplas()==0 || res_sem_tuplas)
+ else if(getTupleCount()==0 || empty_result)
throw Exception(ERR_CONEXBD_REFTUPLANAOEXISTE, __PRETTY_FUNCTION__, __FILE__, __LINE__);
//Retorna o valor da coluna (idx_coluna) na linha atual (tupla_atual)
- return(PQgetvalue(resultado_sql, tupla_atual, idx_coluna));
+ return(PQgetvalue(sql_result, current_tuple, column_idx));
}
-int Resultado::obterTamanhoColuna(const QString &nome_coluna)
+int ResultSet::getColumnSize(const QString &column_name)
{
- int idx_coluna=-1;
+ int col_idx=-1;
try
{
//Obtém o índice da coluna a ser detectado o comprimento
- idx_coluna=obterIndiceColuna(nome_coluna);
+ col_idx=getColumnIndex(column_name);
}
catch(Exception &e)
{
@@ -152,48 +152,48 @@ int Resultado::obterTamanhoColuna(const QString &nome_coluna)
}
//Retorna o comprimento do valor da coluna (idx_coluna) na linha atual (tupla_atual)
- return(PQgetlength(resultado_sql, tupla_atual, idx_coluna));
+ return(PQgetlength(sql_result, current_tuple, col_idx));
}
-int Resultado::obterTamanhoColuna(int idx_coluna)
+int ResultSet::getColumnSize(int column_idx)
{
//Dispara um erro caso o índice da coluna seja inválido
- if(idx_coluna < 0 || idx_coluna >= obterNumColunas())
+ if(column_idx < 0 || column_idx >= getColumnCount())
throw Exception(ERR_CONEXBD_REFCOLTUPLAIDXINV, __PRETTY_FUNCTION__, __FILE__, __LINE__);
//Retorna o comprimento do valor da coluna (idx_coluna) na linha atual (tupla_atual)
- return(PQgetlength(resultado_sql, tupla_atual, idx_coluna));
+ return(PQgetlength(sql_result, current_tuple, column_idx));
}
-int Resultado::obterNumTuplas(void)
+int ResultSet::getTupleCount(void)
{
//Caso o resultado possua tuplas
- if(!res_sem_tuplas)
+ if(!empty_result)
//Retorna a quantidade de tuplas obtidas a partir do comando
- return(PQntuples(resultado_sql));
+ return(PQntuples(sql_result));
else
/* Retorna o número de linhas afetadas pelo comando (caso
seja comandos do tipo INSERT, DELETE, UPDATE) */
- return(atoi(PQcmdTuples(resultado_sql)));
+ return(atoi(PQcmdTuples(sql_result)));
}
-int Resultado::obterNumColunas(void)
+int ResultSet::getColumnCount(void)
{
- return(PQnfields(resultado_sql));
+ return(PQnfields(sql_result));
}
-int Resultado::obterTuplaAtual(void)
+int ResultSet::getCurrentTuple(void)
{
- return(tupla_atual);
+ return(current_tuple);
}
-bool Resultado::colunaFormatoBinario(const QString &nome_coluna)
+bool ResultSet::isColumnBinaryFormat(const QString &column_name)
{
- int idx_coluna=-1;
+ int col_idx=-1;
try
{
- idx_coluna=obterIndiceColuna(nome_coluna);
+ col_idx=getColumnIndex(column_name);
}
catch(Exception &e)
{
@@ -205,72 +205,72 @@ bool Resultado::colunaFormatoBinario(const QString &nome_coluna)
De acordo cmo a documentação da libpq, valor = 0, indica coluna em formato
texto, já valor = 1 é coluna em formato binário, os demais valores
são de uso reservado */
- return(PQfformat(resultado_sql, idx_coluna)==1);
+ return(PQfformat(sql_result, col_idx)==1);
}
-bool Resultado::colunaFormatoBinario(int idx_coluna)
+bool ResultSet::isColumnBinaryFormat(int column_idx)
{
//Dispara um erro caso o índice da coluna seja inválido
- if(idx_coluna < 0 || idx_coluna >= obterNumColunas())
+ if(column_idx < 0 || column_idx >= getColumnCount())
throw Exception(ERR_CONEXBD_REFCOLTUPLAIDXINV, __PRETTY_FUNCTION__, __FILE__, __LINE__);
/* Retorna o formato da coluna (idx_coluna) na linha atual (tupla_atual).
De acordo cmo a documentação da libpq, valor = 0, indica coluna em formato
texto, já valor = 1 é coluna em formato binário, os demais valores
são de uso reservado */
- return(PQfformat(resultado_sql, idx_coluna)==1);
+ return(PQfformat(sql_result, column_idx)==1);
}
-bool Resultado::acessarTupla(unsigned tipo_tupla)
+bool ResultSet::accessTuple(unsigned tuple_type)
{
- int num_tuplas=obterNumTuplas();
- bool acessado=true;
+ int tuple_count=getTupleCount();
+ bool accessed=true;
/* Dispara um erro caso o resultado não possua linhas ou
seja derivado de um comando o qual apenas afeta linhas ou
se o tipo de tupla a ser acessado seja inválido, fora do
conjunto definido pela classe */
- if(num_tuplas==0 || res_sem_tuplas || tipo_tupla > TUPLA_POSTERIOR)
+ if(tuple_count==0 || empty_result || tuple_type > NEXT_TUPLE)
throw Exception(ERR_CONEXBD_REFTUPLANAOEXISTE, __PRETTY_FUNCTION__, __FILE__, __LINE__);
- switch(tipo_tupla)
+ switch(tuple_type)
{
- case TUPLA_INICIAL:
- tupla_atual=0;
+ case FIRST_TUPLE:
+ current_tuple=0;
break;
- case TUPLA_FINAL:
- tupla_atual=num_tuplas-1;
+ case LAST_TUPLE:
+ current_tuple=tuple_count-1;
break;
- case TUPLA_ANTERIOR:
- acessado=(tupla_atual > 0);
- if(acessado) tupla_atual--;
+ case PREVIOUS_TUPLE:
+ accessed=(current_tuple > 0);
+ if(accessed) current_tuple--;
break;
- case TUPLA_POSTERIOR:
- acessado=(tupla_atual < (num_tuplas-1));
- if(acessado) tupla_atual++;
+ case NEXT_TUPLE:
+ accessed=(current_tuple < (tuple_count-1));
+ if(accessed) current_tuple++;
break;
}
- return(acessado);
+ return(accessed);
}
-void Resultado::operator = (Resultado &res)
+void ResultSet::operator = (ResultSet &res)
{
/* Marca que o resultado do parâmetro foi copiado, evitando
que seu result set seja desalocado */
- res.res_copiado=true;
+ res.is_res_copied=true;
/* Caso o resultado this esteja alocado,
o mesmo será desalocado para evitar memory leaks */
- destruirResultado();
+ destroyResultSet();
//Copia os atributos do resultado do parâmetro para o resultado this
- this->tupla_atual=res.tupla_atual;
- this->res_sem_tuplas=res.res_sem_tuplas;
- this->resultado_sql=res.resultado_sql;
- this->res_copiado=false;
+ this->current_tuple=res.current_tuple;
+ this->empty_result=res.empty_result;
+ this->sql_result=res.sql_result;
+ this->is_res_copied=false;
}
View
105 libdbconnect/src/resultset.h
@@ -0,0 +1,105 @@
+/*
+# PostgreSQL Database Modeler (pgModeler)
+# Sub-project: libdbconnect library
+# Class: ResultSet
+# Description: This class encapsulates some functions implemented by libpq
+# for manipulation of resultsets returned by PostgreSQL SQL commands
+# Creation date:o: 14/07/2009
+#
+# Copyright 2006-2012 - Raphael Araújo e Silva <rkhaotix@gmail.com>
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation version 3.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# The complete text of GPLv3 is at LICENSE file on source code root directory.
+# Also, you can get the complete GNU General Public License at <http://www.gnu.org/licenses/>
+*/
+#ifndef RESULTSET_H
+#define RESULTSET_H
+
+#include "exception.h"
+#include <libpq-fe.h>
+#include <cstdlib>
+
+class ResultSet {
+ private:
+ /* Indicates whether the result was copied, this flag is used
+ to avoid segmentation faults when calling the destructor.
+ As the pointer 'sql_result' is copied
+ to other elements if it is destroyed can cause
+ reference fails. Thus, such a pointer is only deleted
+ when this flag is marked as false */
+ bool is_res_copied;
+
+ void destroyResultSet(void);
+
+ protected:
+ //Stores the current tuple index, just for navigation
+ int current_tuple;
+
+ /* Indicates that the result was generated from a command
+ which generates no tuples. Example: INSERT, DELETE, CREATE .. */
+ bool empty_result;
+
+ //Stores the result object of a SQL command
+ PGresult *sql_result;
+
+ /* This class may be constructed from a
+ result of SQL command generated in DBConnection class */
+ ResultSet(PGresult *sql_result);
+
+ public:
+ //Constants used to navigate through the resultset
+ static const unsigned FIRST_TUPLE=0,
+ LAST_TUPLE=1,
+ PREVIOUS_TUPLE=2,
+ NEXT_TUPLE=3;
+
+ ResultSet(void);
+ ~ResultSet(void);
+
+ //Returns the value of a column (searching by name or index)
+ char *getColumnValue(const QString &column_name);
+ char *getColumnValue(int column_idx);
+
+ //Returns the data allocated size of a column (searching by name or index)
+ int getColumnSize(const QString &column_name);
+ int getColumnSize(int column_idx);
+
+ /* Returns the number of rows affected by the command that generated
+ the result if it is an INSERT, DELETE, UPDATE or the number of
+ tuples returned if the command was a SELECT */
+ int getTupleCount(void);
+
+ //Returns the column count present in one tuple
+ int getColumnCount(void);
+
+ //Returns the name of the column specified by it's index
+ QString getColumnName(int column_idx);
+
+ //Returns the index of the column specified by it's name
+ int getColumnIndex(const QString &column_name);
+
+ //Returns the current tuple where the navigation is
+ int getCurrentTuple(void);
+
+ //Informs if the column is in binary format
+ bool isColumnBinaryFormat(const QString &column_name);
+ bool isColumnBinaryFormat(int column_idx);
+
+ //Access on tuple on result set via navigation constants
+ bool accessTuple(unsigned tuple_type);
+
+ //Make a copy between two resultsets
+ void operator = (ResultSet &res);
+
+ friend class ConexaoBD;
+};
+
+#endif
View
2 libpgmodeler_ui/src/confconexoeswidget.h
@@ -23,7 +23,7 @@
#include "ui_confconexoeswidget.h"
#include "confbasewidget.h"
-#include "conexaobd.h"
+#include "dbconnection.h"
class ConfConexoesWidget: public QWidget, public Ui::ConfConexoesWidget, public ConfBaseWidget {
private:

0 comments on commit 2b1c65a

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