X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FStorage%2FDBI%2FPg.pm;h=4428b1fff5e7a9acda987b278548c5d2d6d079e4;hb=572338e0c6b2b119362ae59880813b0d5188c62f;hp=46eee6fcacdbd8fd3a35959e7a14383d08f17d8c;hpb=be860760714f5933672f8913d742f6cde6931149;p=dbsrgits%2FDBIx-Class.git diff --git a/lib/DBIx/Class/Storage/DBI/Pg.pm b/lib/DBIx/Class/Storage/DBI/Pg.pm index 46eee6f..4428b1f 100644 --- a/lib/DBIx/Class/Storage/DBI/Pg.pm +++ b/lib/DBIx/Class/Storage/DBI/Pg.pm @@ -5,7 +5,6 @@ use warnings; use base qw/ DBIx::Class::Storage::DBI::MultiColumnIn - DBIx::Class::Storage::DBI::InsertReturning /; use mro 'c3'; @@ -17,13 +16,22 @@ use Context::Preserve (); 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 _supports_insert_returning { + my $self = shift; + + return 1 + if $self->_server_info->{normalized_dbms_version} >= 8.002; + + return 0; +} + sub with_deferred_fk_checks { my ($self, $sub) = @_; my $txn_scope_guard = $self->txn_scope_guard; $self->_do_query('SET CONSTRAINTS ALL DEFERRED'); - + my $sg = Scope::Guard->new(sub { $self->_do_query('SET CONSTRAINTS ALL IMMEDIATE'); }); @@ -32,18 +40,37 @@ sub with_deferred_fk_checks { after => sub { $txn_scope_guard->commit }); } +# only used when INSERT ... RETURNING is disabled +sub last_insert_id { + my ($self,$source,@cols) = @_; + + my @values; + + for my $col (@cols) { + my $seq = ( $source->column_info($col)->{sequence} ||= $self->dbh_do('_dbh_get_autoinc_seq', $source, $col) ) + or $self->throw_exception( sprintf( + 'could not determine sequence for column %s.%s, please consider adding a schema-qualified sequence to its column info', + $source->name, + $col, + )); + + push @values, $self->_dbh->last_insert_id(undef, undef, undef, undef, {sequence => $seq}); + } + + return @values; +} + sub _sequence_fetch { my ($self, $function, $sequence) = @_; $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; -} +} sub _dbh_get_autoinc_seq { my ($self, $dbh, $source, $col) = @_;