Class::DBI::Loader::Kinship - Fixes to Class::DBI::Loader


Class-DBI-Loader-Kinship documentation Contained in the Class-DBI-Loader-Kinship distribution.

Index


Code Index:

NAME

Top

Class::DBI::Loader::Kinship - Fixes to Class::DBI::Loader

SYNOPSIS

Top

  use Class::DBI::Loader::Kinship;

  my $l = new Class::DBI::Loader::Kinship  (
                dsn           =>  $ENV{ DBI_DSN  },
                user          =>  $ENV{ DBI_USER },
                password      =>  $ENV{ DBI_PASS },
                namespace     =>  'music',
                exclude       =>  '^pg_.*|sql_.*',
  );

  my @tables  = $l->tables;
  my @classes = $l->classes;

  print Dumper $l->kinships;
  print Dumper $l->kinships('music::Cd');
  print Dumper $l->kinships('music::Cd', 'has_a');
  print Dumper $l->kinships('music::Cd', 'has_many');

DESCRIPTION

Top

A subclass of Class::DBI::Loader which introduces the 3rd argument to has_many relations, adds support to schemas for Postgresql, and provides a few additional fuctions. This package still dependends on its subclass; and so far, I resisted to opt for cleaner code and fork my own direction. The original Pg subclass is intentionally prevented from loading so another can masquerade in its palace.

EXPORT

None by default.

SEE ALSO

Top

Class::DBI::Loader, Class::DBI::Loader::Pg.

AUTHOR

Top

Ioannis Tambouras, <ioannis@cpan.org>

COPYRIGHT AND LICENSE

Top


Class-DBI-Loader-Kinship documentation Contained in the Class-DBI-Loader-Kinship distribution.

package Class::DBI::Loader::Kinship;

use 5.008008;
use base 'Class::DBI::Loader';
our $VERSION = '0.03';

use Class::DBI::Loader::k_Pg ;
## Class::DBI::Loader::k_Pg is masquerading as Class::DBI::Loader::Pg
$INC{'Class/DBI/Loader/Pg.pm'} = '::k_Pg masquerades in its place';

# load Class::DBI::Loader::Generic here to prevent 
# someone loading later (and redefine our subs) .
use Class::DBI::Loader::Generic;

package Class::DBI::Loader::Generic;
use strict;
use warnings;
no warnings 'redefine';

my %kinships ;

sub _has_a_many {
       my ( $self, $fk_tn, $fk_cn, $uk_tn, $uk_cn ) = @_;
       my $fk_class = $self->find_class($fk_tn) or return;
       my $uk_class = $self->find_class($uk_tn) or return;
       my $mn= lc $fk_class . 's';

       warn qq/\# Has_a relationship\n/                       if $self->debug;
       my $hasa = "$fk_class ->has_a ( $fk_cn, $uk_class )"; 
       warn "$hasa \n\n"                                      if $self->debug;
       push @{$kinships{ $fk_class }{has_a}} , $hasa ;
       $fk_class -> has_a( $fk_cn, $uk_class );

       warn qq/\# Has_many relationship\n/                    if $self->debug;
       my $many  = "$uk_class ->has_many ( $mn,$fk_class,$fk_cn )";
       warn "$many \n\n"                                      if $self->debug;
       push @{$kinships{ $uk_class }{has_many}} , $many ;
       $uk_class -> has_many( $mn, $fk_class, $fk_cn ) ;
}

sub _relationships {
    my $self = shift;
    my $ns  = $self->{_namespace}||'public' ;
    foreach my $table ( $self->tables ) {
        my $dbh = $self->find_class($table)->db_Main;
        if ( my $sth = $dbh->foreign_key_info( '', $ns, '', '',$ns, $table) ) {
            for my $res ( @{ $sth->fetchall_arrayref( {} ) } ) {
                my $fk_tn = $res->{ FK_TABLE_NAME };
                my $fk_cn = $res->{ FK_COLUMN_NAME };
                my $uk_tn = $res->{ UK_TABLE_NAME };
                my $uk_cn = $res->{ UK_COLUMN_NAME };
                eval { $self->_has_a_many( $fk_tn, $fk_cn, $uk_tn, $uk_cn) };
                warn qq/\# has_a_many failed "$@"\n\n/ if $@ && $self->debug;
           } 
        }
    }
}

sub kinships {
	my ($self, $class, $kind) = @_ ;
	return \%kinships unless $class;
	{ all      => $kinships{ $class } ,
	  has_a    => $kinships{ $class }{ has_a },
	  has_many => $kinships{ $class }{ has_many },
	  ''       => $kinships{ $class }
        }->{lc $kind||''};
}


1;

__END__