use strict;
use warnings;
-use base qw/DBIx::Class::Storage::DBI::MultiColumnIn/;
+use base qw/
+ DBIx::Class::Storage::DBI::MultiColumnIn
+ DBIx::Class::Storage::DBI::InsertReturning
+/;
use mro 'c3';
use DBD::Pg qw(:pg_types);
+use Scope::Guard ();
+use Context::Preserve ();
# Ask for a DBD::Pg with array support
-warn "DBD::Pg 2.9.2 or greater is strongly recommended\n"
+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 with_deferred_fk_checks {
my ($self, $sub) = @_;
- $self->_get_dbh->do('SET CONSTRAINTS ALL DEFERRED');
- $sub->();
-}
-
-sub last_insert_id {
- my ($self,$source,@cols) = @_;
-
- my @values;
+ my $txn_scope_guard = $self->txn_scope_guard;
- 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 ($self->_dbh, $seq);
- }
+ $self->_do_query('SET CONSTRAINTS ALL DEFERRED');
+
+ my $sg = Scope::Guard->new(sub {
+ $self->_do_query('SET CONSTRAINTS ALL IMMEDIATE');
+ });
- return @values;
+ return Context::Preserve::preserve_context(sub { $sub->() },
+ after => sub { $txn_scope_guard->commit });
}
-# there seems to be absolutely no reason to have this as a separate method,
-# but leaving intact in case someone is already overriding it
-sub _dbh_last_insert_id {
- my ($self, $dbh, $seq) = @_;
- $dbh->last_insert_id(undef, undef, undef, undef, {sequence => $seq});
-}
+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
+ );
+ return $val;
+}
sub _dbh_get_autoinc_seq {
my ($self, $dbh, $source, $col) = @_;
}
}
-sub _sequence_fetch {
- my ( $self, $type, $seq ) = @_;
- my ($id) = $self->_get_dbh->selectrow_array("SELECT nextval('${seq}')");
- return $id;
-}
-
sub _svp_begin {
my ($self, $name) = @_;