File Coverage

blib/lib/DBIx/Model.pm
Criterion Covered Total %
statement 9 65 13.8
branch 0 14 0.0
condition 0 2 0.0
subroutine 3 5 60.0
pod 0 1 0.0
total 12 87 13.7


line stmt bran cond sub pod time code
1             package DBIx::Model;
2 1     1   13337 use strict;
  1         1  
  1         24  
3 1     1   3 use warnings;
  1         1  
  1         21  
4 1     1   283 use DBIx::Model::DB;
  1         2  
  1         508  
5              
6             our $VERSION = '0.0.1_1';
7              
8             my %columns;
9             my %forward;
10             my %backward;
11              
12             sub DBI::db::model {
13 0     0     my $dbh = shift;
14              
15 0           my $db = DBIx::Model::DB->new( name => $dbh->{Name}, @_ );
16 0           my @raw_fk;
17              
18 0           my $t_sth = $dbh->table_info;
19 0           while ( my $t_ref = $t_sth->fetchrow_hashref ) {
20 0 0         if ( $t_ref->{TABLE_TYPE} eq 'TABLE' ) {
21              
22 0           my $table = $db->add_table( name => $t_ref->{TABLE_NAME} );
23 0           my @primary = $dbh->primary_key( '%', '%', $t_ref->{TABLE_NAME} );
24              
25             my $c_sth =
26 0           $dbh->column_info( '%', '%', $t_ref->{TABLE_NAME}, '%' );
27 0           while ( my $c_ref = $c_sth->fetchrow_hashref ) {
28 0           my $pri = grep { $c_ref->{COLUMN_NAME} eq $_ } @primary;
  0            
29             $table->add_column(
30             name => $c_ref->{COLUMN_NAME},
31             nullable => $c_ref->{NULLABLE},
32             size => $c_ref->{COLUMN_SIZE},
33 0 0 0       type => $c_ref->{TYPE_NAME} || '*UNKNOWN*',
34             primary => $pri ? 1 : 0,
35             );
36             }
37              
38             my $fk_sth =
39             $dbh->foreign_key_info( '%', '%', '%', '%', '%',
40 0           $t_ref->{TABLE_NAME} );
41              
42 0           my @x;
43 0           while ( my $fk_ref = $fk_sth->fetchrow_hashref ) {
44 0 0         if ( $fk_ref->{KEY_SEQ} == 1 ) {
45 0 0         if (@x) {
46 0           push( @raw_fk, [@x] );
47             }
48             @x = (
49             $t_ref->{TABLE_NAME}, $fk_ref->{PKTABLE_NAME},
50 0           [ $fk_ref->{FKCOLUMN_NAME}, $fk_ref->{PKCOLUMN_NAME} ]
51             );
52             }
53             else {
54             push( @x,
55 0           [ $fk_ref->{FKCOLUMN_NAME}, $fk_ref->{PKCOLUMN_NAME} ]
56             );
57             }
58             }
59              
60 0 0         if (@x) {
61 0           push( @raw_fk, [@x] );
62             }
63             }
64             }
65              
66 0           foreach my $fk (@raw_fk) {
67 0           my ($from) = grep { $_->name eq $fk->[0] } $db->tables;
  0            
68 0           my ($to) = grep { $_->name eq $fk->[1] } $db->tables;
  0            
69 0           shift @$fk;
70 0           shift @$fk;
71              
72 0           my @from;
73             my @to;
74              
75 0           foreach my $pair (@$fk) {
76 0           push( @from, grep { $_->name eq $pair->[0] } $from->columns );
  0            
77 0           push( @to, grep { $_->name eq $pair->[1] } $to->columns );
  0            
78             }
79              
80             $from->add_foreign_key(
81 0           to_table => $to,
82             columns => \@from,
83             to_columns => \@to,
84             );
85              
86 0           map { $columns{ $_->full_name } = $_ } @from, @to;
  0            
87             map {
88 0           $forward{ $to[$_]->full_name }->{ $from[$_]->full_name }++;
  0            
89 0           $backward{ $from[$_]->full_name }->{ $to[$_]->full_name }++;
90             } 0 .. ( ( scalar @from ) - 1 );
91             }
92              
93 0           my $chain = 1;
94 0           while ( my $key = ( sort keys %forward, keys %backward )[0] ) {
95 0           chainer( $key, $chain++ );
96             }
97              
98 0           $db->chains( $chain - 1 );
99 0           return $db;
100             }
101              
102             sub chainer {
103 0     0 0   my $key = shift;
104 0           my $chain = shift;
105              
106 0           $columns{$key}->chain($chain);
107              
108 0 0         if ( my $val = delete $forward{$key} ) {
109 0           foreach my $new ( sort keys %$val ) {
110 0           chainer( $new, $chain );
111             }
112             }
113              
114 0 0         if ( my $val = delete $backward{$key} ) {
115 0           foreach my $new ( sort keys %$val ) {
116 0           chainer( $new, $chain );
117             }
118             }
119             }
120              
121             1;
122              
123             =head1 NAME
124              
125             DBIx::Model - build a Perl object model of a database
126