Author: byterock
Date: Fri Jan 15 13:08:22 2010
New Revision: 13730
Added:
dbd-oracle/branches/DBDOracle8/Oraperl8.pm
dbd-oracle/branches/DBDOracle8/oraperl8.ph
Modified:
dbd-oracle/branches/DBDOracle8/MANIFEST
dbd-oracle/branches/DBDOracle8/Makefile.PL
dbd-oracle/branches/DBDOracle8/Oracle8.pm
Log:
need these
Modified: dbd-oracle/branches/DBDOracle8/MANIFEST
==============================================================================
--- dbd-oracle/branches/DBDOracle8/MANIFEST (original)
+++ dbd-oracle/branches/DBDOracle8/MANIFEST Fri Jan 15 13:08:22 2010
@@ -2,21 +2,21 @@
MANIFEST
META.yml Module meta-data (added by MakeMaker)
Makefile.PL
-Oracle.ex/README
-Oracle.ex/bind.pl
-Oracle.ex/commit.pl
-Oracle.ex/curref.pl
-Oracle.ex/ex.pl
-Oracle.ex/japh
-Oracle.ex/mktable.pl
-Oracle.ex/oradump.pl
-Oracle.ex/proc.pl
-Oracle.ex/sql
-Oracle.ex/tabinfo.pl
-Oracle.h
-Oracle.pm
-Oracle.xs
-Oraperl.pm
+Oracle8.ex/README
+Oracle8.ex/bind.pl
+Oracle8.ex/commit.pl
+Oracle8.ex/curref.pl
+Oracle8.ex/ex.pl
+Oracle8.ex/japh
+Oracle8.ex/mktable.pl
+Oracle8.ex/oradump.pl
+Oracle8.ex/proc.pl
+Oracle8.ex/sql
+Oracle8.ex/tabinfo.pl
+Oracle8.h
+Oracle8.pm
+Oracle8.xs
+Oraperl8.pm
README
README.aix.txt
README.clients.txt
Modified: dbd-oracle/branches/DBDOracle8/Makefile.PL
==============================================================================
--- dbd-oracle/branches/DBDOracle8/Makefile.PL (original)
+++ dbd-oracle/branches/DBDOracle8/Makefile.PL Fri Jan 15 13:08:22 2010
@@ -1592,11 +1592,11 @@
sub post_initialize {
my $self = shift;
- if (-f "$Config{installprivlib}/DBD/Oraperl.pm"){ # very old now
+ if (-f "$Config{installprivlib}/DBD/Oraperl8.pm"){ # very old now
print "
-Please note: the Oraperl.pm installation location has changed.
-It was: $Config{installprivlib}/DBD/Oraperl.pm
-Is now: $Config{installprivlib}/Oraperl.pm
+Please note: the Oraperl8.pm installation location has changed.
+It was: $Config{installprivlib}/DBD/Oraperl8.pm
+Is now: $Config{installprivlib}/Oraperl8.pm
You have an old copy which you should delete when installing this one.\n";
}
@@ -1604,9 +1604,9 @@
"before running \"make test\" and whenever DBD::Oracle is
used.\n\n"
if $need_ldlp_env && ($ENV{$need_ldlp_env}||'') !~ m:\Q$OH/lib\b:;
- # Ensure Oraperl.pm and oraperl.ph are installed into top lib dir
- $self->{PM}->{'Oraperl.pm'} = '$(INST_LIB)/Oraperl.pm';
- $self->{PM}->{'oraperl.ph'} = '$(INST_LIB)/oraperl.ph';
+ # Ensure Oraperl8.pm and oraperl8.ph are installed into top lib dir
+ $self->{PM}->{'Oraperl8.pm'} = '$(INST_LIB)/Oraperl8.pm';
+ $self->{PM}->{'oraperl8.ph'} = '$(INST_LIB)/oraperl8.ph';
eval { # This chunk is for Oracle::OCI
require Data::Dumper;
Modified: dbd-oracle/branches/DBDOracle8/Oracle8.pm
==============================================================================
--- dbd-oracle/branches/DBDOracle8/Oracle8.pm (original)
+++ dbd-oracle/branches/DBDOracle8/Oracle8.pm Fri Jan 15 13:08:22 2010
@@ -1,4 +1,4 @@
-# Oracle.pm
+# Oracle8.pm
#
# Copyright (c) 1994-2005 Tim Bunce, Ireland
#
Added: dbd-oracle/branches/DBDOracle8/Oraperl8.pm
==============================================================================
--- (empty file)
+++ dbd-oracle/branches/DBDOracle8/Oraperl8.pm Fri Jan 15 13:08:22 2010
@@ -0,0 +1,875 @@
+# Oraperl Emulation Interface for Perl 5 DBD::Oracle8 DBI
+#
+# Oraperl.pm
+#
+# Copyright (c) 1994,1995 Tim Bunce
+#
+# See the COPYRIGHT section in the Oracle.pm file for terms.
+#
+# To use this interface use one of the following invocations:
+#
+# use Oraperl;
+# or
+# eval 'use Oraperl; 1;' || die $@ if $] >= 5;
+#
+# The second form allows oraperl scripts to be used with
+# both oraperl and perl 5.
+
+package Oraperl8;
+
+require 5.004;
+
+use DBI 1.21;
+use Exporter;
+
+$VERSION = substr(q$Revision: 1.44 $, 10);
+
+...@isa = qw(Exporter);
+
+...@export = qw(
+ &ora_login &ora_open &ora_bind &ora_fetch &ora_close
+ &ora_logoff &ora_do &ora_titles &ora_lengths &ora_types
+ &ora_commit &ora_rollback &ora_autocommit &ora_version
+ &ora_readblob
+ $ora_cache $ora_long $ora_trunc $ora_errno $ora_errstr
+ $ora_verno $ora_debug
+);
+
+$debug = 0 unless defined $debug;
+$debugdbi = 0;
+# $safe # set true/false before 'use Oraperl8' if needed.
+$safe = 1 unless defined $safe;
+
+# Help those who get core dumps from non-'safe' Oraperl8 (bad cursors)
+use sigtrap qw(ILL);
+if (!$safe) {
+ $SIG{BUS} = $SIG{SEGV} = sub {
+ print STDERR "Add BEGIN { \$Oraperl8::safe=1 } above 'use Oraperl8'.\n"
+ unless $safe;
+ goto &sigtrap::trap;
+ };
+}
+
+
+# Install Driver (use of install_driver is a special case here)
+$drh = DBI->install_driver('Oracle8');
+if ($drh) {
+ print "DBD::Oracle8 driver installed as $drh\n" if $debug;
+ $drh->trace($debug);
+ $drh->{CompatMode} = 1;
+ $drh->{Warn} = 0;
+}
+
+
+use strict;
+
+sub _func_ref {
+ my $name = shift;
+ my $pkg = ($Oraperl8::safe) ? "DBI" : "DBD::Oracle8";
+ \&{"${pkg}::$name"};
+}
+
+sub _warn {
+ my $prev_warn = shift;
+ if ($_[0] =~ /^(Bad|Duplicate) free/) {
+ return unless $ENV{PERL_DBD_DUMP} eq 'dump';
+ print STDERR "Aborting with a core dump for diagnostics
(PERL_DBD_DUMP)\n";
+ CORE::dump;
+ }
+ $prev_warn ? &$prev_warn(@_) : warn @_;
+}
+
+
+# -----------------------------------------------------------------
+#
+# $lda = &ora_login($system_id, $name, $password)
+# &ora_logoff($lda)
+
+sub ora_login {
+ my($system_id, $name, $password) = @_;
+ local($Oraperl8::prev_warn) = $SIG{'__WARN__'} || 0; # must be local
+ local($SIG{'__WARN__'}) = sub { _warn($Oraperl8::prev_warn, @_) };
+ return DBI->connect("dbi:Oracle:$system_id", $name, $password, {
+ PrintError => 0, AutoCommit => 0
+ });
+}
+sub ora_logoff {
+ my($dbh) = @_;
+ return if !$dbh;
+ local($Oraperl8::prev_warn) = $SIG{'__WARN__'} || 0; # must be local
+ local($SIG{'__WARN__'}) = sub { _warn($Oraperl8::prev_warn, @_) };
+ $dbh->disconnect();
+}
+
+
+
+# -----------------------------------------------------------------
+#
+# $csr = &ora_open($lda, $stmt [, $cache])
+# &ora_bind($csr, $var, ...)
+# &ora_fetch($csr [, $trunc])
+# &ora_do($lda, $stmt)
+# &ora_close($csr)
+
+sub ora_open {
+ my($lda, $stmt) = @_;
+ $Oraperl8::ora_cache_o = $_[2]; # temp hack to pass cache through
+
+ my $csr = $lda->prepare($stmt) or return undef;
+
+ # only execute here if no bind vars specified
+ $csr->execute or return undef unless $csr->{NUM_OF_PARAMS};
+
+ $csr;
+}
+
+*ora_bind = _func_ref('st::execute');
+*ora_fetch = \&{"DBD::Oracle8::st::ora_fetch"};
+*ora_close = _func_ref('st::finish');
+
+sub ora_do {
+ # error => undef
+ # 0 => "0E0" (0 but true)
+ # >0 => >0
+ my($lda, $stmt, @params) = @_; # @params are an extension to the
original Oraperl8.
+
+ return $lda->do($stmt, undef, @params); # SEE DEFAULT METHOD IN DBI.pm
+
+ # OLD CODE:
+ # $csr is local, cursor will be closed on exit
+ my $csr = $lda->prepare($stmt) or return undef;
+ # Oracle OCI will automatically execute DDL statements in prepare()!
+ # We must be carefull not to execute them again! This needs careful
+ # examination and thought.
+ # Perhaps oracle is smart enough not to execute them again?
+ my $ret = $csr->execute(@params);
+ my $rows = $csr->rows;
+ ($rows == 0) ? "0E0" : $rows;
+}
+
+
+# -----------------------------------------------------------------
+#
+# &ora_titles($csr [, $truncate])
+# &ora_lengths($csr)
+# &ora_types($csr)
+
+sub ora_titles{
+ my($csr, $trunc) = @_;
+ warn "ora_titles: truncate option not implemented" if $trunc;
+ @{$csr->{'NAME'}};
+}
+sub ora_lengths{
+ @{shift->{'ora_lengths'}} # oracle specific
+}
+sub ora_types{
+ @{shift->{'ora_types'}} # oracle specific
+}
+
+
+# -----------------------------------------------------------------
+#
+# &ora_commit($lda)
+# &ora_rollback($lda)
+# &ora_autocommit($lda, $on_off)
+# &ora_version
+
+*ora_commit = _func_ref('db::commit');
+*ora_rollback = _func_ref('db::rollback');
+
+sub ora_autocommit {
+ my($lda, $mode) = @_;
+ $lda->{AutoCommit} = $mode;
+ "0E0";
+}
+sub ora_version {
+ my($sw) = DBI->internal;
+ print "\n";
+ print "Oraperl8 emulation interface version $Oraperl8::VERSION\n";
+ print "$Oraperl8::drh->{Attribution}\n";
+ print "$sw->{Attribution}\n\n";
+}
+
+
+# -----------------------------------------------------------------
+#
+# $ora_errno
+# $ora_errstr
+*Oraperl8::ora_errno = \$DBI::err;
+*Oraperl8::ora_errstr = \$DBI::errstr;
+
+
+# -----------------------------------------------------------------
+#
+# $ora_verno
+# $ora_debug not supported, use $h->debug(2) where $h is $lda or $csr
+# $ora_cache not supported
+# $ora_long used at ora_open()
+# $ora_trunc used at ora_open()
+
+$Oraperl8::ora_verno = '3.000'; # to distinguish it from oraperl 2.4
+
+# ora_long is left unset so that the DBI $h->{LongReadLen} attrib will be used
+# by default. If ora_long is set then LongReadLen will be ignored (sadly) but
+# that behaviour may change later to only apply to oraperl mode handles.
+#$Oraperl8::ora_long = 80; # 80, oraperl default
+$Oraperl8::ora_trunc = 0; # long trunc is error, oraperl default
+
+
+# -----------------------------------------------------------------
+#
+# Non-oraperl extensions added here to make it easy to still run
+# script using oraperl (by avoiding $csr->blob_read(...))
+
+*ora_readblob = _func_ref('st::blob_read');
+
+
+1;
+__END__
+
+=head1 NAME
+
+Oraperl8 - Perl access to Oracle databases for old oraperl scripts
+
+=head1 SYNOPSIS
+
+ eval 'use Oraperl8; 1;' || die $@ if $] >= 5; # ADD THIS LINE TO OLD SCRIPTS
+
+ $lda = &ora_login($system_id, $name, $password)
+ $csr = &ora_open($lda, $stmt [, $cache])
+ &ora_bind($csr, $var, ...)
+ &ora_fetch($csr [, $trunc])
+ &ora_close($csr)
+ &ora_logoff($lda)
+
+ &ora_do($lda, $stmt)
+
+ &ora_titles($csr)
+ &ora_lengths($csr)
+ &ora_types($csr)
+ &ora_commit($lda)
+ &ora_rollback($lda)
+ &ora_autocommit($lda, $on_off)
+ &ora_version()
+
+ $ora_cache
+ $ora_long
+ $ora_trunc
+ $ora_errno
+ $ora_errstr
+ $ora_verno
+
+ $ora_debug
+
+=head1 DESCRIPTION
+
+Oraperl8 is an extension to Perl which allows access to Oracle databases.
+
+The original oraperl was a Perl 4 binary with Oracle OCI compiled into it.
+The Perl 5 Oraperl8 module described here is distributed with L<DBD::Oracle>
+(a database driver what operates within L<DBI>) and adds an extra layer over
+L<DBI> method calls.
+The Oraperl8 module should only be used to allow existing Perl 4 oraperl
scripts
+to run with minimal changes; any new development should use L<DBI> directly.
+
+The functions which make up this extension are described in the
+following sections. All functions return a false or undefined (in the
+Perl sense) value to indicate failure. You do not need to understand
+the references to OCI in these descriptions. They are here to help
+those who wish to extend the routines or to port them to new machines.
+
+The text in this document is largely unchanged from the original Perl4
+oraperl manual written by Kevin Stock <[email protected]>. Any comments
+specific to the DBD::Oracle Oraperl8 emulation are prefixed by B<DBD:>.
+See the DBD::Oracle and DBI manuals for more information.
+
+B<DBD:> In order to make the oraperl function definitions available in
+perl5 you need to arrange to 'use' the Oraperl8.pm module in each file
+or package which uses them. You can do this by simply adding S<C<use
+Oraperl8;>> in each file or package. If you need to make the scripts work
+with both the perl4 oraperl and perl5 you should add add the following
+text instead:
+
+ eval 'use Oraperl8; 1;' || die $@ if $] >= 5;
+
+=head2 Principal Functions
+
+The main functions for database access are &ora_login(), &ora_open(),
+&ora_bind(), &ora_fetch(), &ora_close(), &ora_do() and &ora_logoff().
+
+=over 2
+
+=item * ora_login
+
+ $lda = &ora_login($system_id, $username, $password)
+
+In order to access information held within an Oracle database, a
+program must first log in to it by calling the &ora_login() function.
+This function is called with three parameters, the system ID (see
+below) of the Oracle database to be used, and the Oracle username and
+password. The value returned is a login identifier (actually an Oracle
+Login Data Area) referred to below as $lda.
+
+Multiple logins may be active simultaneously. This allows a simple
+mechanism for correlating or transferring data between databases.
+
+Most Oracle programs (for example, SQL*Plus or SQL*Forms) examine the
+environment variable ORACLE_SID or TWO_TASK to determine which database
+to connect to. In an environment which uses several different
+databases, it is easy to make a mistake, and attempt to run a program
+on the wrong one. Also, it is cumbersome to create a program which
+works with more than one database simultaneously. Therefore, Oraperl8
+requires the system ID to be passed as a parameter. However, if the
+system ID parameter is an empty string then oracle will use the
+existing value of ORACLE_SID or TWO_TASK in the usual manner.
+
+Example:
+
+ $lda = &ora_login('personnel', 'scott', 'tiger') || die $ora_errstr;
+
+This function is equivalent to the OCI olon and orlon functions.
+
+B<DBD:> note that a name is assumed to be a TNS alias if it does not
+appear as the name of a SID in /etc/oratab or /var/opt/oracle/oratab.
+See the code in Oracle.pm for the full logic of database name handling.
+
+B<DBD:> Since the returned $lda is a Perl5 reference the database login
+identifier is now automatically released if $lda is overwritten or goes
+out of scope.
+
+=item * ora_open
+
+ $csr = &ora_open($lda, $statement [, $cache])
+
+To specify an SQL statement to be executed, the program must call the
+&ora_open() function. This function takes at least two parameters: a
+login identifier (obtained from &ora_login()) and the SQL statement to
+be executed. An optional third parameter specifies the size of the row
+cache to be used for a SELECT statement. The value returned from
+&ora_open() is a statement identifier (actually an ORACLE Cursor)
+referred to below as $csr.
+
+If the row cache size is not specified, a default size is
+used. As distributed, the default is five rows, but this
+may have been changed at your installation (see the
+&ora_version() function and $ora_cache variable below).
+
+Examples:
+
+ $csr = &ora_open($lda, 'select ename, sal from emp order by ename', 10);
+
+ $csr = &ora_open($lda, 'insert into dept values(:1, :2, :3)');
+
+This function is equivalent to the OCI oopen and oparse functions. For
+statements which do not contain substitution variables (see the section
+Substitution Variables below), it also uses of the oexec function. For
+SELECT statements, it also makes use of the odescr and odefin functions
+to allocate memory for the values to be returned from the database.
+
+=item * ora_bind
+
+ &ora_bind($csr, $var, ...)
+
+If an SQL statement contains substitution variables (see the section
+Substitution Variables below), &ora_bind() is used to assign actual
+values to them. This function takes a statement identifier (obtained
+from &ora_open()) as its first parameter, followed by as many
+parameters as are required by the statement.
+
+Example:
+
+ &ora_bind($csr, 50, 'management', 'Paris');
+
+This function is equivalent to the OCI obndrn and oexec statements.
+
+The OCI obndrn function does not allow empty strings to be bound. As
+distributed, $ora_bind therefore replaces empty strings with a single
+space. However, a compilation option allows this substitution to be
+suppressed, causing &ora_bind() to fail. The output from the
+&ora_version() function specifies which is the case at your installation.
+
+=item * ora_fetch
+
+ $nfields = &ora_fetch($csr)
+
+ @data = &ora_fetch($csr [, $trunc])
+
+The &ora_fetch() function is used in conjunction with a SQL SELECT
+statement to retrieve information from a database. This function takes
+one mandatory parameter, a statement identifier (obtained from
+&ora_open()).
+
+Used in a scalar context, the function returns the number of fields
+returned by the query but no data is actually fetched. This may be
+useful in a program which allows a user to enter a statement interactively.
+
+Example:
+
+ $nfields = &ora_fetch($csr);
+
+Used in an array context, the value returned is an array containing the
+data, one element per field. Note that this will not work as expected:
+
+ @data = &ora_fetch($csr) || die "..."; # WRONG
+
+The || forces a scalar context so ora_fetch returns the number of fields.
+
+An optional second parameter may be supplied to indicate whether the
+truncation of a LONG or LONG RAW field is to be permitted (non-zero) or
+considered an error (zero). If this parameter is not specified, the
+value of the global variable $ora_trunc is used instead. Truncation of
+other datatypes is always considered a error.
+
+B<DBD:> The optional second parameter to ora_fetch is not supported.
+A DBI usage error will be generated if a second parameter is supplied.
+Use the global variable $ora_trunc instead. Also note that the
+experimental DBI blob_read method can be used to retrieve a long:
+
+ $csr->blob_read($field, $offset, $len [, \$dest, $destoffset]);
+
+If truncation occurs, $ora_errno will be set to 1406. &ora_fetch()
+will complete successfully if truncation is permitted, otherwise it
+will fail.
+
+&ora_fetch() will fail at the end of the data or if an error occurs. It
+is possible to distinguish between these cases by testing the value of
+the variable $ora_errno. This will be zero for end of data, non-zero if
+an error has occurred.
+
+Example:
+
+ while (($deptno, $dname, $loc) = &ora_fetch($csr))
+ {
+ warn "Truncated!!!" if $ora_errno == 1406;
+ # do something with the data
+ }
+ warn $ora_errstr if $ora_errno;
+
+This function is equivalent to the OCI ofetch function.
+
+=item * ora_close
+
+ &ora_close($csr)
+
+If an SQL statement is no longer required (for example, all the data
+selected has been processed, or no more rows are to be inserted) then
+the statement identifier should be released. This is done by calling
+the &ora_close() function with the statement identifier as its only
+parameter.
+
+This function is equivalent to the OCI oclose function.
+
+B<DBD:> Since $csr is a Perl5 reference the statement/cursor is now
+automatically closed if $csr is overwritten or goes out of scope.
+
+
+=item * ora_do
+
+ &ora_do($lda, $statement)
+
+Not all SQL statements return data or contain substitution
+variables. In these cases the &ora_do() function may be
+used as an alternative to &ora_open() and &ora_close().
+This function takes two parameters, a login identifier and
+the statement to be executed.
+
+Example:
+
+ &ora_do($lda, 'drop table employee');
+
+This function is roughly equivalent to
+
+ &ora_close( &ora_open($lda, $statement) )
+
+B<DBD:> oraperl v2 used to return the string 'OK' to indicate
+success with a zero numeric value. The Oraperl8 emulation now
+uses the string '0E0' to achieve the same effect since it does
+not cause any C<-w> warnings when used in a numeric context.
+
+=item * ora_logoff
+
+ &ora_logoff($lda)
+
+When the program no longer needs to access a given database, the login
+identifier should be released using the &ora_logoff() function.
+
+This function is equivalent to the OCI ologoff function.
+
+B<DBD:> Since $lda is a Perl5 reference the database login identifier
+is now automatically released if $lda is overwritten or goes out of scope.
+
+=back
+
+=head2 Ancillary Functions
+
+Additional functions available are: &ora_titles(),
+&ora_lengths(), &ora_types(), &ora_autocommit(),
+&ora_commit(), &ora_rollback() and &ora_version().
+
+The first three are of most use within a program which
+allows statements to be entered interactively. See, for
+example, the sample program sql which is supplied with
+Oraperl8 and may have been installed at your site.
+
+=over 2
+
+=item * ora_titles
+
+ @titles = &ora_titles($csr)
+
+A program may determine the field titles of an executed
+query by calling &ora_titles(). This function takes a
+single parameter, a statement identifier (obtained from
+&ora_open()) indicating the query for which the titles are
+required. The titles are returned as an array of strings,
+one for each column.
+
+Titles are truncated to the length of the field, as reported
+by the &ora_lengths() function.
+
+B<DBD:> oraperl v2.2 actually changed the behaviour such that the
+titles were not truncated unless an optional second parameter was
+true. This was not reflected in the oraperl manual. The Oraperl8
+emulation adopts the non truncating behaviour and doesn't support the
+truncate parameter.
+
+
+=item * ora_lengths
+
+ @lengths = &ora_lengths($csr)
+
+A program may determine the length of each of the fields
+returned by a query by calling the &ora_lengths() function.
+This function takes a single parameter, a statement
+identifier (obtained from &ora_open()) indicating the query
+for which the lengths are required. The lengths are
+returned as an array of integers, one for each column.
+
+
+=item * ora_types
+
+ @types = &ora_types($csr)
+
+A program may determine the type of each of the fields returned by a
+query by calling the &ora_types() function. This function takes a
+single parameter, a statement identifier (obtained from &ora_open())
+indicating the query for which the lengths are required. The types are
+returned as an array of integers, one for each field.
+
+These types are defined in your OCI documentation. The correct
+interpretation for Oracle v6 is given in the file oraperl.ph.
+
+
+=item * ora_autocommit
+
+ &ora_autocommit($lda, $on_or_off)
+
+Autocommit mode (in which each transaction is committed immediately,
+without waiting for an explicit commit) may be enabled or disabled
+using &ora_autocommit(). This function takes two parameters, a login
+identifier (obtained from &ora_login()) and a true/false value
+indicating whether autocommit is to be enabled (non-zero) or disabled
+(zero). By default, autocommit is off.
+
+Note that autocommit can only be set per login, not per statement. If
+you need to control autocommit by statement (for example, to allow
+deletions to be rolled back, but insertions to be committed
+immediately) you should make multiple calls to &ora_login() and use a
+separate login identifier for each statement.
+
+
+=item * ora_commit, ora_rollback
+
+ &ora_commit($lda)
+ &ora_rollback($lda)
+
+Modifications to a database may be committed or rolled back using the
+&ora_commit() and &ora_rollback() functions. These functions take a
+single parameter, a login identifier obtained from &ora_login().
+
+Transactions which have been committed (either explicitly by a call to
+&ora_commit() or implicitly through the use of &ora_autocommit())
+cannot be subsequently rolled back.
+
+Note that commit and rollback can only be used per login, not per
+statement. If you need to commit or rollback by statement you should
+make multiple calls to &ora_login() and use a separate login identifier
+for each statement.
+
+
+=item * ora_version
+
+ &ora_version()
+
+The &ora_version() function prints the version number and
+copyright information concerning Oraperl8. It also prints
+the values of various compilation time options. It does not
+return any value, and should not normally be used in a
+program.
+
+Example:
+
+ perl -MOraperl8 -e 'ora_version()'
+
+ This is Oraperl8, version 2, patch level 0.
+
+ Debugging is available, including the -D flag.
+ Default fetch row cache size is 5.
+ Empty bind values are replaced by a space.
+
+ Perl is copyright by Larry Wall; type oraperl -v for details.
+ Additions for oraperl: Copyright 1991, 1992, Kevin Stock.
+
+ Oraperl8 may be distributed under the same conditions as Perl.
+
+This function is the equivalent of Perl's C<-v> flag.
+
+B<DBD:> The Oraperl8 emulation printout is similar but not identical.
+
+=back
+
+=head1 VARIABLES
+
+Six special variables are provided, $ora_cache, $ora_long,
+$ora_trunc, $ora_errno, $ora_errstr and $ora_verno.
+
+=head2 Customisation Variables
+
+These variables are used to dictate the behaviour of Oraperl8
+under certain conditions.
+
+=over 2
+
+=item * $ora_cache
+
+The $ora_cache variable determines the default cache size used by the
+&ora_open() function for SELECT statements if an explicit cache size is
+not given.
+
+It is initialised to the default value reported by &ora_version() but
+may be set within a program to apply to all subsequent calls to
+&ora_open(). Cursors which are already open are not affected. As
+distributed, the default value is five, but may have been altered at
+your installation.
+
+As a special case, assigning zero to $ora_cache resets it to the
+default value. Attempting to set $ora_cache to a negative value results
+in a warning.
+
+
+=item * $ora_long
+
+Normally, Oraperl8 interrogates the database to determine the length of
+each field and allocates buffer space accordingly. This is not
+possible for fields of type LONG or LONGRAW. To allocate space
+according to the maximum possible length (65535 bytes) would obviously
+be extremely wasteful of memory.
+
+Therefore, when &ora_open() determines that a field is a LONG type, it
+allocates the amount of space indicated by the $ora_long variable. This
+is initially set to 80 (for compatibility with Oracle products) but may
+be set within a program to whatever size is required.
+
+$ora_long is only used when fetching data, not when inserting it.
+
+
+=item * $ora_trunc
+
+Since Oraperl8 cannot determine exactly the maximum length of a LONG
+field, it is possible that the length indicated by $ora_long is not
+sufficient to store the data fetched. In such a case, the optional
+second parameter to &ora_fetch() indicates whether the truncation
+should be allowed or should provoke an error.
+
+If this second parameter is not specified, the value of $ora_trunc is
+used as a default. This only applies to LONG and LONGRAW data types.
+Truncation of a field of any other type is always considered an error
+(principally because it indicates a bug in Oraperl8).
+
+=back
+
+=head2 Status Variables
+
+These variables report information about error conditions or about
+Oraperl8 itself. They may only be read; a fatal error occurs if a
+program attempts to change them.
+
+=over 2
+
+=item * $ora_errno
+
+$ora_errno contains the Oracle error code provoked by the last function
+call.
+
+There are two cases of particular interest concerning &ora_fetch(). If
+a LONG or LONGRAW field is truncated (and truncation is allowed) then
+&ora_fetch() will complete successfully but $ora_errno will be set to
+1406 to indicate the truncation. When &ora_fetch() fails, $ora_errno
+will be set to zero if this was due to the end of data or an error code
+if it was due to an actual error.
+
+
+=item * $ora_errstr
+
+The $ora_errstr variable contains the Oracle error message
+corresponding to the current value of $ora_errno.
+
+
+=item * $ora_verno
+
+The $ora_verno variable contains the version number of Oraperl8 in the
+form v.ppp where v is the major version number and ppp is the
+patchlevel. For example, in Oraperl8 version 3, patch level 142,
+$ora_verno would contain the value 3.142 (more or less, allowing for
+floating point error).
+
+=back
+
+
+=head1 SUBSTITUTION VARIABLES
+
+Oraperl8 allows an SQL statement to contain substitution variables.
+These consist of a colon followed by a number. For example, a program
+which added records to a telephone list might use the following call to
+&ora_open():
+
+ $csr = &ora_open($csr, "insert into telno values(:1, :2)");
+
+The two names :1 and :2 are called substitution variables. The
+function &ora_bind() is used to assign values to these variables. For
+example, the following statements would add two new people to the
+list:
+
+ &ora_bind($csr, "Annette", "472-8836");
+ &ora_bind($csr, "Brian", "937-1823");
+
+Note that the substitution variables must be assigned consecutively
+beginning from 1 for each SQL statement, as &ora_bind() assigns its
+parameters in this order. Named substitution variables (for example,
+:NAME, :TELNO) are not permitted.
+
+B<DBD:> Substitution variables are now bound as type 1 (VARCHAR2)
+and not type 5 (STRING) by default. This can alter the behaviour of
+SQL code which compares a char field with a substitution variable.
+See the String Comparison section in the Datatypes chapter of the
+Oracle OCI manual for more details.
+
+You can work around this by using DBD::Oracle's ability to specify
+the Oracle type to be used on a per field basis:
+
+ $char_attrib = { ora_type => 5 }; # 5 = STRING (ala oraperl2.4)
+ $csr = ora_open($dbh, "select foo from bar where x=:1 and y=:2");
+ $csr->bind_param(1, $value_x, $char_attrib);
+ $csr->bind_param(2, $value_y, $char_attrib);
+ ora_bind($csr); # bind with no parameters since we've done bind_param()'s
+
+
+=head1 DEBUGGING
+
+B<DBD:> The Oraperl8 $ora_debug variable is not supported. However
+detailed debugging can be enabled at any time by executing
+
+ $h->debug(2);
+
+where $h is either a $lda or a $csr. If debugging is enabled on an
+$lda then it is automatically passed on to any cursors returned by
+&ora_open().
+
+=head1 EXAMPLE
+
+ format STDOUT_TOP =
+ Name Phone
+ ==== =====
+ .
+
+ format STDOUT =
+ @<<<<<<<<<< @>>>>>>>>>>
+ $name, $phone
+ .
+
+ die "You should use oraperl, not perl\n" unless defined &ora_login;
+ $ora_debug = shift if $ARGV[0] =~ /^\-#/;
+
+ $lda = &ora_login('t', 'kstock', 'kstock')
+ || die $ora_errstr;
+ $csr = &ora_open($lda, 'select * from telno order by name')
+ || die $ora_errstr;
+
+ $nfields = &ora_fetch($csr);
+ print "Query will return $nfields fields\n\n";
+
+ while (($name, $phone) = &ora_fetch($csr)) { write; }
+ warn $ora_errstr if $ora_errno;
+
+ die "fetch error: $ora_errstr" if $ora_errno;
+
+ do ora_close($csr) || die "can't close cursor";
+ do ora_logoff($lda) || die "can't log off Oracle";
+
+
+=head1 NOTES
+
+In keeping with the philosophy of Perl, there is no pre-defined limit
+to the number of simultaneous logins or SQL statements which may be
+active, nor to the number of data fields which may be returned by a
+query. The only limits are those imposed by the amount of memory
+available, or by Oracle.
+
+
+=head1 WARNINGS
+
+The Oraperl8 emulation software shares no code with the original
+oraperl. It is built on top of the new Perl5 DBI and DBD::Oracle
+modules. These modules are still evolving. (One of the goals of
+the Oraperl8 emulation software is to allow useful work to be done
+with the DBI and DBD::Oracle modules whilst insulating users from
+the ongoing changes in their interfaces.)
+
+It is quite possible, indeed probable, that some differences in
+behaviour will exist. These are probably confined to error handling.
+
+B<All> differences in behaviour which are not documented here should be
+reported to to [email protected].
+
+
+=head1 SEE ALSO
+
+=over 2
+
+=item Oracle Documentation
+
+SQL Language Reference Manual.
+Programmer's Guide to the Oracle Call Interfaces.
+
+=item Books
+
+Programming Perl by Larry Wall and Randal Schwartz.
+Learning Perl by Randal Schwartz.
+
+=item Manual Pages
+
+perl(1)
+
+=back
+
+=head1 AUTHOR
+
+Original Oraperl8 2.4 code and documentation
+by Kevin Stock <[email protected]>.
+
+DBI and Oraperl8 emulation using DBD::Oracle by Tim Bunce.
+
+=head1 MAINTAINER
+
+As of DBD::Oracle release 1.17 in February 2006 The Pythian Group, Inc.
+(L<http://www.pythian.com>) are taking the lead in maintaining DBD::Oracle with
+my assistance and gratitude.
+
+=head1 COPYRIGHT
+
+Copyright (c) 1994-2006 Tim Bunce. Ireland.
+
+The DBD::Oracle module is free open source software; you can
+redistribute it and/or modify it under the same terms as Perl 5.
+
+=cut
Added: dbd-oracle/branches/DBDOracle8/oraperl8.ph
==============================================================================
--- (empty file)
+++ dbd-oracle/branches/DBDOracle8/oraperl8.ph Fri Jan 15 13:08:22 2010
@@ -0,0 +1,53 @@
+# DBD::Oracle Oraperl emulation. This file is not relevant to the
+# emulation but is included for completeness only.
+# I have updated %ora_types in case it's used. Tim Bunce.
+
+# oraperl.ph
+#
+# Various constants which may be useful in oraperl programs
+#
+# Author: Kevin Stock
+# Date: 28th October 1991
+# Last Change: 8th April 1992
+
+
+# Oraperl error codes, set in $ora_errno
+
+$ORAP_NOMEM = 100001; # out of memory
+$ORAP_INVCSR = 100002; # invalid cursor supplied
+$ORAP_INVLDA = 100003; # invalid lda supplied
+$ORAP_NOSID = 100004; # couldn't set ORACLE_SID
+$ORAP_BADVAR = 100005; # bad colon variable sequence
+$ORAP_NUMVARS = 100006; # wrong number of colon variables
+$ORAP_NODATA = 100007; # statement does not return data
+
+
+# Oraperl debugging codes for $ora_debug
+# From version 2, you shouldn't really use these.
+
+$ODBG_EXEC = 8; # program execution
+$ODBG_STRNUM = 32; # string/numeric conversions
+$ODBG_MALLOC = 128; # memory allocation/release
+
+# Oracle datatypes
+# I don't know whether these are valid for all versions.
+
+%ora_types =
+(
+ 1, 'character array',
+ 2, 'number',
+ 3, 'signed integer',
+ 4, 'float',
+ 7, 'packed decimal',
+ 8, 'long string',
+ 9, 'varchar',
+ 11, 'rowid',
+ 12, 'date',
+ 15, 'varraw',
+ 23, 'raw',
+ 24, 'long raw',
+ 96, 'char',
+ 106,'mlslabel',
+);
+
+1;