Acessando PostgreSQL com C
O PostgreSQL é um dos principais bancos de dados open source do momento. Veremos neste artigo como acessá-lo utilizando a linguagem C.
Parte 4: Rotinas para conexão
O método mais usado para conexão com o PostgreSQL é o comando PQconnectdb (existem outras rotinas, mas focaremos apenas nesta), que tem a forma:
PGconn *PQconnectdb(const char *conninfo);
Esta função abre uma nova conexão usando os parâmetros passados na string conninfo. Esses parâmetros são passados separados por espaços, e podem ser:
Vejamos agora um exemplo para conexão com o nosso banco de dados TESTE criado anteriormente:
PGconn *PQconnectdb(const char *conninfo);
Esta função abre uma nova conexão usando os parâmetros passados na string conninfo. Esses parâmetros são passados separados por espaços, e podem ser:
- host: O nome do host que queremos nos conectar, neste exemplo, usaremos localhost;
- port: Porta de conexão com o PostgreSQL, como usaremos a porta padrão, podemos omitir este parâmetro;
- dbname: O nome do banco de dados que iremos nos conectar. Se deixado em branco, será usado o banco de nome igual ao usuário logado no Linux;
- user: O nome do usuário a realizar a conexão. Se omitido, o padrão é o mesmo usuário logado no Linux;
- password: A senha para o usuário a ser usado.
Vejamos agora um exemplo para conexão com o nosso banco de dados TESTE criado anteriormente:
PGconn *conn = NULL;
conn = PQconnectdb("host=localhost dbname=TESTE");
conn = PQconnectdb("host=localhost dbname=TESTE");
Primeiro declaramos uma variável *conn, do tipo PGconn com o valor inicial NULL, em seguida, chamamos a função PQconnectdb passando como parâmetros o host, que será o localhost e o banco será o TESTE, que criamos acima.
A função PQconnectdb irá retornar NULL somente se houver falha na alocação de memória para o objeto de conexão. Mesmo que o retorno seja não-NULL, precisamos verificar se a conexão foi bem sucedida. Podemos fazer isso com a função PQstatus, que tem o protótipo:
ConnStatusType PQstatus(PGconn *conn);
Esta função recebe como parâmetro um objeto PGconn e retorna um tipo enumerado, que pode ter dois valores: CONNECTION_OK ou CONNECTION_BAD (os significados são bem óbvios).
Continuando o nosso exemplo, após chamar a função PQconnectdb, verificamos se a conexão foi bem sucedida:
if(PQstatus(conn) == CONNECTION_OK)
{
printf("Conexão com efetuada com sucesso.");
}
else
{
printf("Falha na conexão.");
PQfinish(conn);
return -1;
}
{
printf("Conexão com efetuada com sucesso.");
}
else
{
printf("Falha na conexão.");
PQfinish(conn);
return -1;
}
Não há muito o que se comentar sobre o código acima. Chamamos a função PQstatus passando como parâmetro o nosso objeto de conexão (conn) e verificamos o retorno. Se CONNECTION_OK, a conexão com o banco foi efetuada com sucesso, do contrário, mostramos a mensagem que nossa conexão falhou, e chamamos a função PQfinish que tem o seguinte protótipo:
void PQfinish(PGconn *conn);
Esta função encerra a conexão com o banco de dados e também libera a memória usada pelo objeto de conexão, e deve ser chamada mesmo que a conexão não tenha ocorrido com sucesso. Vale dizer que uma vez chamada esta função, não se deve tentar usar o objeto conn novamente.
Além de saber que a nossa conexão falhou, podemos querer saber qual foi a mensagem de erro retornada pelo PostgreSQL, podemos fazer isso com a função PQerrorMessage, que tem o seguinte protótipo:
char *PQerrorMessage(PGconn *conn);
Esta função retorna um ponteiro char, e recebe como parâmetro um objeto de conexão.
Vamos agora ver a listagem do código:
#include <libpq-fe.h>
/*Objeto de conexão*/
PGconn *conn = NULL;
int main()
{
/*realiza a conexão*/
conn = PQconnectdb("host=localhost dbname=TESTE");
if(PQstatus(conn) == CONNECTION_OK)
{
printf("Conexão com efetuada com sucesso. ");
}
else
{
printf("Falha na conexão. Erro: %s", PQerrorMessage(conn));
PQfinish(conn);
return -1;
}
/*Verifica se a conexão está aberta e a encerra*/
if(conn != NULL)
PQfinish(conn);
}
/*Objeto de conexão*/
PGconn *conn = NULL;
int main()
{
/*realiza a conexão*/
conn = PQconnectdb("host=localhost dbname=TESTE");
if(PQstatus(conn) == CONNECTION_OK)
{
printf("Conexão com efetuada com sucesso. ");
}
else
{
printf("Falha na conexão. Erro: %s", PQerrorMessage(conn));
PQfinish(conn);
return -1;
}
/*Verifica se a conexão está aberta e a encerra*/
if(conn != NULL)
PQfinish(conn);
}
Pronto, agora, se a conexão falhar, podemos ter uma descrição melhor.
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