aboutsummaryrefslogtreecommitdiff
path: root/src/interfaces/perl5/Pg.pm
diff options
context:
space:
mode:
authorEdmund Mergl <E.Mergl@bawue.de>1997-04-29 19:37:10 +0000
committerEdmund Mergl <E.Mergl@bawue.de>1997-04-29 19:37:10 +0000
commit0aba92a2c5684ec141ba3dfcab808d86cd7c2882 (patch)
tree97457fb3a29967b3bd6ea4e7e96b25ceeb932e4b /src/interfaces/perl5/Pg.pm
parenta2fd844c3bb7076874baf6ecb96528cb81b33640 (diff)
downloadpostgresql-0aba92a2c5684ec141ba3dfcab808d86cd7c2882.tar.gz
postgresql-0aba92a2c5684ec141ba3dfcab808d86cd7c2882.zip
creation for postgresql-6.1
Diffstat (limited to 'src/interfaces/perl5/Pg.pm')
-rw-r--r--src/interfaces/perl5/Pg.pm534
1 files changed, 534 insertions, 0 deletions
diff --git a/src/interfaces/perl5/Pg.pm b/src/interfaces/perl5/Pg.pm
new file mode 100644
index 00000000000..adff08d53ec
--- /dev/null
+++ b/src/interfaces/perl5/Pg.pm
@@ -0,0 +1,534 @@
+#-------------------------------------------------------
+#
+# $Id: Pg.pm,v 1.1.1.1 1997/04/29 19:37:10 mergl Exp $
+#
+# Copyright (c) 1997 Edmund Mergl
+#
+#-------------------------------------------------------
+
+package Pg;
+
+use strict;
+use Carp;
+use vars qw($VERSION @ISA @EXPORT $AUTOLOAD);
+
+require Exporter;
+require DynaLoader;
+require AutoLoader;
+require 5.003;
+
+@ISA = qw(Exporter DynaLoader);
+
+# Items to export into callers namespace by default.
+@EXPORT = qw(
+ PQconnectdb
+ PQconndefaults
+ PQsetdb
+ PQfinish
+ PQreset
+ PQdb
+ PQuser
+ PQhost
+ PQoptions
+ PQport
+ PQtty
+ PQstatus
+ PQerrorMessage
+ PQtrace
+ PQuntrace
+ PQexec
+ PQgetline
+ PQendcopy
+ PQputline
+ PQnotifies
+ PQresultStatus
+ PQntuples
+ PQnfields
+ PQfname
+ PQfnumber
+ PQftype
+ PQfsize
+ PQcmdStatus
+ PQoidStatus
+ PQgetvalue
+ PQgetlength
+ PQgetisnull
+ PQclear
+ PQprintTuples
+ PQprint
+ PQlo_open
+ PQlo_close
+ PQlo_read
+ PQlo_write
+ PQlo_lseek
+ PQlo_creat
+ PQlo_tell
+ PQlo_unlink
+ PQlo_import
+ PQlo_export
+ PGRES_CONNECTION_OK
+ PGRES_CONNECTION_BAD
+ PGRES_EMPTY_QUERY
+ PGRES_COMMAND_OK
+ PGRES_TUPLES_OK
+ PGRES_COPY_OUT
+ PGRES_COPY_IN
+ PGRES_BAD_RESPONSE
+ PGRES_NONFATAL_ERROR
+ PGRES_FATAL_ERROR
+ PGRES_INV_SMGRMASK
+ PGRES_INV_ARCHIVE
+ PGRES_INV_WRITE
+ PGRES_INV_READ
+ PGRES_InvalidOid
+);
+
+$VERSION = '1.6.0';
+
+sub AUTOLOAD {
+ # This AUTOLOAD is used to 'autoload' constants from the constant()
+ # XS function. If a constant is not found then control is passed
+ # to the AUTOLOAD in AutoLoader.
+
+ my $constname;
+ ($constname = $AUTOLOAD) =~ s/.*:://;
+ my $val = constant($constname, @_ ? $_[0] : 0);
+ if ($! != 0) {
+ if ($! =~ /Invalid/) {
+ $AutoLoader::AUTOLOAD = $AUTOLOAD;
+ goto &AutoLoader::AUTOLOAD;
+ }
+ else {
+ croak "Your vendor has not defined Pg macro $constname";
+ }
+ }
+ eval "sub $AUTOLOAD { $val }";
+ goto &$AUTOLOAD;
+}
+
+bootstrap Pg $VERSION;
+
+sub doQuery {
+
+ my $conn = shift;
+ my $query = shift;
+ my $array_ref = shift;
+
+ my ($result, $status, $nfields, $ntuples, $i, $j);
+
+ $result = PQexec($conn, $query);
+ $status = PQresultStatus($result);
+ return($status) if (2 != $status);
+
+ $nfields = PQnfields($result);
+ $ntuples = PQntuples($result);
+ for ($i=0; $i < $ntuples; $i++) {
+ for ($j=0; $j < $nfields; $j++) {
+ $$array_ref[$i][$j] = PQgetvalue($result, $i, $j);
+ }
+ }
+
+ PQclear($result);
+
+ return 1;
+}
+
+1;
+
+__END__
+
+
+=head1 NAME
+
+Pg - Perl extension for PostgreSQL
+
+
+=head1 SYNOPSIS
+
+new style:
+
+ use Pg;
+ $conn = Pg::connectdb("dbname = template1");
+ $result = $conn->exec("create database test");
+
+
+you may also use the old style:
+
+ use Pg;
+ $conn = PQsetdb('', '', '', '', template1);
+ $result = PQexec($conn, "create database test");
+ PQclear($result);
+ PQfinish($conn);
+
+
+=head1 DESCRIPTION
+
+The Pg module permits you to access all functions of the
+Libpq interface of PostgreSQL. Libpq is the programmer's
+interface to PostgreSQL. Pg tries to resemble this
+interface as close as possible. For examples of how to
+use this module, look at the file test.pl. For further
+examples look at the Libpq applications in
+../src/test/examples and ../src/test/regress.
+
+You have the choice between the old C-style and a
+new, more Perl-ish style. The old style has the
+benefit, that existing Libpq applications can be
+ported to perl just by prepending every variable
+with a '$'. The new style uses class packages and
+might be more familiar for C++-programmers.
+
+
+=head1 GUIDELINES
+
+=head2 new style
+
+The new style uses blessed references as objects.
+After creating a new connection or result object,
+the relevant Libpq functions serve as virtual methods.
+One benefit of the new style: you do not have to care
+about freeing the connection- and result-structures.
+Perl calls the destructor whenever the last reference
+to an object goes away.
+
+=head2 old style
+
+All functions and constants are imported into the calling
+packages namespace. In order to to get a uniform naming,
+all functions start with 'PQ' (e.g. PQlo_open) and all
+constants start with 'PGRES_' (e.g. PGRES_CONNECTION_OK).
+
+There are two functions, which allocate memory, that has
+to be freed by the user:
+
+ PQsetdb, use PQfinish to free memory.
+ PQexec, use PQclear to free memory.
+
+
+Pg.pm contains one convenience function: doQuery. It fills a
+two-dimensional array with the result of your query. Usage:
+
+ Pg::doQuery($conn, "select attr1, attr2 from tbl", \@ary);
+
+ for $i ( 0 .. $#ary ) {
+ for $j ( 0 .. $#{$ary[$i]} ) {
+ print "$ary[$i][$j]\t";
+ }
+ print "\n";
+ }
+
+Notice the inner loop !
+
+
+=head1 CAVEATS
+
+There are few exceptions, where the perl-functions differs
+from the C-counterpart: PQprint, PQnotifies and PQconndefaults.
+These functions deal with structures, which have been
+implemented in perl using lists or hash.
+
+
+=head1 FUNCTIONS
+
+The functions have been divided into three sections:
+Connection, Result, Large Objects.
+
+
+=head2 1. Connection
+
+With these functions you can establish and close a connection to a
+database. In Libpq a connection is represented by a structure called
+PGconn. Using the appropriate methods you can access almost all
+fields of this structure.
+
+ $conn = Pg::setdb($pghost, $pgport, $pgoptions, $pgtty, $dbname)
+
+Opens a new connection to the backend. You may use an empty string for
+any argument, in which case first the environment is checked and then
+hardcoded defaults are used. The connection identifier $conn ( a pointer
+to the PGconn structure ) must be used in subsequent commands for unique
+identification. Before using $conn you should call $conn->status to ensure,
+that the connection was properly made. Use the methods below to access
+the contents of the PGconn structure.
+
+ $conn = Pg::connectdb("option = value")
+
+Opens a new connection to the backend using connection information in a string.
+The connection identifier $conn ( a pointer to the PGconn structure ) must be
+used in subsequent commands for unique identification. Before using $conn you
+should call $conn->status to ensure, that the connection was properly made.
+Use the methods below to access the contents of the PGconn structure.
+
+ $Option_ref = Pg::conndefaults()
+
+ while(($key, $val) = each %$Option_ref) {
+ print "$key, $val\n";
+ }
+
+Returns a reference to a hash containing as keys all possible options for
+connectdb(). The values are the current defaults. This function differs from
+his C-counterpart, which returns the complete conninfoOption structure.
+
+ PQfinish($conn)
+
+Old style only !
+Closes the connection to the backend and frees all memory.
+
+ $conn->reset
+
+Resets the communication port with the backend and tries
+to establish a new connection.
+
+ $dbname = $conn->db
+
+Returns the database name of the connection.
+
+ $pguser = $conn->user
+
+Returns the Postgres user name of the connection.
+
+ $pghost = $conn->host
+
+Returns the host name of the connection.
+
+ $pgoptions = $conn->options
+
+Returns the options used in the connection.
+
+ $pgport = $conn->port
+
+Returns the port of the connection.
+
+ $pgtty = $conn->tty
+
+Returns the tty of the connection.
+
+ $status = $conn->status
+
+Returns the status of the connection. For comparing the status
+you may use the following constants:
+
+ - PGRES_CONNECTION_OK
+ - PGRES_CONNECTION_BAD
+
+ $errorMessage = $conn->errorMessage
+
+Returns the last error message associated with this connection.
+
+ $conn->trace(debug_port)
+
+Messages passed between frontend and backend are echoed to the
+debug_port file stream.
+
+ $conn->untrace
+
+Disables tracing.
+
+ $result = $conn->exec($query)
+
+Submits a query to the backend. The return value is a pointer to
+the PGresult structure, which contains the complete query-result
+returned by the backend. In case of failure, the pointer points
+to an empty structure. In this, the perl implementation differs
+from the C-implementation. Using the old style, even the empty
+structure has to be freed using PQfree. Before using $result you
+should call resultStatus to ensure, that the query was
+properly executed.
+
+ $ret = $conn->getline($string, $length)
+
+Reads a string up to $length - 1 characters from the backend.
+getline returns EOF at EOF, 0 if the entire line has been read,
+and 1 if the buffer is full. If a line consists of the two
+characters "\." the backend has finished sending the results of
+the copy command.
+
+ $conn->putline($string)
+
+Sends a string to the backend. The application must explicitly
+send the two characters "\." to indicate to the backend that
+it has finished sending its data.
+
+ $ret = $conn->endcopy
+
+This function waits until the backend has finished the copy.
+It should either be issued when the last string has been sent
+to the backend using putline or when the last string has
+been received from the backend using getline. endcopy returns
+0 on success, nonzero otherwise.
+
+ ($table, $pid) = $conn->notifies
+
+Checks for asynchronous notifications. This functions differs from
+the C-counterpart which returns a pointer to a new allocated structure,
+whereas the perl implementation returns a list. $table is the table
+which has been listened to and $pid is the process id of the backend.
+
+
+=head2 2. Result
+
+With these functions you can send commands to a database and
+investigate the results. In Libpq the result of a command is
+represented by a structure called PGresult. Using the appropriate
+methods you can access almost all fields of this structure.
+
+Use the functions below to access the contents of the PGresult structure.
+
+ $ntups = $result->ntuples
+
+Returns the number of tuples in the query result.
+
+ $nfields = $result->nfields
+
+Returns the number of fields in the query result.
+
+ $fname = $result->fname($field_num)
+
+Returns the field name associated with the given field number.
+
+ $fnumber = $result->fnumber($field_name)
+
+Returns the field number associated with the given field name.
+
+ $ftype = $result->ftype($field_num)
+
+Returns the oid of the type of the given field number.
+
+ $fsize = $result->fsize($field_num)
+
+Returns the size in bytes of the type of the given field number.
+It returns -1 if the field has a variable length.
+
+ $value = $result->getvalue($tup_num, $field_num)
+
+Returns the value of the given tuple and field. This is
+a null-terminated ASCII string. Binary cursors will not
+work.
+
+ $length = $result->getlength($tup_num, $field_num)
+
+Returns the length of the value for a given tuple and field.
+
+ $null_status = $result->getisnull($tup_num, $field_num)
+
+Returns the NULL status for a given tuple and field.
+
+ $result_status = $result->resultStatus
+
+Returns the status of the result. For comparing the status you
+may use one of the following constants depending upon the
+command executed:
+
+ - PGRES_EMPTY_QUERY
+ - PGRES_COMMAND_OK
+ - PGRES_TUPLES_OK
+ - PGRES_COPY_OUT
+ - PGRES_COPY_IN
+ - PGRES_BAD_RESPONSE
+ - PGRES_NONFATAL_ERROR
+ - PGRES_FATAL_ERROR
+
+ $cmdStatus = $result->cmdStatus
+
+Returns the command status of the last query command.
+
+ $oid = $result->oidStatus
+
+In case the last query was an INSERT command it returns the oid of the
+inserted tuple.
+
+ $result->printTuples($fout, $printAttName, $terseOutput, $width)
+
+Kept for backward compatibility. Use print.
+
+ $result->print($fout, $header, $align, $standard, $html3, $expanded, $pager, $fieldSep, $tableOpt, $caption, ...)
+
+Prints out all the tuples in an intelligent manner. This function
+differs from the C-counterpart. The struct PQprintOpt has been
+implemented with a list. This list is of variable length, in order
+to care for the character array fieldName in PQprintOpt.
+The arguments $header, $align, $standard, $html3, $expanded, $pager
+are boolean flags. The arguments $fieldSep, $tableOpt, $caption
+are strings. You may append additional strings, which will be
+taken as replacement for the field names.
+
+ PQclear($result)
+
+Old style only !
+Frees all memory of the given result.
+
+
+=head2 3. Large Objects
+
+These functions provide file-oriented access to user data.
+The large object interface is modeled after the Unix file
+system interface with analogues of open, close, read, write,
+lseek, tell. In order to get a consistent naming, all function
+names have been prepended with 'PQ' (old style only).
+
+ $lobjId = $conn->lo_creat($mode)
+
+Creates a new large object. $mode is a bitmask describing
+different attributes of the new object. Use the following constants:
+
+ - PGRES_INV_SMGRMASK
+ - PGRES_INV_ARCHIVE
+ - PGRES_INV_WRITE
+ - PGRES_INV_READ
+
+Upon failure it returns PGRES_InvalidOid.
+
+ $ret = $conn->lo_unlink($lobjId)
+
+Deletes a large object. Returns -1 upon failure.
+
+ $lobj_fd = $conn->lo_open($lobjId, $mode)
+
+Opens an existing large object and returns an object id.
+For the mode bits see lo_create. Returns -1 upon failure.
+
+ $ret = $conn->lo_close($lobj_fd)
+
+Closes an existing large object. Returns 0 upon success
+and -1 upon failure.
+
+ $nbytes = $conn->lo_read($lobj_fd, $buf, $len)
+
+Reads $len bytes into $buf from large object $lobj_fd.
+Returns the number of bytes read and -1 upon failure.
+
+ $nbytes = $conn->lo_write($lobj_fd, $buf, $len)
+
+Writes $len bytes of $buf into the large object $lobj_fd.
+Returns the number of bytes written and -1 upon failure.
+
+ $ret = $conn->lo_lseek($lobj_fd, $offset, $whence)
+
+Change the current read or write location on the large object
+$obj_id. Currently $whence can only be 0 (L_SET).
+
+ $location = $conn->lo_tell($lobj_fd)
+
+Returns the current read or write location on the large object
+$lobj_fd.
+
+ $lobjId = $conn->lo_import($filename)
+
+Imports a Unix file as large object and returns
+the object id of the new object.
+
+ $ret = $conn->lo_export($lobjId, $filename)
+
+Exports a large object into a Unix file.
+Returns -1 upon failure, 1 otherwise.
+
+
+=head1 AUTHOR
+
+ Edmund Mergl <E.Mergl@bawue.de>
+
+=head1 SEE ALSO
+
+libpq(3), large_objects(3).
+
+=cut