[Bast-commits] r7560 - DBIx-Class/0.08/branches/pg_unqualified_schema/lib/DBIx/Class/Storage/DBI

rbuels at dev.catalyst.perl.org rbuels at dev.catalyst.perl.org
Fri Sep 4 17:43:01 GMT 2009


Author: rbuels
Date: 2009-09-04 17:43:00 +0000 (Fri, 04 Sep 2009)
New Revision: 7560

Modified:
   DBIx-Class/0.08/branches/pg_unqualified_schema/lib/DBIx/Class/Storage/DBI/Pg.pm
Log:
refactored how Pg storage driver calls sequence search, made erorror message more informative when query into pg_catalog fails

Modified: DBIx-Class/0.08/branches/pg_unqualified_schema/lib/DBIx/Class/Storage/DBI/Pg.pm
===================================================================
--- DBIx-Class/0.08/branches/pg_unqualified_schema/lib/DBIx/Class/Storage/DBI/Pg.pm	2009-09-04 17:42:52 UTC (rev 7559)
+++ DBIx-Class/0.08/branches/pg_unqualified_schema/lib/DBIx/Class/Storage/DBI/Pg.pm	2009-09-04 17:43:00 UTC (rev 7560)
@@ -21,7 +21,7 @@
 
 sub last_insert_id {
   my ($self,$source,$col) = @_;
-  my $seq = ($source->column_info($col)->{sequence} ||= $self->get_autoinc_seq($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 "
@@ -40,12 +40,24 @@
 
 
 sub _dbh_get_autoinc_seq {
-  my ($self, $dbh, $schema, $table, $col) = @_;
+  my ($self, $dbh, $source, $col) = @_;
 
+  my $schema;
+  my $table = $source->name;
+
+  # deref table name if it needs it
+  $table = $$table
+      if ref $table eq 'SCALAR';
+
+  # parse out schema name if present
+  if( $table =~ /^(.+)\.(.+)$/ ) {
+    ( $schema, $table ) = ( $1, $2 );
+  }
+
   my $sqlmaker = $self->sql_maker;
   local $sqlmaker->{bindtype} = 'normal';
 
-  my ($where, @bind) = $self->sql_maker->where ({
+  my ($where, @bind) = $sqlmaker->where ({
     'a.attnum' => {'>', 0},
     'c.relname' => $table,
     'a.attname' => $col,
@@ -62,15 +74,23 @@
    FROM pg_catalog.pg_attrdef d
    WHERE d.adrelid = a.attrelid AND d.adnum = a.attnum AND a.atthasdef)
 FROM pg_catalog.pg_class c
-     JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
+     LEFT JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
      JOIN pg_catalog.pg_attribute a ON a.attrelid = c.oid
 $where
 
 EOS
 
-  unless (defined $seq_expr && $seq_expr =~ /^nextval\(+'([^']+)'::(?:text|regclass)\)/i ){
+  defined $seq_expr and length $seq_expr
+      or $self->throw_exception( "no sequence found for $table.$col, check table definition, "
+                                 . "or explicitly set the 'sequence' for this column in the "
+                                 . $source->source_name
+                                 . " class"
+                               );
+
+  unless ( $seq_expr =~ /^nextval\(+'([^']+)'::(?:text|regclass)\)/i ){
     $seq_expr = '' unless defined $seq_expr;
-    $self->throw_exception("could not parse sequence expression: '$seq_expr'");
+    $schema = $schema . "." if defined $schema && length $schema;
+    $self->throw_exception("could not parse nextval expression for $schema$table.$col: '$seq_expr'");
   }
 
   return $1;
@@ -79,17 +99,6 @@
 sub get_autoinc_seq {
   my ($self,$source,$col) = @_;
 
-  my $schema;
-  my $table = $source->name;
-
-  if (ref $table eq 'SCALAR') {
-    $table = $$table;
-  }
-  elsif ($table =~ /^(.+)\.(.+)$/) {
-    ($schema, $table) = ($1, $2);
-  }
-
-  $self->dbh_do('_dbh_get_autoinc_seq', $schema, $table, $col);
 }
 
 sub sqlt_type {




More information about the Bast-commits mailing list