Chegamos na parte mais usada, e também a mais complexa da libpq, que é a recuperação de dados.
O que torna essa parte da API mais complexa é o fato de não sabermos sempre quantas linhas o nosso comando irá retornar, ou mesmo a quantidade de campos. Porém, podemos fazer chamadas adicionais a funções da API que ajudam a contornar este problema. Para executar um comando SELECT continuamos a usar a função PQexec exatamente como antes.
Primeiro, vamos descobrir quantas linhas o nosso comando retorna. Para isso, usamos a função PQntuples, que tem o seguinte protótipo:
int PQntuples(PGresult *result);
Onde result é o retorno da chamada a função PQexec.
Tudo bem, isso na verdade não ajuda muito, pois o que queremos é ver o que temos dentro da tabela. Para isso, vamos usar uma maneira rápida e simples da libpq que gera a saída em um arquivo. Esta função é a PQprint, que tem o protótipo:
Esta função vai receber como parâmetros um ponteiro para o nosso arquivo, um ponteiro de resultado retornado pela função PQexec e uma estrutura de opções. Esta estrutura vai definir algumas opções para gerar o arquivo, como por exemplo o caractere que vai delimitar os dados.
typedef struct PQprintOpt
{
pqbool header; /*imprime o cabeçalho*/
pqbool align; /*alinha e preenche os campos*/
pqbool standard; /*formato antigo não mais utilizado*/
pqbool html3; /*gera saída das tabelas em HTML*/
pqbool expanded; /*expande tabelas*/
pqbool pager; /*usa o paginador para saída caso necessário*/
char *fieldSep; /*caractere que será o separador de campos*/
char *tableOpt; /*inserção na <table ...> HTML*/
char *legenda; /*legenda HTML*/
char **fieldname; /*array terminado com null contendo o nome de campos para substituição*/
}
Vamos agora alterar o nosso programa anterior para recuperar os dados da nossa tabela de testes.
/*Verifica se a conexão está aberta e a encerra*/
if(conn != NULL)
PQfinish(conn);
}
Percebam que apesar de ser relativamente simples de usar, esta solução está longe de ser a melhor solução para recuperar dados. Quando temos um volume pequeno de dados esta solução é aceitável, mas que torna-se inutilizável quando temos tabelas maiores. Para piorar, é muito complicado se quisermos manipular os valores retornados.
Existe uma outra alternativa muito mais eficiente para retornarmos dados que é o uso de cursores. Este assunto porém é material suficiente para um novo artigo, devido ao tamanho e complexidade envolvida.
[1] Comentário enviado por cbov em 08/12/2005 - 04:16h
muito bom artigo.
eu imaginava ser mais complicado, pelo fato do unico banco que acessei usando C foi o oracle, qual tinha que dar algumas voltas ate gerar o binario
[6] Comentário enviado por rjesus em 13/03/2007 - 11:19h
Olá, sou novo no linux, utilizoo o SUSE versão 10.1, tentei executar o exemplo que foi passado acima e obtive o seguinte resultado :
suse:/usr/include/pgsql # gcc $(pkg-config --libs --cflags gtk+-2.0) -g teste1.c
/tmp/ccc0dzwL.o: In function `main':
/usr/include/pgsql/teste1.c:13: undefined reference to `PQconnectdb'
/usr/include/pgsql/teste1.c:15: undefined reference to `PQstatus'
/usr/include/pgsql/teste1.c:28: undefined reference to `PQexec'
/usr/include/pgsql/teste1.c:21: undefined reference to `PQerrorMessage'
/usr/include/pgsql/teste1.c:22: undefined reference to `PQfinish'
/usr/include/pgsql/teste1.c:36: undefined reference to `PQresultStatus'
/usr/include/pgsql/teste1.c:42: undefined reference to `PQresultErrorMessage'
/usr/include/pgsql/teste1.c:45: undefined reference to `PQcmdTuples'
/usr/include/pgsql/teste1.c:53: undefined reference to `PQclear'
/usr/include/pgsql/teste1.c:59: undefined reference to `PQfinish'
collect2: ld returned 1 exit status
Alguêm poderia me ajudar ???
Obigado!
[7] Comentário enviado por seferzohar em 06/11/2007 - 16:13h
rjesus
Vc esta compilando o exemplo com as flags erradas para o linker (ld)
pkg-config --libs --cflags gtk+-2.0 gera as flags necessarias para compilacao de programas gráficos utilizando a biblioteca gtk, desnecessária neste exemplo. Para compilar-lo vc precisa que o linker ligue o seu programa a biblioteca libpq, que implementa as funcoes acima.
O seu teste provavelmente irá compilar com o seguinte comando:
[9] Comentário enviado por netmorais em 30/06/2008 - 16:04h
Poleto
Voce sabe se existe a biblioteca estática libpq para windows (libpq.a ...).
Instalei o Postgres 8.3 num xp e na pasta .../lib só encontro .dll.
Grato
Sergio.
netmorais@bol.com.br
[10] Comentário enviado por poleto em 30/06/2008 - 18:13h
netmorais,
Nunca tentei utilizar a libpq a partir do windows.
Mas, acredito que não seja muito diferente, só que, ao invés de usar uma biblioteca com extensão .so, você vai usar uma dll. Se o nome não for o mesmo (libpq.dll, tente pq.dll). De resto, use o procedimento normal do desenvolvimento sobre windows para carregar a dll.