当前位置:操作系统 > Unix/Linux >>

PostgreSQL数据库学习手册之libpq-C库的例子程序

1.14. 例子程序

  Example 1-1. libpq 例子程序 1

  [myphp]

  /*

  * testlibpq.c

  *

  * Test the C version of libpq, thePostgreSQLfrontend

  * library.

  * 测试 PostgreSQL 前端库 libpq 的 C 版本

  */

  #include <stdio.h>

  #include <libpq-fe.h>

  void

  exit_nicely(PGconn *conn)

  {

  PQfinish(conn);

  exit(1);

  }

  main()

  {

  char *pghost,

  *pgport,

  *pgoptions,

  *pgtty;

  char *dbName;

  int nFields;

  int i,

  j;

  /* FILE *debug; */

  PGconn *conn;

  PGresult *res;

  /*

  * begin, by setting the parameters for a backend connection if the

  * parameters are null, then the system will try to use reasonable

  * defaults by looking up environment variables or, failing that,

  * using hardwired constants

  */

  pghost = NULL; /* host name of the backend server */

  pgport = NULL; /* port of the backend server */

  pgoptions = NULL; /* special options to start up the backend

  * server */

  pgtty = NULL; /* debugging tty for the backend server */

  dbName = "template1";

  /* make a connection to the database */

  conn = PQsetdb(pghost, pgport, pgoptions, pgtty, dbName);

  /*

  * 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);

  }

  /* debug = fopen("/tmp/trace.out","w"); */

  /* PQtrace(conn, debug); */

  /* start a transaction block */

  res = PQexec(conn, "BEGIN");

  if (!res || 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 to avoid

  * memory leaks

  */

  PQclear(res);

  /*

  * fetch rows from the pg_database, the system catalog of

  * databases

  */

  res = PQexec(conn, "DECLARE mycursor CURSOR FOR SELECT * FROM pg_database");

  if (!res || 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 mycursor");

  if (!res || 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 rows */

  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 cursor */

  res = PQexec(conn, "CLOSE mycursor");

  PQclear(res);

  /* commit the transaction */

  res = PQexec(conn, "COMMIT");

  PQclear(res);

  /* close the connection to the database and cleanup */

  PQfinish(conn);

  /* fclose(debug); */

  return 0;

  }

  [/myphp]

  Example 1-2. libpq 例子程序 2

  [myphp]

  /*

  * testlibpq2.c

  * 测试异步通知接口

  *

  * 运行此程序,然后从另外一个窗口的 psql 里运行 NOTIFY TBL2;

  *

  * 或者,如果你想好玩一点,尝试下面动作∶

  * 用下面的语句填充一个数据库∶

  *

  * CREATE TABLE TBL1 (i int4);

  *

  * CREATE TABLE TBL2 (i int4);

  *

  * CREATE RULE r1 AS ON INSERT TO TBL1 DO

  * (INSERT INTO TBL2 values (new.i); NOTIFY TBL2);

  *

  * 然后∶

  *

  * INSERT INTO TBL1 values (10);

  *

  */

  #include <stdio.h>

  #include "libpq-fe.h"

  void

  exit_nicely(PGconn *conn)

  {

  PQfinish(conn);

  exit(1);

  }

  main()

  {

  char *pghost,

  *pgport,

  *pgoptions,

  *pgtty;

  char *dbName;

  int nFields;

  int i,

  j;

  PGconn *conn;

  PGresult *res;

  PGnotify *notify;

  /*

  * begin, by setting the parameters for a backend connection if the

  * parameters are null, then the system will try to use reasonable

  * defaults by looking up environment variables or, failing that,

  * using hardwired constants

  */

  pghost = NULL; /* host name of the backend server */

  pgport = NULL; /* port of the backend server */

  pgoptions = NULL; /* special options to start up the backend

  * server */

  pgtty = NULL; /* debugging tty for the backend server */

  dbName = getenv("USER"); /* change this to the name of your test

  * database */

  /* make a connection to the database */

  conn = PQsetdb(pghost, pgport, pgoptions, pgtty, dbName);

  /*

  * 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);

  }

  res = PQexec(conn, "LISTEN TBL2");

  if (!res || PQresultStatus(res) != PGRES_COMMAND_OK)

  {

  fprintf(stderr, "LISTEN command failed\n");

  PQclear(res);

  exit_nicely(conn);

  }

  /*

  * should PQclear PGresult whenever it is no longer needed to avoid

  * memory leaks

  */

  PQclear(res);

  while (1)

  {

  /*

  * wait a little bit between checks; waiting with select()

  * would be more efficient.

  */

  sleep(1);

  /* collect any asynchronous backend messages */

  PQconsumeInput(conn);

  /* check for asynchronous notify messages */

  w
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,