testlibpq2.c
上传用户:blenddy
上传日期:2007-01-07
资源大小:6495k
文件大小:2k
源码类别:

数据库系统

开发平台:

Unix_Linux

  1. /*
  2.  * testlibpq2.c
  3.  * Test of the asynchronous notification interface
  4.  *
  5.    populate a database with the following:
  6. CREATE TABLE TBL1 (i int4);
  7. CREATE TABLE TBL2 (i int4);
  8. CREATE RULE r1 AS ON INSERT TO TBL1 DO [INSERT INTO TBL2 values (new.i); NOTIFY TBL2];
  9.  * Then start up this program
  10.  * After the program has begun, do
  11. INSERT INTO TBL1 values (10);
  12.  *
  13.  *
  14.  */
  15. #include <stdio.h>
  16. #include <stdlib.h>
  17. #include "libpq-fe.h"
  18. static void
  19. exit_nicely(PGconn *conn)
  20. {
  21. PQfinish(conn);
  22. exit(1);
  23. }
  24. int
  25. main()
  26. {
  27. char    *pghost,
  28.    *pgport,
  29.    *pgoptions,
  30.    *pgtty;
  31. char    *dbName;
  32. /*
  33.  * int nFields; int   i, j;
  34.  */
  35. PGconn    *conn;
  36. PGresult   *res;
  37. PGnotify   *notify;
  38. /*
  39.  * begin, by setting the parameters for a backend connection if the
  40.  * parameters are null, then the system will try to use reasonable
  41.  * defaults by looking up environment variables or, failing that,
  42.  * using hardwired constants
  43.  */
  44. pghost = NULL; /* host name of the backend server */
  45. pgport = NULL; /* port of the backend server */
  46. pgoptions = NULL; /* special options to start up the backend
  47.  * server */
  48. pgtty = NULL; /* debugging tty for the backend server */
  49. dbName = getenv("USER"); /* change this to the name of your test
  50.  * database */
  51. /* make a connection to the database */
  52. conn = PQsetdb(pghost, pgport, pgoptions, pgtty, dbName);
  53. /* check to see that the backend connection was successfully made */
  54. if (PQstatus(conn) == CONNECTION_BAD)
  55. {
  56. fprintf(stderr, "Connection to database '%s' failed.n", dbName);
  57. fprintf(stderr, "%s", PQerrorMessage(conn));
  58. exit_nicely(conn);
  59. }
  60. res = PQexec(conn, "LISTEN TBL2");
  61. if (PQresultStatus(res) != PGRES_COMMAND_OK)
  62. {
  63. fprintf(stderr, "LISTEN command failedn");
  64. PQclear(res);
  65. exit_nicely(conn);
  66. }
  67. /*
  68.  * should PQclear PGresult whenever it is no longer needed to avoid
  69.  * memory leaks
  70.  */
  71. PQclear(res);
  72. while (1)
  73. {
  74. /* async notification only come back as a result of a query */
  75. /* we can send empty queries */
  76. res = PQexec(conn, " ");
  77. /* printf("res->status = %sn", PQresStatus(PQresultStatus(res))); */
  78. /* check for asynchronous returns */
  79. notify = PQnotifies(conn);
  80. if (notify)
  81. {
  82. fprintf(stderr,
  83.  "ASYNC NOTIFY of '%s' from backend pid '%d' receivedn",
  84. notify->relname, notify->be_pid);
  85. free(notify);
  86. break;
  87. }
  88. PQclear(res);
  89. }
  90. /* close the connection to the database and cleanup */
  91. PQfinish(conn);
  92. return 0; /* Though PQfinish(conn1) has called
  93.  * exit(1) */
  94. }