libpq程序例子

程序:

[root@lex tst]# cat testlibpq.c
/*
 * testlibpq.c
 *  Test the C version of LIBPQ, the POSTGRES frontend library.
 */
#include <stdio.h>
#include <stdlib.h>
#include "libpq-fe.h"

static void
exit_nicely(PGconn *conn)
{
 PQfinish(conn);
 exit(EXIT_SUCCESS);
}

int
main()
{
 char    *pghost,
         *pgport,
         *pgoptions,
         *pgtty;
 char    *dbName;
 int   nFields;
 int   i,
       j;

#ifdef DEBUG
 FILE    *debug;
#endif  /* DEBUG */

 PGconn    *conn;
 PGresult   *res;

 /*
  * Begin by setting the parameters for a backend connection.
  * If the parameters are NULL, the system tries to use 
  * reasonable defaults by looking up environment variables 
  * or, failing that, using hardwired constants.
  */

 const char *conninfo="postgresql://postgres:postgres@localhost:5432/postgres";

 /* make a connection to the database */
 //conn = PQsetdb(pghost, pgport, pgoptions, pgtty, dbName);
 conn = PQconnectdb(conninfo);

 /* check to see that the backend connection was successfully made */
 if (PQstatus(conn) == CONNECTION_BAD)
 {
  fprintf(stderr, "Connection to database '%s' failed.\n", dbName);
  fprintf(stderr, "%s", PQerrorMessage(conn));
  exit_nicely(conn);
 }

#ifdef DEBUG
 debug = fopen("/tmp/trace.out", "w");
 PQtrace(conn, debug);
#endif  /* DEBUG */

 /* start a transaction block */
 res = PQexec(conn, "BEGIN");
 if (PQresultStatus(res) != PGRES_COMMAND_OK)
 {
  fprintf(stderr, "BEGIN command failed\n");
  PQclear(res);
  exit_nicely(conn);
 }

 /*
  * should PQclear PGresult whenever it is no longer needed 
  * so as to avoid memory leaks
  */
 PQclear(res);

 /*
  * fetch instances from the pg_database, the system catalog of
  * databases
  */
 res = PQexec(conn, "DECLARE myportal CURSOR FOR select * from pg_database");
 if (PQresultStatus(res) != PGRES_COMMAND_OK)
 {
  fprintf(stderr, "DECLARE CURSOR command failed\n");
  PQclear(res);
  exit_nicely(conn);
 }
 PQclear(res);

 res = PQexec(conn, "FETCH ALL in myportal");
 if (PQresultStatus(res) != PGRES_TUPLES_OK)
 {
  fprintf(stderr, "FETCH ALL command didn't return tuples properly\n");
  PQclear(res);
  exit_nicely(conn);
 }

 /* first, print out the attribute names */
 nFields = PQnfields(res);
 for (i = 0; i < nFields; i++)
  printf("%-15s", PQfname(res, i));

 printf("\n\n");

 /* next, print out the instances */
 for (i = 0; i < PQntuples(res); i++)
 {
  for (j = 0; j < nFields; j++)
   printf("%-15s", PQgetvalue(res, i, j));
  printf("\n");
 }

 PQclear(res);

 /* close the portal */
 res = PQexec(conn, "CLOSE myportal");
 PQclear(res);

 /* end the transaction */
 res = PQexec(conn, "END");
 PQclear(res);

 /* close the connection to the database and cleanup */
 PQfinish(conn);

#ifdef DEBUG
 fclose(debug);
#endif  /* DEBUG */

 return 0;
}
[root@lex tst]# 

编译和运行:

export LD_LIBRARY_PATH=/usr/local/pgsql/lib
[root@lex tst]# gcc -c -I/usr/local/pgsql/include testlibpq.c
[root@lex tst]# gcc -o testlibpq testlibpq.o -L/usr/local/pgsql/lib -lpq
[root@lex tst]# ./testlibpq
datname        datdba         encoding       datcollate     datctype       datistemplate  datallowconn   datconnlimit   datlastsysoid  datfrozenxid   dattablespace  datacl         

template1      10             6              en_US.UTF-8    en_US.UTF-8    t              t              -1             12783          1672           1663           {=c/postgres,postgres=CTc/postgres}
template0      10             6              en_US.UTF-8    en_US.UTF-8    t              f              -1             12783          1672           1663           {=c/postgres,postgres=CTc/postgres}
postgres       10             6              en_US.UTF-8    en_US.UTF-8    f              t              -1             12783          1672           1663                          
[root@lex tst]# 

 

posted @ 2013-06-17 13:37  健哥的数据花园  阅读(2041)  评论(0编辑  收藏  举报