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

数据库系统

开发平台:

Unix_Linux

  1. #!/usr/local/bin/perl
  2. # $Id: example.newstyle,v 1.6 1998/09/27 19:12:34 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 methods will be used
  11. # connectdb
  12. # conndefaults
  13. # db
  14. # user
  15. # port
  16. # status
  17. # errorMessage
  18. # trace
  19. # untrace
  20. # exec
  21. # consumeInput
  22. # getline
  23. # putline
  24. # endcopy
  25. # resultStatus
  26. # ntuples
  27. # nfields
  28. # fname
  29. # fnumber
  30. # ftype
  31. # fsize
  32. # cmdStatus
  33. # oidStatus
  34. # cmdTuples
  35. # getvalue
  36. # print
  37. # notifies
  38. # lo_import
  39. # lo_export
  40. # lo_unlink
  41. ######################### the following methods will not be used
  42. # setdb
  43. # setdbLogin
  44. # reset
  45. # requestCancel
  46. # pass
  47. # host
  48. # tty
  49. # options
  50. # socket
  51. # backendPID
  52. # sendQuery
  53. # getResult
  54. # isBusy
  55. # getlineAsync
  56. # putnbytes
  57. # makeEmptyPGresult
  58. # fmod
  59. # getlength
  60. # getisnull
  61. # displayTuples
  62. # printTuples
  63. # lo_open
  64. # lo_close
  65. # lo_read
  66. # lo_write
  67. # lo_creat
  68. # lo_seek
  69. # lo_tell
  70. ######################### handles error condition
  71. $SIG{PIPE} = sub { print "broken pipen" };
  72. ######################### create and connect to test database
  73. $Option_ref = Pg::conndefaults();
  74. ($key, $val);
  75. print "connection defaults:n";
  76. while (($key, $val) = each %$Option_ref) {
  77.     printf "  keyword = %-12.12s val = >%s<n", $key, $val;
  78. }
  79. $conn = Pg::connectdb("dbname=$dbmain");
  80. die $conn->errorMessage unless PGRES_CONNECTION_OK eq $conn->status;
  81. print "connected to $dbmainn";
  82. # do not complain when dropping $dbname
  83. $conn->exec("DROP DATABASE $dbname");
  84. $result = $conn->exec("CREATE DATABASE $dbname");
  85. die $conn->errorMessage unless PGRES_COMMAND_OK eq $result->resultStatus;
  86. print "created database $dbnamen";
  87. $conn = Pg::connectdb("dbname=$dbname");
  88. die $conn->errorMessage unless PGRES_CONNECTION_OK eq $conn->status;
  89. print "connected to $dbnamen";
  90. ######################### debug, trace
  91. if ($DEBUG) {
  92.     open(TRACE, ">$trace") || die "can not open $trace: $!";
  93.     $conn->trace(TRACE);
  94.     print "enabled tracing into $tracen";
  95. }
  96. ######################### check PGconn
  97. $db = $conn->db;
  98. print "  database: $dbn";
  99. $user = $conn->user;
  100. print "  user:     $usern";
  101. $port = $conn->port;
  102. print "  port:     $portn";
  103. ######################### create and insert into table
  104. $result = $conn->exec("CREATE TABLE person (id int4, name char(16))");
  105. die $conn->errorMessage unless PGRES_COMMAND_OK eq $result->resultStatus;
  106. print "created table, status = ", $result->cmdStatus, "n";
  107. for ($i = 1; $i <= 5; $i++) {
  108.     $result = $conn->exec("INSERT INTO person VALUES ($i, 'Edmund Mergl')");
  109.     die $conn->errorMessage unless PGRES_COMMAND_OK eq $result->resultStatus;
  110. }
  111. print "insert into table, last oid = ", $result->oidStatus, "n";
  112. ######################### copy to stdout, getline
  113. $result = $conn->exec("COPY person TO STDOUT");
  114. die $conn->errorMessage unless PGRES_COPY_OUT eq $result->resultStatus;
  115. print "copy table to STDOUT:n";
  116. $ret = 0;
  117. $i   = 1;
  118. while (-1 != $ret) {
  119.     $ret = $conn->getline($string, 256);
  120.     last if $string eq "\.";
  121.     print "  ", $string, "n";
  122.     $i ++;
  123. }
  124. die $conn->errorMessage unless 0 == $conn->endcopy;
  125. ######################### delete and copy from stdin, putline
  126. $result = $conn->exec("BEGIN");
  127. die $conn->errorMessage unless PGRES_COMMAND_OK eq $result->resultStatus;
  128. $result = $conn->exec("DELETE FROM person");
  129. die $conn->errorMessage unless PGRES_COMMAND_OK eq $result->resultStatus;
  130. print "delete from table, command status = ", $result->cmdStatus, ", no. of tuples = ", $result->cmdTuples, "n";
  131. $result = $conn->exec("COPY person FROM STDIN");
  132. die $conn->errorMessage unless PGRES_COPY_IN eq $result->resultStatus;
  133. print "copy table from STDIN: ";
  134. for ($i = 1; $i <= 5; $i++) {
  135.     # watch the tabs and do not forget the newlines
  136.     $conn->putline("$i Edmund Mergln");
  137. }
  138. $conn->putline("\.n");
  139. die $conn->errorMessage unless 0 == $conn->endcopy;
  140. $result = $conn->exec("END");
  141. die $conn->errorMessage unless PGRES_COMMAND_OK eq $result->resultStatus;
  142. print "okn";
  143. ######################### select from person, getvalue
  144. $result = $conn->exec("SELECT * FROM person");
  145. die $conn->errorMessage unless PGRES_TUPLES_OK eq $result->resultStatus;
  146. print "select from table:n";
  147. for ($k = 0; $k < $result->nfields; $k++) {
  148.     print "  field = ", $k, "tfname = ", $result->fname($k), "tftype = ", $result->ftype($k), "tfsize = ", $result->fsize($k), "tfnumber = ", $result->fnumber($result->fname($k)), "n";
  149. }
  150. while (@row = $result->fetchrow) {
  151.     print " ", join(" ", @row), "n";
  152. }
  153. ######################### notifies
  154. if (! defined($pid = fork)) {
  155.     die "can not fork: $!";
  156. } elsif (! $pid) {
  157.     # I'm the child
  158.     sleep 2;
  159.     bless $conn;
  160.     $conn = Pg::connectdb("dbname=$dbname");
  161.     $result = $conn->exec("NOTIFY person");
  162.     exit;
  163. }
  164. $result = $conn->exec("LISTEN person");
  165. die $conn->errorMessage unless PGRES_COMMAND_OK eq $result->resultStatus;
  166. print "listen table: status = ", $result->cmdStatus, "n";
  167. while (1) {
  168.     $conn->consumeInput;
  169.     ($table, $pid) = $conn->notifies;
  170.     last if $pid;
  171. }
  172. print "got notification: table = ", $table, "  pid = ", $pid, "n";
  173. ######################### print
  174. $result = $conn->exec("SELECT * FROM person");
  175. die $conn->errorMessage unless PGRES_TUPLES_OK eq $result->resultStatus;
  176. print "select from table and print:n";
  177. $result->print(STDOUT, 0, 0, 0, 0, 0, 0, " ", "", "", "");
  178. ######################### lo_import, lo_export, lo_unlink
  179. $lobject_in  = '/tmp/gaga.in';
  180. $lobject_out = '/tmp/gaga.out';
  181. $data = "testing large objects using lo_import and lo_export";
  182. open(FD, ">$lobject_in") or die "can not open $lobject_in";
  183. print(FD $data);
  184. close(FD);
  185. $result = $conn->exec("BEGIN");
  186. die $conn->errorMessage unless PGRES_COMMAND_OK eq $result->resultStatus;
  187. $lobjOid = $conn->lo_import("$lobject_in") or die $conn->errorMessage;
  188. print "importing file as large object, Oid = ", $lobjOid, "n";
  189. die $conn->errorMessage unless 1 == $conn->lo_export($lobjOid, "$lobject_out");
  190. print "exporting large object as temporary filen";
  191. $result = $conn->exec("END");
  192. die $conn->errorMessage unless PGRES_COMMAND_OK eq $result->resultStatus;
  193. print "comparing imported file with exported file: ";
  194. print "not " unless (-s "$lobject_in" == -s "$lobject_out");
  195. print "okn";
  196. die $conn->errorMessage if -1 == $conn->lo_unlink($lobjOid);
  197. unlink $lobject_in;
  198. unlink $lobject_out;
  199. print "unlink large objectn";
  200. ######################### debug, untrace
  201. if ($DEBUG) {
  202.     close(TRACE) || die "bad TRACE: $!";
  203.     $conn->untrace;
  204.     print "tracing disabledn";
  205. }
  206. ######################### disconnect and drop test database
  207. $conn = Pg::connectdb("dbname=$dbmain");
  208. die $conn->errorMessage unless PGRES_CONNECTION_OK eq $conn->status;
  209. print "connected to $dbmainn";
  210. $result = $conn->exec("DROP DATABASE $dbname");
  211. die $conn->errorMessage unless PGRES_COMMAND_OK eq $result->resultStatus;
  212. print "drop databasen";
  213. ######################### EOF