X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FStorage%2FDBI%2FPg.pm;h=92153ecf0435746b4adc7ed697e72d2905f64ff3;hb=f1693c0d25bc7b9f3efa50199a13c8b42cd7a056;hp=83659be49a159fbcc1632f591be176a877207e85;hpb=96e1048b78e3f20b219506be9d36968125e47376;p=dbsrgits%2FDBIx-Class.git diff --git a/lib/DBIx/Class/Storage/DBI/Pg.pm b/lib/DBIx/Class/Storage/DBI/Pg.pm index 83659be..92153ec 100644 --- a/lib/DBIx/Class/Storage/DBI/Pg.pm +++ b/lib/DBIx/Class/Storage/DBI/Pg.pm @@ -9,7 +9,7 @@ use mro 'c3'; use DBD::Pg qw(:pg_types); # 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 { @@ -20,15 +20,22 @@ sub with_deferred_fk_checks { } sub last_insert_id { - my ($self,$source,$col) = @_; - my $seq = ( $source->column_info($col)->{sequence} ||= $self->dbh_do('_dbh_get_autoinc_seq', $source, $col) ) - or $self->throw_exception( "could not determine sequence for " - . $source->name - . ".$col, please consider adding a " - . "schema-qualified sequence to its column info" - ); - - $self->_dbh_last_insert_id ($self->_dbh, $seq); + 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 ($self->_dbh, $seq); + } + + return @values; } # there seems to be absolutely no reason to have this as a separate method, @@ -54,22 +61,22 @@ sub _dbh_get_autoinc_seq { ( $schema, $table ) = ( $1, $2 ); } - # use DBD::Pg to fetch the column info if it is recent enough to - # work. otherwise, use custom SQL - my $seq_expr = $DBD::Pg::VERSION > 2.015001 - ? eval{ $dbh->column_info(undef,$schema,$table,$col)->fetchrow_hashref->{COLUMN_DEF} } - : $self->_dbh_get_column_default( $dbh, $schema, $table, $col ); + # get the column default using a Postgres-specific pg_catalog query + my $seq_expr = $self->_dbh_get_column_default( $dbh, $schema, $table, $col ); # if no default value is set on the column, or if we can't parse the # default value as a sequence, throw. - unless ( defined $seq_expr and $seq_expr =~ /^nextval\(+'([^']+)'::(?:text|regclass)\)/i ){ + unless ( defined $seq_expr and $seq_expr =~ /^nextval\(+'([^']+)'::(?:text|regclass)\)/i ) { $seq_expr = '' unless defined $seq_expr; $schema = "$schema." if defined $schema && length $schema; - $self->throw_exception( "no sequence found for $schema$table.$col, check table definition, " - . "or explicitly set the 'sequence' for this column in the " - . $source->source_name - . " class" - ); + $self->throw_exception( sprintf ( + 'no sequence found for %s%s.%s, check the RDBMS table definition or explicitly set the '. + "'sequence' for this column in %s", + $schema ? "$schema." : '', + $table, + $col, + $source->source_name, + )); } return $1; @@ -182,8 +189,8 @@ DBIx::Class::Storage::DBI::Pg - Automatic primary key class for PostgreSQL =head1 SYNOPSIS - # In your table classes - __PACKAGE__->load_components(qw/PK::Auto Core/); + # In your result (table) classes + use base 'DBIx::Class::Core'; __PACKAGE__->set_primary_key('id'); __PACKAGE__->sequence('mysequence');