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

数据库系统

开发平台:

Unix_Linux

  1. #!/usr/local/bin/perl
  2. # $Id: example.oldstyle,v 1.6 1998/09/27 19:12:35 mergl Exp $
  3. ######################### globals
  4. $| = 1;
  5. use Pg;
  6. $dbmain = 'template1';
  7. $dbname = 'pgperltest';
  8. $trace  = '/tmp/pgtrace.out';
  9. $DEBUG  = 0; # set this to 1 for traces
  10. ######################### the following functions will be tested
  11. # PQsetdb()
  12. # PQdb()
  13. # PQuser()
  14. # PQport()
  15. # PQstatus()
  16. # PQfinish()
  17. # PQerrorMessage()
  18. # PQtrace()
  19. # PQuntrace()
  20. # PQexec()
  21. # PQconsumeInput
  22. # PQgetline()
  23. # PQputline()
  24. # PQendcopy()
  25. # PQresultStatus()
  26. # PQntuples()
  27. # PQnfields()
  28. # PQfname()
  29. # PQfnumber()
  30. # PQftype()
  31. # PQfsize()
  32. # PQcmdStatus()
  33. # PQoidStatus()
  34. # PQcmdTuples()
  35. # PQgetvalue()
  36. # PQclear()
  37. # PQprint()
  38. # PQnotifies()
  39. # PQlo_import()
  40. # PQlo_export()
  41. # PQlo_unlink()
  42. ######################### the following functions will not be tested
  43. # PQconnectdb()
  44. # PQconndefaults()
  45. # PQsetdbLogin()
  46. # PQreset()
  47. # PQrequestCancel()
  48. # PQpass()
  49. # PQhost()
  50. # PQtty()
  51. # PQoptions()
  52. # PQsocket()
  53. # PQbackendPID()
  54. # PQsendQuery()
  55. # PQgetResult()
  56. # PQisBusy()
  57. # PQgetlineAsync()
  58. # PQputnbytes()
  59. # PQmakeEmptyPGresult()
  60. # PQfmod()
  61. # PQgetlength()
  62. # PQgetisnull()
  63. # PQdisplayTuples()
  64. # PQprintTuples()
  65. # PQlo_open()
  66. # PQlo_close()
  67. # PQlo_read()
  68. # PQlo_write()
  69. # PQlo_creat()
  70. # PQlo_lseek()
  71. # PQlo_tell()
  72. ######################### handles error condition
  73. $SIG{PIPE} = sub { print "broken pipen" };
  74. ######################### create and connect to test database
  75. $conn = PQsetdb('', '', '', '', $dbmain);
  76. die PQerrorMessage($conn) unless PGRES_CONNECTION_OK eq PQstatus($conn);
  77. print "connected to $dbmainn";
  78. # do not complain when dropping $dbname
  79. $result = PQexec($conn, "DROP DATABASE $dbname");
  80. PQclear($result);
  81. $result = PQexec($conn, "CREATE DATABASE $dbname");
  82. die PQerrorMessage($conn) unless PGRES_COMMAND_OK eq PQresultStatus($result);
  83. print "created database $dbnamen";
  84. PQclear($result);
  85. PQfinish($conn);
  86. $conn = PQsetdb('', '', '', '', $dbname);
  87. die PQerrorMessage($conn) unless PGRES_CONNECTION_OK eq PQstatus($conn);
  88. print "connected to $dbnamen";
  89. ######################### debug, PQtrace
  90. if ($DEBUG) {
  91.     open(TRACE, ">$trace") || die "can not open $trace: $!";
  92.     PQtrace($conn, TRACE);
  93.     print "enabled tracing into $tracen";
  94. }
  95. ######################### check PGconn
  96. $db = PQdb($conn);
  97. print "  database: $dbn";
  98. $user = PQuser($conn);
  99. print "  user:     $usern";
  100. $port = PQport($conn);
  101. print "  port:     $portn";
  102. ######################### create and insert into table
  103. $result = PQexec($conn, "CREATE TABLE person (id int4, name char(16))");
  104. die PQerrorMessage($conn) unless PGRES_COMMAND_OK eq PQresultStatus($result);
  105. print "created table, status = ", PQcmdStatus($result), "n";
  106. PQclear($result);
  107. for ($i = 1; $i <= 5; $i++) {
  108.     $result = PQexec($conn, "INSERT INTO person VALUES ($i, 'Edmund Mergl')");
  109.     die PQerrorMessage($conn) unless PGRES_COMMAND_OK eq PQresultStatus($result);
  110.     PQclear($result);
  111. }
  112. print "insert into table, last oid = ", PQoidStatus($result), "n";
  113. ######################### copy to stdout, PQgetline
  114. $result = PQexec($conn, "COPY person TO STDOUT");
  115. die PQerrorMessage($conn) unless PGRES_COPY_OUT eq PQresultStatus($result);
  116. print "copy table to STDOUT:n";
  117. PQclear($result);
  118. $ret = 0;
  119. $i   = 1;
  120. while (-1 != $ret) {
  121.     $ret = PQgetline($conn, $string, 256);
  122.     last if $string eq "\.";
  123.     print "  ", $string, "n";
  124.     $i++;
  125. }
  126. die PQerrorMessage($conn) unless 0 == PQendcopy($conn);
  127. ######################### delete and copy from stdin, PQputline
  128. $result = PQexec($conn, "BEGIN");
  129. die PQerrorMessage($conn) unless PGRES_COMMAND_OK eq PQresultStatus($result);
  130. PQclear($result);
  131. $result = PQexec($conn, "DELETE FROM person");
  132. die PQerrorMessage($conn) unless PGRES_COMMAND_OK eq PQresultStatus($result);
  133. print "delete from table, command status = ", PQcmdStatus($result), ", no. of tuples = ", PQcmdTuples($result), "n";
  134. PQclear($result);
  135. $result = PQexec($conn, "COPY person FROM STDIN");
  136. die PQerrorMessage($conn) unless PGRES_COPY_IN eq PQresultStatus($result);
  137. print "copy table from STDIN:n";
  138. PQclear($result);
  139. for ($i = 1; $i <= 5; $i++) {
  140.     # watch the tabs and do not forget the newlines
  141.     PQputline($conn, "$i Edmund Mergln");
  142. }
  143. PQputline($conn, "\.n");
  144. die PQerrorMessage($conn) unless 0 == PQendcopy($conn);
  145. $result = PQexec($conn, "END");
  146. die PQerrorMessage($conn) unless PGRES_COMMAND_OK eq PQresultStatus($result);
  147. PQclear($result);
  148. ######################### select from person, PQgetvalue
  149. $result = PQexec($conn, "SELECT * FROM person");
  150. die PQerrorMessage($conn) unless PGRES_TUPLES_OK eq PQresultStatus($result);
  151. print "select from table:n";
  152. for ($k = 0; $k < PQnfields($result); $k++) {
  153.     print "  field = ", $k, "tfname = ", PQfname($result, $k), "tftype = ", PQftype($result, $k), "tfsize = ", PQfsize($result, $k), "tfnumber = ", PQfnumber($result, PQfname($result, $k)), "n";
  154. }
  155. for ($k = 0; $k < PQntuples($result); $k++) {
  156.     for ($l = 0; $l < PQnfields($result); $l++) {
  157.         print " ", PQgetvalue($result, $k, $l);
  158.     }
  159.     print "n";
  160. }
  161. PQclear($result);
  162. ######################### PQnotifies
  163. if (! defined($pid = fork)) {
  164.     die "can not fork: $!";
  165. } elsif (! $pid) {
  166.     # I'm the child
  167.     sleep 2;
  168.     $conn = PQsetdb('', '', '', '', $dbname);
  169.     $result = PQexec($conn, "NOTIFY person");
  170.     PQclear($result);
  171.     PQfinish($conn);
  172.     exit;
  173. }
  174. $result = PQexec($conn, "LISTEN person");
  175. die PQerrorMessage($conn) unless PGRES_COMMAND_OK eq PQresultStatus($result);
  176. print "listen table: status = ", PQcmdStatus($result), "n";
  177. PQclear($result);
  178. while (1) {
  179.     PQconsumeInput($conn);
  180.     ($table, $pid) = PQnotifies($conn);
  181.     last if $pid;
  182. }
  183. print "got notification: table = ", $table, "  pid = ", $pid, "n";
  184. ######################### PQprint
  185. $result = PQexec($conn, "SELECT * FROM person");
  186. die PQerrorMessage($conn) unless PGRES_TUPLES_OK eq PQresultStatus($result);
  187. print "select from table and print:n";
  188. PQprint(STDOUT, $result, 0, 0, 0, 0, 0, 0, " ", "", "", "");
  189. PQclear($result);
  190. ######################### PQlo_import, PQlo_export, PQlo_unlink
  191. $lobject_in  = '/tmp/gaga.in';
  192. $lobject_out = '/tmp/gaga.out';
  193. $data = "testing large objects using lo_import and lo_export";
  194. open(FD, ">$lobject_in") or die "can not open $lobject_in";
  195. print(FD $data);
  196. close(FD);
  197. $result = PQexec($conn, "BEGIN");
  198. die PQerrorMessage($conn) unless PGRES_COMMAND_OK eq PQresultStatus($result);
  199. PQclear($result);
  200. $lobjOid = PQlo_import($conn, "$lobject_in") or die PQerrorMessage($conn);
  201. print "importing file as large object, Oid = ", $lobjOid, "n";
  202. die PQerrorMessage($conn) unless 1 == PQlo_export($conn, $lobjOid, "$lobject_out");
  203. print "exporting large object as temporary filen";
  204. $result = PQexec($conn, "END");
  205. die PQerrorMessage($conn) unless PGRES_COMMAND_OK eq PQresultStatus($result);
  206. PQclear($result);
  207. print "comparing imported file with exported file: ";
  208. print "not " unless (-s "$lobject_in" == -s "$lobject_out");
  209. print "okn";
  210. die PQerrorMessage($conn) if -1 == PQlo_unlink($conn, $lobjOid);
  211. unlink $lobject_in;
  212. unlink $lobject_out;
  213. print "unlink large objectn";
  214. ######################### debug, PQuntrace
  215. if ($DEBUG) {
  216.     close(TRACE) || die "bad TRACE: $!";
  217.     PQuntrace($conn);
  218.     print "tracing disabledn";
  219. }
  220. ######################### disconnect and drop test database
  221. PQfinish($conn);
  222. $conn = PQsetdb('', '', '', '', $dbmain);
  223. die PQerrorMessage($conn) unless PGRES_CONNECTION_OK eq PQstatus($conn);
  224. print "connected to $dbmainn";
  225. $result = PQexec($conn, "DROP DATABASE $dbname");
  226. die PQerrorMessage($conn) unless PGRES_COMMAND_OK eq PQresultStatus($result);
  227. print "drop databasen";
  228. PQclear($result);
  229. PQfinish($conn);
  230. ######################### EOF