1 package DBIx::Class::Schema::Loader::DB2;
4 use base 'DBIx::Class::Schema::Loader::Generic';
9 DBIx::Class::Schema::Loader::DB2 - DBIx::Class::Schema::Loader DB2 Implementation.
13 use DBIx::Schema::Class::Loader;
15 # $loader is a DBIx::Class::Schema::Loader::DB2
16 my $loader = DBIx::Class::Schema::Loader->new(
17 dsn => "dbi:DB2:dbname",
20 db_schema => "MYSCHEMA",
26 See L<DBIx::Class::Schema::Loader>.
31 return qw/DBIx::Class::PK::Auto::DB2/;
37 my $db_schema = uc $class->loader_data->{_db_schema};
38 my $dbh = $class->storage->dbh;
40 # this is split out to avoid version parsing errors...
41 my $is_dbd_db2_gte_114 = ( $DBD::DB2::VERSION >= 1.14 );
42 my @tables = $is_dbd_db2_gte_114 ?
43 $dbh->tables( { TABLE_SCHEM => '%', TABLE_TYPE => 'TABLE,VIEW' } )
45 # People who use table or schema names that aren't identifiers deserve
46 # what they get. Still, FIXME?
48 @tables = grep {!/^SYSIBM\./ and !/^SYSCAT\./ and !/^SYSSTAT\./} @tables;
49 @tables = grep {/^$db_schema\./} @tables if($db_schema);
54 my ( $class, $table ) = @_;
56 # print "_table_info($table)\n";
57 my ($db_schema, $tabname) = split /\./, $table, 2;
58 # print "DB_Schema: $db_schema, Table: $tabname\n";
60 # FIXME: Horribly inefficient and just plain evil. (JMM)
61 my $dbh = $class->storage->dbh;
62 $dbh->{RaiseError} = 1;
64 my $sth = $dbh->prepare(<<'SQL') or die;
66 FROM SYSCAT.COLUMNS as c
67 WHERE c.TABSCHEMA = ? and c.TABNAME = ?
70 $sth->execute($db_schema, $tabname) or die;
71 my @cols = map { lc } map { @$_ } @{$sth->fetchall_arrayref};
75 $sth = $dbh->prepare(<<'SQL') or die;
77 FROM SYSCAT.TABCONST as tc
78 JOIN SYSCAT.KEYCOLUSE as kcu ON tc.constname = kcu.constname
79 WHERE tc.TABSCHEMA = ? and tc.TABNAME = ? and tc.TYPE = 'P'
82 $sth->execute($db_schema, $tabname) or die;
84 my @pri = map { lc } map { @$_ } @{$sth->fetchall_arrayref};
88 return ( \@cols, \@pri );
91 # Find and setup relationships
95 my $dbh = $class->storage->dbh;
97 my $sth = $dbh->prepare(<<'SQL') or die;
98 SELECT SR.COLCOUNT, SR.REFTBNAME, SR.PKCOLNAMES, SR.FKCOLNAMES
99 FROM SYSIBM.SYSRELS SR WHERE SR.TBNAME = ?
102 foreach my $table ( $class->tables ) {
103 if ($sth->execute(uc $table)) {
104 while(my $res = $sth->fetchrow_arrayref()) {
105 my ($colcount, $other, $other_column, $column) =
106 map { $_=lc; s/^\s+//; s/\s+$//; $_; } @$res;
107 next if $colcount != 1; # XXX no multi-col FK support yet
108 eval { $class->_belongs_to_many( $table, $column, $other,
110 warn qq/\# belongs_to_many failed "$@"\n\n/
111 if $@ && $class->debug_loader;
122 L<DBIx::Class::Schema::Loader>