[Dbix-class] ILMARI, DID YOU SEE THIS? Patch for DBIx::Class::Schema::Loader to qualify relations if db_schema was passed

Matt S Trout dbix-class at trout.me.uk
Sun Jul 20 01:26:15 BST 2008


On Mon, Jun 30, 2008 at 08:12:02PM -0700, Dan Dascalescu wrote:
> Please find at http://dandascalescu.com/bugs/catalyst/DBIx-Class-Schema-Loader_patch-qualify_with_db_schema.txt
> a patch that qualifies table names, indexes and sequence names with
> the schema name if db_schema was specified. For
> sequences, I only handled the PostgreSQL syntax,
> nextval('table_id_seq'::regclass). castaway and mst also prodded me to
> add a Contributors section.
> 
> Hope this patch gets us one step closer to multi-schema support,
> Dan

> Index: lib/DBIx/Class/Schema/Loader.pm
> ===================================================================
> --- lib/DBIx/Class/Schema/Loader.pm	(revision 4507)
> +++ lib/DBIx/Class/Schema/Loader.pm	(working copy)
> @@ -38,7 +38,7 @@
>    # -or-
>    my $schema1 = "My::Schema"; $schema1->connection(as above);
>  
> -=head1 DESCRIPTION 
> +=head1 DESCRIPTION
>  
>  DBIx::Class::Schema::Loader automates the definition of a
>  L<DBIx::Class::Schema> by scanning database table definitions and
> @@ -86,7 +86,7 @@
>  
>  sub loader_options {
>      my $self = shift;
> -    
> +
>      my %args = (ref $_[0] eq 'HASH') ? %{$_[0]} : @_;
>      $self->_loader_args(\%args);
>  
> @@ -342,11 +342,18 @@
>  
>  Based upon the work of IKEBE Tomohiro
>  
> -=head1 THANK YOU
> +=head1 CONTRIBUTORS
>  
> -Matt S Trout, all of the #dbix-class folks, and everyone who's ever sent
> -in a bug report or suggestion.
> +Matt S Trout
>  
> +Jess Robinson
> +
> +Dan Dascalescu
> +
> +All of the #dbix-class folks
> +
> +Everyone who's ever sent in a bug report or suggestion
> +
>  =head1 LICENSE
>  
>  This library is free software; you can redistribute it and/or modify it under
> Index: lib/DBIx/Class/Schema/Loader/Base.pm
> ===================================================================
> --- lib/DBIx/Class/Schema/Loader/Base.pm	(revision 4507)
> +++ lib/DBIx/Class/Schema/Loader/Base.pm	(working copy)
> @@ -642,7 +642,11 @@
>      my $table_class = $self->classes->{$table};
>      my $table_moniker = $self->monikers->{$table};
>  
> -    $self->_dbic_stmt($table_class,'table',$table);
> +    if ($self->{db_schema} and $table !~ /\./) {
> +        $self->_dbic_stmt($table_class, 'table', $self->{db_schema}.$self->{_namesep}.$table)
> +    } else {
> +        $self->_dbic_stmt($table_class, 'table', $table);
> +    }
>  
>      my $cols = $self->_table_columns($table);
>      my $col_info;
> Index: lib/DBIx/Class/Schema/Loader/DBI.pm
> ===================================================================
> --- lib/DBIx/Class/Schema/Loader/DBI.pm	(revision 4507)
> +++ lib/DBIx/Class/Schema/Loader/DBI.pm	(working copy)
> @@ -72,7 +72,7 @@
>  sub _setup { }
>  
>  # Returns an array of table names
> -sub _tables_list { 
> +sub _tables_list {
>      my $self = shift;
>  
>      my $dbh = $self->schema->storage->dbh;
> @@ -116,7 +116,7 @@
>  }
>  
>  # Returns arrayref of pk col names
> -sub _table_pk_info { 
> +sub _table_pk_info {
>      my ($self, $table) = @_;
>  
>      my $dbh = $self->schema->storage->dbh;
> @@ -155,6 +155,9 @@
>      my @retval;
>      foreach my $index_name (keys %indices) {
>          my $index = $indices{$index_name};
> +        # prefix index with schema name if supplied, unless index is already qualified with a schema name
> +        $index_name = $self->{db_schema}.$self->{_namesep}.$index_name
> +            if $self->{db_schema} and $index_name !~ /\./;
>          push(@retval, [ $index_name => [
>              map { $index->{$_} }
>                  sort keys %$index
> @@ -217,7 +220,17 @@
>                  $column_info{data_type}   = $info->{TYPE_NAME};
>                  $column_info{size}      = $info->{COLUMN_SIZE};
>                  $column_info{is_nullable}   = $info->{NULLABLE} ? 1 : 0;
> +
>                  $column_info{default_value} = $info->{COLUMN_DEF};
> +                # prefix sequences with schema name if supplied via db_schema
> +                # this only attempts to handle the sane cases, e.g. "nextval('accesslog_id_seq'::regclass)"
> +                # if the default value is something wacko like nextval('table1_id_seq'::regclass) + nextval('table2_id_seq'::regclass), tough luck
> +                if ($self->{db_schema} and defined $column_info{default_value}) {
> +                    $column_info{default_value} =~ s{^nextval\((['"])([^'".]+)\1}{
> +                        'nextval(' . $1 . $self->{db_schema} . $self->{_namesep} . $2 . $1
> +                    }xei;
> +                }
> +
>                  my $col_name = $info->{COLUMN_NAME};
>                  $col_name =~ s/^\"(.*)\"$/$1/;
>  
> Index: Changes
> ===================================================================
> --- Changes	(revision 4507)
> +++ Changes	(working copy)
> @@ -2,6 +2,8 @@
>  
>  0.04006 Not Yet Released
>          - Fix Oracle constraint detection for non-owned schemas (RT #35732)
> +        - qualified tables, sequences and unique constraints
> +          with schema name if supplied via db_schema (Dan Dascalescu)
>  
>  0.04005 Sat Apr 05, 2008
>          - Fix DB2 support
> @@ -73,7 +75,7 @@
>          - Workaround for new incompatible changes in DBD::mysql's "tables"
>            method, which was causing us to find no tables w/ DBD::mysql
>            4.002+
> -        - Fixed quoting problem in _table_columns (could cause crash when 
> +        - Fixed quoting problem in _table_columns (could cause crash when
>            dumping/doing a static create) (from ash)
>  
>  0.03009 Wed Nov 15 14:03:37 UTC 2006

> _______________________________________________
> List: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/dbix-class
> IRC: irc.perl.org#dbix-class
> SVN: http://dev.catalyst.perl.org/repos/bast/DBIx-Class/
> Searchable Archive: http://www.grokbase.com/group/dbix-class@lists.rawmode.org

-- 
      Matt S Trout       Need help with your Catalyst or DBIx::Class project?
   Technical Director                    http://www.shadowcat.co.uk/catalyst/
 Shadowcat Systems Ltd.  Want a managed development or deployment platform?
http://chainsawblues.vox.com/            http://www.shadowcat.co.uk/servers/



More information about the DBIx-Class mailing list