X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FStorage%2FDBI%2FPg.pm;h=36c9c429611cb86540ecc7f757be7c0e1809444f;hb=64ae166780d0cb2b9577e506da9b9b240c146d20;hp=1b5e6d8400e1d60fd339c59856b409e6bb3ab1e6;hpb=38d5ea9f06646beb01422d3d6a2994f1601bf35e;p=dbsrgits%2FDBIx-Class.git diff --git a/lib/DBIx/Class/Storage/DBI/Pg.pm b/lib/DBIx/Class/Storage/DBI/Pg.pm index 1b5e6d8..36c9c42 100644 --- a/lib/DBIx/Class/Storage/DBI/Pg.pm +++ b/lib/DBIx/Class/Storage/DBI/Pg.pm @@ -10,16 +10,20 @@ use mro 'c3'; use DBD::Pg qw(:pg_types); use Scope::Guard (); -use Context::Preserve (); +use Context::Preserve 'preserve_context'; +use namespace::clean; + +__PACKAGE__->sql_limit_dialect ('LimitOffset'); # Ask for a DBD::Pg with array support warn __PACKAGE__.": DBD::Pg 2.9.2 or greater is strongly recommended\n" if ($DBD::Pg::VERSION < 2.009002); # pg uses (used?) version::qv() -sub can_insert_returning { - # FIXME !!! - # pg before 8.2 doesn't support this, need to check version - return 1; +sub _determine_supports_insert_returning { + return shift->_server_info->{normalized_dbms_version} >= 8.002 + ? 1 + : 0 + ; } sub with_deferred_fk_checks { @@ -33,10 +37,10 @@ sub with_deferred_fk_checks { $self->_do_query('SET CONSTRAINTS ALL IMMEDIATE'); }); - return Context::Preserve::preserve_context(sub { $sub->() }, - after => sub { $txn_scope_guard->commit }); + return preserve_context { $sub->() } after => sub { $txn_scope_guard->commit }; } +# only used when INSERT ... RETURNING is disabled sub last_insert_id { my ($self,$source,@cols) = @_; @@ -62,8 +66,7 @@ sub _sequence_fetch { $self->throw_exception('No sequence to fetch') unless $sequence; my ($val) = $self->_get_dbh->selectrow_array( - sprintf "select $function('%s')", - $sequence + sprintf ("select %s('%s')", $function, $sequence) ); return $val; @@ -196,6 +199,23 @@ sub _svp_rollback { $self->_get_dbh->pg_rollback_to($name); } +sub deployment_statements { + my $self = shift;; + my ($schema, $type, $version, $dir, $sqltargs, @rest) = @_; + + $sqltargs ||= {}; + + if ( + ! exists $sqltargs->{producer_args}{postgres_version} + and + my $dver = $self->_server_info->{normalized_dbms_version} + ) { + $sqltargs->{producer_args}{postgres_version} = $dver; + } + + $self->next::method($schema, $type, $version, $dir, $sqltargs, @rest); +} + 1; __END__