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

数据库系统

开发平台:

Unix_Linux

  1. #-------------------------------------------------------
  2. #
  3. # $Id: Pg.pm,v 1.8 1998/09/27 19:12:22 mergl Exp $
  4. #
  5. # Copyright (c) 1997, 1998  Edmund Mergl
  6. #
  7. #-------------------------------------------------------
  8. package Pg;
  9. #use strict;
  10. use Carp;
  11. use vars qw($VERSION @ISA @EXPORT $AUTOLOAD);
  12. require Exporter;
  13. require DynaLoader;
  14. require AutoLoader;
  15. require 5.002;
  16. @ISA = qw(Exporter DynaLoader);
  17. # Items to export into callers namespace by default.
  18. @EXPORT = qw(
  19. PQconnectdb
  20. PQsetdbLogin
  21. PQsetdb
  22. PQconndefaults
  23. PQfinish
  24. PQreset
  25. PQrequestCancel
  26. PQdb
  27. PQuser
  28. PQpass
  29. PQhost
  30. PQport
  31. PQtty
  32. PQoptions
  33. PQstatus
  34. PQerrorMessage
  35. PQsocket
  36. PQbackendPID
  37. PQtrace
  38. PQuntrace
  39. PQexec
  40. PQnotifies
  41. PQsendQuery
  42. PQgetResult
  43. PQisBusy
  44. PQconsumeInput
  45. PQgetline
  46. PQputline
  47. PQgetlineAsync
  48. PQputnbytes
  49. PQendcopy
  50. PQmakeEmptyPGresult
  51. PQresultStatus
  52. PQntuples
  53. PQnfields
  54. PQbinaryTuples
  55. PQfname
  56. PQfnumber
  57. PQftype
  58. PQfsize
  59. PQfmod
  60. PQcmdStatus
  61. PQoidStatus
  62. PQcmdTuples
  63. PQgetvalue
  64. PQgetlength
  65. PQgetisnull
  66. PQclear
  67. PQprint
  68. PQdisplayTuples
  69. PQprintTuples
  70. PQlo_open
  71. PQlo_close
  72. PQlo_read
  73. PQlo_write
  74. PQlo_lseek
  75. PQlo_creat
  76. PQlo_tell
  77. PQlo_unlink
  78. PQlo_import
  79. PQlo_export
  80. PGRES_CONNECTION_OK
  81. PGRES_CONNECTION_BAD
  82. PGRES_EMPTY_QUERY
  83. PGRES_COMMAND_OK
  84. PGRES_TUPLES_OK
  85. PGRES_COPY_OUT
  86. PGRES_COPY_IN
  87. PGRES_BAD_RESPONSE
  88. PGRES_NONFATAL_ERROR
  89. PGRES_FATAL_ERROR
  90. PGRES_INV_SMGRMASK
  91. PGRES_INV_ARCHIVE
  92. PGRES_INV_WRITE
  93. PGRES_INV_READ
  94. PGRES_InvalidOid
  95. );
  96. $Pg::VERSION = '1.8.0';
  97. sub AUTOLOAD {
  98.     # This AUTOLOAD is used to 'autoload' constants from the constant()
  99.     # XS function.  If a constant is not found then control is passed
  100.     # to the AUTOLOAD in AutoLoader.
  101.     my $constname;
  102.     ($constname = $AUTOLOAD) =~ s/.*:://;
  103.     my $val = constant($constname, @_ ? $_[0] : 0);
  104.     if ($! != 0) {
  105. if ($! =~ /Invalid/) {
  106.     $AutoLoader::AUTOLOAD = $AUTOLOAD;
  107.     goto &AutoLoader::AUTOLOAD;
  108. }
  109. else {
  110. croak "Your vendor has not defined Pg macro $constname";
  111. }
  112.     }
  113.     eval "sub $AUTOLOAD { $val }";
  114.     goto &$AUTOLOAD;
  115. }
  116. bootstrap Pg $VERSION;
  117. sub doQuery {
  118.     my $conn      = shift;
  119.     my $query     = shift;
  120.     my $array_ref = shift;
  121.     my ($result, $status, $i, $j);
  122.     if ($result = $conn->exec($query)) {
  123.         if (2 == ($status = $result->resultStatus)) {
  124.             for $i (0..$result->ntuples - 1) {
  125.                 for $j (0..$result->nfields - 1) {
  126.                     $$array_ref[$i][$j] = $result->getvalue($i, $j);
  127.                 }
  128.             }
  129.         }
  130.     }
  131.     return $status;
  132. }
  133. 1;
  134. __END__
  135. =head1 NAME
  136. Pg - Perl5 extension for PostgreSQL
  137. =head1 SYNOPSIS
  138. new style:
  139.     use Pg;
  140.     $conn = Pg::connectdb("dbname=template1");
  141.     $result = $conn->exec("create database pgtest");
  142. old style (depreciated):
  143.     use Pg;
  144.     $conn = PQsetdb('', '', '', '', template1);
  145.     $result = PQexec($conn, "create database pgtest");
  146.     PQclear($result);
  147.     PQfinish($conn);
  148. =head1 DESCRIPTION
  149. The Pg module permits you to access all functions of the 
  150. Libpq interface of PostgreSQL. Libpq is the programmer's 
  151. interface to PostgreSQL. Pg tries to resemble this 
  152. interface as close as possible. For examples of how to 
  153. use this module, look at the file test.pl. For further 
  154. examples look at the Libpq applications in 
  155. ../src/test/examples and ../src/test/regress. 
  156. You have the choice between the old C-style and a 
  157. new, more Perl-ish style. The old style has the 
  158. benefit, that existing Libpq applications can be 
  159. ported to perl just by prepending every variable 
  160. with a '$'. The new style uses class packages and 
  161. might be more familiar for C++-programmers. 
  162. =head1 GUIDELINES
  163. =head2 new style
  164. The new style uses blessed references as objects. 
  165. After creating a new connection or result object, 
  166. the relevant Libpq functions serve as virtual methods. 
  167. One benefit of the new style: you do not have to care 
  168. about freeing the connection- and result-structures. 
  169. Perl calls the destructor whenever the last reference 
  170. to an object goes away. 
  171. The method fetchrow can be used to fetch the next row from 
  172. the server: while (@row = $result->fetchrow).
  173. Columns which have NULL as value will be set to C<undef>.
  174. =head2 old style
  175. All functions and constants are imported into the calling 
  176. packages name-space. In order to to get a uniform naming, 
  177. all functions start with 'PQ' (e.g. PQlo_open) and all 
  178. constants start with 'PGRES_' (e.g. PGRES_CONNECTION_OK). 
  179. There are two functions, which allocate memory, that has 
  180. to be freed by the user: 
  181.     PQsetdb, use PQfinish to free memory.
  182.     PQexec,  use PQclear to free memory.
  183. Pg.pm contains one convenience function: doQuery. It fills a
  184. two-dimensional array with the result of your query. Usage:
  185.     Pg::doQuery($conn, "select attr1, attr2 from tbl", @ary);
  186.     for $i ( 0 .. $#ary ) {
  187.         for $j ( 0 .. $#{$ary[$i]} ) {
  188.             print "$ary[$i][$j]t";
  189.         }
  190.         print "n";
  191.     }
  192. Notice the inner loop !
  193. =head1 CAVEATS
  194. There are few exceptions, where the perl-functions differs 
  195. from the C-counterpart: PQprint, PQnotifies and PQconndefaults. 
  196. These functions deal with structures, which have been 
  197. implemented in perl using lists or hash. 
  198. =head1 FUNCTIONS
  199. The functions have been divided into three sections: 
  200. Connection, Result, Large Objects. For details please 
  201. read L<libpq>.
  202. =head2 1. Connection
  203. With these functions you can establish and close a connection to a 
  204. database. In Libpq a connection is represented by a structure called
  205. PGconn. 
  206. When opening a connection a given database name is always converted to 
  207. lower-case, unless it is surrounded by double quotes. All unspecified 
  208. parameters are replaced by environment variables or by hard coded defaults: 
  209.     parameter  environment variable  hard coded default
  210.     --------------------------------------------------
  211.     host       PGHOST                localhost
  212.     port       PGPORT                5432
  213.     options    PGOPTIONS             ""
  214.     tty        PGTTY                 ""
  215.     dbname     PGDATABASE            current userid
  216.     user       PGUSER                current userid
  217.     password   PGPASSWORD            ""
  218. Using appropriate methods you can access almost all fields of the 
  219. returned PGconn structure. 
  220.     $conn = Pg::setdbLogin($pghost, $pgport, $pgoptions, $pgtty, $dbname, $login, $pwd)
  221. Opens a new connection to the backend. The connection identifier $conn 
  222. ( a pointer to the PGconn structure ) must be used in subsequent commands 
  223. for unique identification. Before using $conn you should call $conn->status 
  224. to ensure, that the connection was properly made. 
  225.     $conn = Pg::setdb($pghost, $pgport, $pgoptions, $pgtty, $dbname)
  226. The method setdb should be used when username/password authentication is 
  227. not needed. 
  228.     $conn = Pg::connectdb("option1=value option2=value ...")
  229. Opens a new connection to the backend using connection information in a 
  230. string. Possible options are: host, port, options, tty, dbname, user, password. 
  231. The connection identifier $conn (a pointer to the PGconn structure) 
  232. must be used in subsequent commands for unique identification. Before using 
  233. $conn you should call $conn->status to ensure, that the connection was 
  234. properly made. 
  235.     $Option_ref = Pg::conndefaults()
  236.     while(($key, $val) = each %$Option_ref) {
  237.         print "$key, $valn";
  238. Returns a reference to a hash containing as keys all possible options for 
  239. connectdb(). The values are the current defaults. This function differs from 
  240. his C-counterpart, which returns the complete conninfoOption structure. 
  241.     PQfinish($conn)
  242. Old style only !
  243. Closes the connection to the backend and frees the connection data structure. 
  244.     $conn->reset
  245. Resets the communication port with the backend and tries
  246. to establish a new connection.
  247.     $ret = $conn->requestCancel
  248. Abandon processing of the current query. Regardless  of the return value of 
  249. requestCancel, the application must continue with the normal result-reading 
  250. sequence using getResult. If the current query is part of a transaction, 
  251. cancellation will abort the whole transaction. 
  252.     $dbname = $conn->db
  253. Returns the database name of the connection.
  254.     $pguser = $conn->user
  255. Returns the Postgres user name of the connection.
  256.     $pguser = $conn->pass
  257. Returns the Postgres password of the connection.
  258.     $pghost = $conn->host
  259. Returns the host name of the connection.
  260.     $pgport = $conn->port
  261. Returns the port of the connection.
  262.     $pgtty = $conn->tty
  263. Returns the tty of the connection.
  264.     $pgoptions = $conn->options
  265. Returns the options used in the connection.
  266.     $status = $conn->status
  267. Returns the status of the connection. For comparing the status 
  268. you may use the following constants: 
  269.   - PGRES_CONNECTION_OK
  270.   - PGRES_CONNECTION_BAD
  271.     $errorMessage = $conn->errorMessage
  272. Returns the last error message associated with this connection.
  273.     $fd = $conn->socket
  274. Obtain the file descriptor number for the backend connection socket. 
  275. A result of -1 indicates that no backend connection is currently open. 
  276.     $pid = $conn->backendPID
  277. Returns the process-id of the corresponding backend proceess. 
  278.     $conn->trace(debug_port)
  279. Messages passed between frontend and backend are echoed to the 
  280. debug_port file stream. 
  281.     $conn->untrace
  282. Disables tracing. 
  283.     $result = $conn->exec($query)
  284. Submits a query to the backend. The return value is a pointer to 
  285. the PGresult structure, which contains the complete query-result 
  286. returned by the backend. In case of failure, the pointer points 
  287. to an empty structure. In this, the perl implementation differs 
  288. from the C-implementation. Using the old style, even the empty 
  289. structure has to be freed using PQfree. Before using $result you 
  290. should call resultStatus to ensure, that the query was 
  291. properly executed. 
  292.     ($table, $pid) = $conn->notifies
  293. Checks for asynchronous notifications. This functions differs from 
  294. the C-counterpart which returns a pointer to a new allocated structure, 
  295. whereas the perl implementation returns a list. $table is the table 
  296. which has been listened to and $pid is the process id of the backend. 
  297.     $ret = $conn->sendQuery($string, $query)
  298. Submit a query to Postgres without waiting for the result(s). After 
  299. successfully calling PQsendQuery, call PQgetResult one or more times 
  300. to obtain the query results.  PQsendQuery may not be called again until 
  301. getResult has returned NULL, indicating that the query is done. 
  302.     $result = $conn->getResult
  303. Wait for the next result from a prior PQsendQuery, and return it.  NULL 
  304. is returned when the query is complete and there will be no more results. 
  305. getResult  will block only if a query is active and the necessary response 
  306. data has not yet been read by PQconsumeInput. 
  307.     $ret = $conn->isBusy
  308. Returns TRUE if a query is busy, that is, PQgetResult would block waiting 
  309. for input.  A FALSE  return indicates that PQgetResult can be called with 
  310. assurance of not blocking.
  311.     $result = $conn->consumeInput
  312. If input is available from the backend, consume it. After calling consumeInput, 
  313. the application may check isBusy and/or notifies to see if their state has changed. 
  314.     $ret = $conn->getline($string, $length)
  315. Reads a string up to $length - 1 characters from the backend. 
  316. getline returns EOF at EOF, 0 if the entire line has been read, 
  317. and 1 if the buffer is full. If a line consists of the two 
  318. characters "." the backend has finished sending the results of 
  319. the copy command. 
  320.     $ret = $conn->putline($string)
  321. Sends a string to the backend. The application must explicitly 
  322. send the two characters "." to indicate to the backend that 
  323. it has finished sending its data. 
  324.     $ret = $conn->getlineAsync($buffer, $bufsize)
  325. Non-blocking version of getline. It reads up to $bufsize 
  326. characters from the backend. getlineAsync returns -1 if 
  327. the end-of-copy-marker has been recognized, 0 if no data 
  328. is avilable, and >0 the number of bytes returned. 
  329.     $ret = $conn->putnbytes($buffer, $nbytes)
  330. Sends n bytes to the backend. Returns 0 if OK, EOF if not. 
  331.     $ret = $conn->endcopy
  332. This function waits  until the backend has finished the copy. 
  333. It should either be issued when the last string has been sent 
  334. to  the  backend  using  putline or when the last string has 
  335. been received from the backend using getline. endcopy returns 
  336. 0 on success, 1 on failure. 
  337.     $result = $conn->makeEmptyPGresult($status);
  338. Returns a newly allocated, initialized result with given status. 
  339. =head2 2. Result
  340. With these functions you can send commands to a database and
  341. investigate the results. In Libpq the result of a command is 
  342. represented by a structure called PGresult. Using the appropriate 
  343. methods you can access almost all fields of this structure.
  344.     $result_status = $result->resultStatus
  345. Returns the status of the result. For comparing the status you 
  346. may use one of the following constants depending upon the 
  347. command executed:
  348.   - PGRES_EMPTY_QUERY
  349.   - PGRES_COMMAND_OK
  350.   - PGRES_TUPLES_OK
  351.   - PGRES_COPY_OUT
  352.   - PGRES_COPY_IN
  353.   - PGRES_BAD_RESPONSE
  354.   - PGRES_NONFATAL_ERROR
  355.   - PGRES_FATAL_ERROR
  356. Use the functions below to access the contents of the PGresult structure.
  357.     $ntuples = $result->ntuples
  358. Returns the number of tuples in the query result.
  359.     $nfields = $result->nfields
  360. Returns the number of fields in the query result.
  361.     $ret = $result->binaryTuples
  362. Returns 1 if the tuples in the query result are bianry. 
  363.     $fname = $result->fname($field_num)
  364. Returns the field name associated with the given field number. 
  365.     $fnumber = $result->fnumber($field_name)
  366. Returns the field number associated with the given field name. 
  367.     $ftype = $result->ftype($field_num)
  368. Returns the oid of the type of the given field number. 
  369.     $fsize = $result->fsize($field_num)
  370. Returns the size in bytes of the type of the given field number. 
  371. It returns -1 if the field has a variable length.
  372.     $fmod = $result->fmod($field_num)
  373. Returns the type-specific modification data of the field associated  
  374. with the given field index. Field indices start at 0. 
  375.     $cmdStatus = $result->cmdStatus
  376. Returns the command status of the last query command. 
  377. In case of DELETE it returns also the number of deleted tuples. 
  378. In case of INSERT it returns also the OID of the inserted 
  379. tuple followed by 1 (the number of affected tuples).
  380.     $oid = $result->oidStatus
  381. In case the last query was an INSERT command it returns the oid of the 
  382. inserted tuple. 
  383.     $oid = $result->cmdTuples
  384. In case the last query was an INSERT or DELETE command it returns the 
  385. number of affected tuples. 
  386.     $value = $result->getvalue($tup_num, $field_num)
  387. Returns the value of the given tuple and field. This is 
  388. a null-terminated ASCII string. Binary cursors will not
  389. work. 
  390.     $length = $result->getlength($tup_num, $field_num)
  391. Returns the length of the value for a given tuple and field. 
  392.     $null_status = $result->getisnull($tup_num, $field_num)
  393. Returns the NULL status for a given tuple and field. 
  394.     PQclear($result)
  395. Old style only !
  396. Frees all memory of the given result. 
  397.     $res->fetchrow
  398. New style only ! 
  399. Fetches the next row from the server and returns NULL if all rows 
  400. have been processed. Columns which have NULL as value will be set to C<undef>.
  401.     $result->print($fout, $header, $align, $standard, $html3, $expanded, $pager, $fieldSep, $tableOpt, $caption, ...)
  402. Prints out all the tuples in an intelligent  manner. This function 
  403. differs from the C-counterpart. The struct PQprintOpt has been 
  404. implemented with a list. This list is of variable length, in order 
  405. to care for the character array fieldName in PQprintOpt. 
  406. The arguments $header, $align, $standard, $html3, $expanded, $pager
  407. are boolean flags. The arguments $fieldSep, $tableOpt, $caption
  408. are strings. You may append additional strings, which will be 
  409. taken as replacement for the field names. 
  410.     $result->displayTuples($fp, $fillAlign, $fieldSep, $printHeader, qiet)
  411. Kept for backward compatibility. Use print.
  412.     $result->printTuples($fout, $printAttName, $terseOutput, $width)
  413. Kept for backward compatibility. Use print.
  414. =head2 3. Large Objects
  415. These functions provide file-oriented access to user data. 
  416. The large object interface is modeled after the Unix file 
  417. system interface with analogies of open, close, read, write, 
  418. lseek, tell. In order to get a consistent naming, all function 
  419. names have been prepended with 'PQ' (old style only). 
  420.     $lobj_fd = $conn->lo_open($lobjId, $mode)
  421. Opens an existing large object and returns an object id. 
  422. For the mode bits see lo_create. Returns -1 upon failure. 
  423.     $ret = $conn->lo_close($lobj_fd)
  424. Closes an existing large object. Returns 0 upon success 
  425. and -1 upon failure. 
  426.     $nbytes = $conn->lo_read($lobj_fd, $buf, $len)
  427. Reads $len bytes into $buf from large object $lobj_fd. 
  428. Returns the number of bytes read and -1 upon failure. 
  429.     $nbytes = $conn->lo_write($lobj_fd, $buf, $len)
  430. Writes $len bytes of $buf into the large object $lobj_fd. 
  431. Returns the number of bytes written and -1 upon failure. 
  432.     $ret = $conn->lo_lseek($lobj_fd, $offset, $whence)
  433. Change the current read or write location on the large object 
  434. $obj_id. Currently $whence can only be 0 (L_SET). 
  435.     $lobjId = $conn->lo_creat($mode)
  436. Creates a new large object. $mode is a bit-mask describing 
  437. different attributes of the new object. Use the following constants: 
  438.   - PGRES_INV_SMGRMASK
  439.   - PGRES_INV_ARCHIVE
  440.   - PGRES_INV_WRITE
  441.   - PGRES_INV_READ
  442. Upon failure it returns PGRES_InvalidOid. 
  443.     $location = $conn->lo_tell($lobj_fd)
  444. Returns the current read or write location on the large object 
  445. $lobj_fd. 
  446.     $ret = $conn->lo_unlink($lobjId)
  447. Deletes a large object. Returns -1 upon failure. 
  448.     $lobjId = $conn->lo_import($filename)
  449. Imports a Unix file as large object and returns 
  450. the object id of the new object. 
  451.     $ret = $conn->lo_export($lobjId, $filename)
  452. Exports a large object into a Unix file. 
  453. Returns -1 upon failure, 1 otherwise. 
  454. =head1 AUTHOR
  455.     Edmund Mergl <E.Mergl@bawue.de>
  456. =head1 SEE ALSO
  457. L<libpq>, L<large_objects>
  458. =cut