X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FStorage%2FDBI%2FOracle%2FGeneric.pm;h=925d7f980c0829f58c353b817f3f806cd5d3f169;hb=1816be4f51709d94945380c0a65de80e5606b162;hp=15f2a4543e0c9239673d39ded40e1addc964cbc5;hpb=d2a3958e111673a0fd1a8f3a6d81700e5d351140;p=dbsrgits%2FDBIx-Class.git diff --git a/lib/DBIx/Class/Storage/DBI/Oracle/Generic.pm b/lib/DBIx/Class/Storage/DBI/Oracle/Generic.pm index 15f2a45..925d7f9 100644 --- a/lib/DBIx/Class/Storage/DBI/Oracle/Generic.pm +++ b/lib/DBIx/Class/Storage/DBI/Oracle/Generic.pm @@ -5,7 +5,7 @@ use warnings; =head1 NAME -DBIx::Class::Storage::DBI::Oracle::Generic - Automatic primary key class for Oracle +DBIx::Class::Storage::DBI::Oracle::Generic - Oracle Support for DBIx::Class =head1 SYNOPSIS @@ -24,7 +24,7 @@ This class implements autoincrements for Oracle. =cut use base qw/DBIx::Class::Storage::DBI/; -use Carp::Clan qw/^DBIx::Class/; +use mro 'c3'; # For ORA_BLOB => 113, ORA_CLOB => 112 use DBD::Oracle qw( :ora_types ); @@ -52,7 +52,7 @@ sub _dbh_get_autoinc_seq { }; # trigger_body is a LONG - $dbh->{LongReadLen} = 64 * 1024 if ($dbh->{LongReadLen} < 64 * 1024); + local $dbh->{LongReadLen} = 64 * 1024 if ($dbh->{LongReadLen} < 64 * 1024); my $sth; @@ -83,36 +83,18 @@ sub _sequence_fetch { return $id; } -=head2 connected - -Returns true if we have an open (and working) database connection, false if it is not (yet) -open (or does not work). (Executes a simple SELECT to make sure it works.) - -The reason this is needed is that L's ping() does not do a real -OCIPing but just gets the server version, which doesn't help if someone killed -your session. - -=cut - -sub connected { +sub _ping { my $self = shift; - if (not $self->next::method(@_)) { - return 0; - } - else { - my $dbh = $self->_dbh; + my $dbh = $self->_dbh or return 0; - local $dbh->{RaiseError} = 1; + local $dbh->{RaiseError} = 1; - eval { - my $ping_sth = $dbh->prepare_cached("select 1 from dual"); - $ping_sth->execute; - $ping_sth->finish; - }; + eval { + $dbh->do("select 1 from dual"); + }; - return $@ ? 0 : 1; - } + return $@ ? 0 : 1; } sub _dbh_execute { @@ -157,7 +139,7 @@ Returns the sequence name for an autoincrement column sub get_autoinc_seq { my ($self, $source, $col) = @_; - + $self->dbh_do('_dbh_get_autoinc_seq', $source, $col); } @@ -183,27 +165,36 @@ L. sub datetime_parser_type { return "DateTime::Format::Oracle"; } -=head2 connect_call_set_datetime_format +=head2 connect_call_datetime_setup Used as: - on_connect_call => 'set_datetime_format' + on_connect_call => 'datetime_setup' -In L to set the session nls date, -and timestamp values for use with -L. As well as the necessary environment -variables for L. +In L to set the session nls date, and +timestamp values for use with L and the +necessary environment variables for L, which is used +by it. -Maximum allowable precision is used. +Maximum allowable precision is used, unless the environment variables have +already been set. -C is also initialized but is not currently used by -L. +These are the defaults used: + + $ENV{NLS_DATE_FORMAT} ||= 'YYYY-MM-DD HH24:MI:SS'; + $ENV{NLS_TIMESTAMP_FORMAT} ||= 'YYYY-MM-DD HH24:MI:SS.FF'; + $ENV{NLS_TIMESTAMP_TZ_FORMAT} ||= 'YYYY-MM-DD HH24:MI:SS.FF TZHTZM'; + +To get more than second precision with L +for your timestamps, use something like this: + + use Time::HiRes 'time'; + my $ts = DateTime->from_epoch(epoch => time); =cut -sub connect_call_set_datetime_format { +sub connect_call_datetime_setup { my $self = shift; - my $dbh = $self->dbh; my $date_format = $ENV{NLS_DATE_FORMAT} ||= 'YYYY-MM-DD HH24:MI:SS'; my $timestamp_format = $ENV{NLS_TIMESTAMP_FORMAT} ||= @@ -211,15 +202,11 @@ sub connect_call_set_datetime_format { my $timestamp_tz_format = $ENV{NLS_TIMESTAMP_TZ_FORMAT} ||= 'YYYY-MM-DD HH24:MI:SS.FF TZHTZM'; - $dbh->do("alter session set nls_date_format = '$date_format'"); - $dbh->do("alter session set nls_timestamp_format = '$timestamp_format'"); - $dbh->do("alter session set nls_timestamp_tz_format = '$timestamp_tz_format'"); -} - -sub _svp_begin { - my ($self, $name) = @_; - - $self->dbh->do("SAVEPOINT $name"); + $self->_do_query("alter session set nls_date_format = '$date_format'"); + $self->_do_query( +"alter session set nls_timestamp_format = '$timestamp_format'"); + $self->_do_query( +"alter session set nls_timestamp_tz_format='$timestamp_tz_format'"); } =head2 source_bind_attributes @@ -264,6 +251,12 @@ sub source_bind_attributes return \%bind_attributes; } +sub _svp_begin { + my ($self, $name) = @_; + + $self->dbh->do("SAVEPOINT $name"); +} + # Oracle automatically releases a savepoint when you start another one with the # same name. sub _svp_release { 1 } @@ -274,11 +267,9 @@ sub _svp_rollback { $self->dbh->do("ROLLBACK TO SAVEPOINT $name") } -=head1 AUTHORS - -Andy Grundman +=head1 AUTHOR -Scott Connelly +See L. =head1 LICENSE