From: Brandon Black Date: Thu, 29 Mar 2007 22:20:10 +0000 (+0000) Subject: statistics_info support X-Git-Tag: 0.03999_01~18 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=fd589700a1bd69eed66aa18a1dbdd9bb67098b78;p=dbsrgits%2FDBIx-Class-Schema-Loader.git statistics_info support --- diff --git a/Changes b/Changes index c36f3a1..08d4aa7 100644 --- a/Changes +++ b/Changes @@ -1,5 +1,8 @@ Revision history for Perl extension DBIx::Class::Schema::Loader + - Added support for DBI's new standard "statistics_info" + method to gather unique key info (only supported by + DBD::Pg trunk + DBI >= 1.52 so far) - columns_info_for imported from DBIx::Class - relationships are now on by default, use skip_relationships to disable them diff --git a/lib/DBIx/Class/Schema/Loader/DBI.pm b/lib/DBIx/Class/Schema/Loader/DBI.pm index 5383a03..f21489a 100644 --- a/lib/DBIx/Class/Schema/Loader/DBI.pm +++ b/lib/DBIx/Class/Schema/Loader/DBI.pm @@ -114,7 +114,7 @@ sub _table_columns { # Returns arrayref of pk col names sub _table_pk_info { - my ( $self, $table ) = @_; + my ($self, $table) = @_; my $dbh = $self->schema->storage->dbh; @@ -124,10 +124,40 @@ sub _table_pk_info { return \@primary; } -# Override this for uniq info +# Override this for vendor-specific uniq info sub _table_uniq_info { - warn "No UNIQUE constraint information can be gathered for this vendor"; - return []; + my ($self, $table) = @_; + + my $dbh = $self->schema->storage->dbh; + if(!$dbh->can('statistics_info')) { + warn "No UNIQUE constraint information can be gathered for this vendor"; + return []; + } + + my %indices; + my $sth = $dbh->statistics_info(undef, $self->db_schema, $table, 1, 1); + while(my $row = $sth->fetchrow_hashref) { + # skip table-level stats, conditional indexes, and any index missing + # critical fields + next if $row->{TYPE} eq 'table' + || defined $row->{FILTER_CONDITION} + || !$row->{INDEX_NAME} + || !defined $row->{ORDINAL_POSITION} + || !$row->{COLUMN_NAME}; + + $indices{$row->{INDEX_NAME}}->{$row->{ORDINAL_POSITION}} = $row->{COLUMN_NAME}; + } + + my @retval; + foreach my $index_name (keys %indices) { + my $index = $indices{$index_name}; + push(@retval, [ $index_name => [ + map { $index->{$_} } + sort keys %$index + ]]); + } + + return \@retval; } # Find relationships diff --git a/lib/DBIx/Class/Schema/Loader/DBI/Pg.pm b/lib/DBIx/Class/Schema/Loader/DBI/Pg.pm index 5f4ae7c..e599b32 100644 --- a/lib/DBIx/Class/Schema/Loader/DBI/Pg.pm +++ b/lib/DBIx/Class/Schema/Loader/DBI/Pg.pm @@ -38,6 +38,11 @@ sub _setup { sub _table_uniq_info { my ($self, $table) = @_; + # Use the default support if available + return $self->next::method($table) + if $DBI::VERSION >= 1.52 + && $DBD::Pg::VERSION >= 1.50; + my @uniqs; my $dbh = $self->schema->storage->dbh;