From: Robert Buels Date: Fri, 4 Sep 2009 00:20:32 +0000 (+0000) Subject: rewrote autoinc fetcher as a query into the pg_catalog. all the old tests pass now... X-Git-Tag: v0.08111~14^2~15 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=5e14a204918abb9edea2b21c2313a30ca72d8020;p=dbsrgits%2FDBIx-Class.git rewrote autoinc fetcher as a query into the pg_catalog. all the old tests pass now, but not my new tests. the new tests might be buggy --- diff --git a/lib/DBIx/Class/Storage/DBI/Pg.pm b/lib/DBIx/Class/Storage/DBI/Pg.pm index 4dd6ea8..b3d88f2 100644 --- a/lib/DBIx/Class/Storage/DBI/Pg.pm +++ b/lib/DBIx/Class/Storage/DBI/Pg.pm @@ -59,72 +59,34 @@ sub _get_pg_search_path { sub _dbh_get_autoinc_seq { my ($self, $dbh, $schema, $table, $col) = @_; - # get the list of postgres schemas to search. if we have a schema - # specified, use that. otherwise, use the search path - my @search_path; - if( defined $schema and length $schema ) { - @search_path = ( $schema ); - } else { - @search_path = @{ $self->_get_pg_search_path($dbh) }; - } - - # find the sequence(s) of the column in question (should have nextval declared on it) - my @sequence_names; - foreach my $search_schema (@search_path) { - my $info = $dbh->column_info(undef,$search_schema,$table,$col)->fetchrow_hashref; - if($info && defined $info->{COLUMN_DEF} - && $info->{COLUMN_DEF} =~ /^nextval\(+'([^']+)'::(?:text|regclass)\)/i - ) { - push @sequence_names, $1; - } - } - if (@sequence_names != 1) { - $self->throw_exception (sprintf - q|Unable to reliably determine autoinc sequence name for '%s'.'%s' (possible candidates: %s)|, - $table, - $col, - join (', ', (@sequence_names ? @sequence_names : 'none found') ), - ); - } - - my $seq = $sequence_names[0]; - - if( $seq !~ /\./ ) { - my $sth = $dbh->prepare ( - 'SELECT * FROM "information_schema"."sequences" WHERE "sequence_name" = ?' - ); - $sth->execute ($seq); - - my @seen_in_schemas; - while (my $h = $sth->fetchrow_hashref) { - push @seen_in_schemas, $h->{sequence_schema}; - } - - if (not @seen_in_schemas) { - $self->throw_exception (sprintf - q|Automatically determined autoinc sequence name '%s' for '%s'.'%s' does not seem to exist...'|, - $seq, - $table, - $col, - ); - } - elsif (@seen_in_schemas > 1) { - $self->throw_exception (sprintf - q|Unable to reliably fully-qualify automatically determined autoinc sequence name '%s' for '%s'.'%s' (same name exist in schemas: %s)|, - $seq, - $table, - $col, - join (', ', (@seen_in_schemas)), - ); - } - else { - my $sql_maker = $self->sql_maker; - $seq = join ('.', map { $sql_maker->_quote ($_) } ($seen_in_schemas[0], $seq) ); - } + 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)'; } - - return $seq; + my $where = join ' AND ', @where; + + my ($seq_expr) = $dbh->selectrow_array(< 0 AND NOT a.attisdropped +EOS + + $seq_expr =~ /^nextval\(+'([^']+)'::(?:text|regclass)\)/i + or $self->throw_exception("could not parse sequence expression '$seq_expr'"); + + return $1; } sub get_autoinc_seq {