Rewrite selector using sqla
[dbsrgits/DBIx-Class.git] / lib / DBIx / Class / Storage / DBI / Pg.pm
index b3d88f2..1348d33 100644 (file)
@@ -39,6 +39,7 @@ sub _dbh_last_insert_id {
 }
 
 
+# get the postgres search path, and cache it
 sub _get_pg_search_path {
     my ($self,$dbh) = @_;
     # cache the search path as ['schema','schema',...] in the storage
@@ -59,18 +60,21 @@ sub _get_pg_search_path {
 sub _dbh_get_autoinc_seq {
   my ($self, $dbh, $schema, $table, $col) = @_;
 
+  my $sqlmaker = $self->sql_maker;
+  local $sqlmaker->{bindtype} = 'normal';
 
-  my @where = ( 'c.relname = ?', 'a.attname = ?' );
-  my @bind  = ($table, $col);
-  if( defined $schema && length $schema ) {
-      push @where, 'n.nspname = ?';
-      push @bind, $schema;
-  } else {
-      push @where, 'pg_catalog.pg_table_is_visible(c.oid)';
-  }
-  my $where = join ' AND ', @where;
+  my ($where, @bind) = $self->sql_maker->where ({
+    'a.attnum' => {'>', 0},
+    'c.relname' => $table,
+    'a.attname' => $col,
+    -not_bool => 'a.attisdropped',
+    (defined $schema && length $schema)
+      ? ( 'n.nspname' => $schema )
+      : ( -bool => \'pg_catalog.pg_table_is_visible(c.oid)' )
+  });
 
   my ($seq_expr) = $dbh->selectrow_array(<<EOS,undef,@bind);
+
 SELECT
   (SELECT pg_catalog.pg_get_expr(d.adbin, d.adrelid)
    FROM pg_catalog.pg_attrdef d
@@ -78,13 +82,14 @@ SELECT
 FROM pg_catalog.pg_class c
      JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace
      JOIN pg_catalog.pg_attribute a ON a.attrelid = c.oid
-WHERE
-  $where
-  AND a.attnum > 0 AND NOT a.attisdropped
+$where
+
 EOS
 
-  $seq_expr =~ /^nextval\(+'([^']+)'::(?:text|regclass)\)/i
-      or $self->throw_exception("could not parse sequence expression '$seq_expr'");
+  unless (defined $seq_expr && $seq_expr =~ /^nextval\(+'([^']+)'::(?:text|regclass)\)/i ){
+    $seq_expr = '' unless defined $seq_expr;
+    $self->throw_exception("could not parse sequence expression: '$seq_expr'");
+  }
 
   return $1;
 }
@@ -172,13 +177,17 @@ This class implements autoincrements for PostgreSQL.
 
 =head1 POSTGRESQL SCHEMA SUPPORT
 
-This supports multiple PostgreSQL schemas, with one caveat: for
-performance reasons, the schema search path is queried the first time it is
-needed and CACHED for subsequent uses.
+This driver supports multiple PostgreSQL schemas, with one caveat: for
+performance reasons, data about the search path, sequence names, and
+so forth is queried as needed and CACHED for subsequent uses.
+
+For this reason, once your schema is instantiated, you should not
+change the PostgreSQL schema search path for that schema's database
+connection. If you do, Bad Things may happen.
 
-For this reason, you should do any necessary manipulation of the
-PostgreSQL search path BEFORE instantiating your schema object, or as
-part of the on_connect_do option to connect(), for example:
+You should do any necessary manipulation of the search path BEFORE
+instantiating your schema object, or as part of the on_connect_do
+option to connect(), for example:
 
    my $schema = My::Schema->connect
                   ( $dsn,$user,$pass,