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

数据库系统

开发平台:

Unix_Linux

  1. /*
  2.  * testlibpq.c
  3.  * Test the C version of LIBPQ, the POSTGRES frontend library.
  4.  *
  5.  *
  6.  */
  7. #include <stdio.h>
  8. #include "libpq-fe.h"
  9. static void
  10. exit_nicely(PGconn *conn)
  11. {
  12. PQfinish(conn);
  13. exit(1);
  14. }
  15. int
  16. main()
  17. {
  18. char    *pghost,
  19.    *pgport,
  20.    *pgoptions,
  21.    *pgtty;
  22. char    *dbName;
  23. int nFields;
  24. int i,
  25. j;
  26. #ifdef DEBUG
  27. FILE    *debug;
  28. #endif  /* DEBUG */
  29. PGconn    *conn;
  30. PGresult   *res;
  31. /*
  32.  * begin, by setting the parameters for a backend connection if the
  33.  * parameters are null, then the system will try to use reasonable
  34.  * defaults by looking up environment variables or, failing that,
  35.  * using hardwired constants
  36.  */
  37. pghost = NULL; /* host name of the backend server */
  38. pgport = NULL; /* port of the backend server */
  39. pgoptions = NULL; /* special options to start up the backend
  40.  * server */
  41. pgtty = NULL; /* debugging tty for the backend server */
  42. dbName = "template1";
  43. /* make a connection to the database */
  44. conn = PQsetdb(pghost, pgport, pgoptions, pgtty, dbName);
  45. /* check to see that the backend connection was successfully made */
  46. if (PQstatus(conn) == CONNECTION_BAD)
  47. {
  48. fprintf(stderr, "Connection to database '%s' failed.n", dbName);
  49. fprintf(stderr, "%s", PQerrorMessage(conn));
  50. exit_nicely(conn);
  51. }
  52. #ifdef DEBUG
  53. debug = fopen("/tmp/trace.out", "w");
  54. PQtrace(conn, debug);
  55. #endif  /* DEBUG */
  56. /* start a transaction block */
  57. res = PQexec(conn, "BEGIN");
  58. if (PQresultStatus(res) != PGRES_COMMAND_OK)
  59. {
  60. fprintf(stderr, "BEGIN command failedn");
  61. PQclear(res);
  62. exit_nicely(conn);
  63. }
  64. /*
  65.  * should PQclear PGresult whenever it is no longer needed to avoid
  66.  * memory leaks
  67.  */
  68. PQclear(res);
  69. /*
  70.  * fetch instances from the pg_database, the system catalog of
  71.  * databases
  72.  */
  73. res = PQexec(conn, "DECLARE myportal CURSOR FOR select * from pg_database");
  74. if (PQresultStatus(res) != PGRES_COMMAND_OK)
  75. {
  76. fprintf(stderr, "DECLARE CURSOR command failedn");
  77. PQclear(res);
  78. exit_nicely(conn);
  79. }
  80. PQclear(res);
  81. res = PQexec(conn, "FETCH ALL in myportal");
  82. if (PQresultStatus(res) != PGRES_TUPLES_OK)
  83. {
  84. fprintf(stderr, "FETCH ALL command didn't return tuples properlyn");
  85. PQclear(res);
  86. exit_nicely(conn);
  87. }
  88. /* first, print out the attribute names */
  89. nFields = PQnfields(res);
  90. for (i = 0; i < nFields; i++)
  91. printf("%-15s", PQfname(res, i));
  92. printf("nn");
  93. /* next, print out the instances */
  94. for (i = 0; i < PQntuples(res); i++)
  95. {
  96. for (j = 0; j < nFields; j++)
  97. printf("%-15s", PQgetvalue(res, i, j));
  98. printf("n");
  99. }
  100. PQclear(res);
  101. /* close the portal */
  102. res = PQexec(conn, "CLOSE myportal");
  103. PQclear(res);
  104. /* end the transaction */
  105. res = PQexec(conn, "END");
  106. PQclear(res);
  107. /* close the connection to the database and cleanup */
  108. PQfinish(conn);
  109. #ifdef DEBUG
  110. fclose(debug);
  111. #endif  /* DEBUG */
  112. exit(0);
  113. }