package DBIx::Class::Schema::Loader::SQLite;
use strict;
+use warnings;
use base qw/DBIx::Class::Schema::Loader::Generic/;
+
use Text::Balanced qw( extract_bracketed );
-use Carp;
=head1 NAME
# $loader is a DBIx::Class::Schema::Loader::SQLite
my $loader = DBIx::Class::Schema::Loader->new(
dsn => "dbi:SQLite:dbname=/path/to/dbfile",
- namespace => "Data",
);
=head1 DESCRIPTION
return qw/DBIx::Class::PK::Auto::SQLite/;
}
-sub _relationships {
- my $class = shift;
- foreach my $table ( $class->tables ) {
+# XXX this really needs a re-factor
+sub _load_relationships {
+ my $self = shift;
+ foreach my $table ( $self->tables ) {
- my $dbh = $class->storage->dbh;
+ my $dbh = $self->schema->storage->dbh;
my $sth = $dbh->prepare(<<"");
SELECT sql FROM sqlite_master WHERE tbl_name = ?
# find multi-col fks below
$col =~ s/\-\-comma\-\-/,/g;
- # CDBI doesn't have built-in support multi-col fks, so ignore them
- next if $col =~ s/^\s*FOREIGN\s+KEY\s*//i && $col =~ /^\([^,)]+,/;
+ $col =~ s/^\s*FOREIGN\s+KEY\s*//i;
# Strip punctuations around key and table names
- $col =~ s/[()\[\]'"]/ /g;
+ $col =~ s/[\[\]'"]/ /g;
$col =~ s/^\s+//gs;
# Grab reference
- if ( $col =~ /^(\w+).*REFERENCES\s+(\w+)\s*(\w+)?/i ) {
- chomp $col;
- warn qq/\# Found foreign key definition "$col"\n\n/
- if $class->debug_loader;
- eval { $class->_belongs_to_many( $table, $1, $2, $3 ) };
- warn qq/\# belongs_to_many failed "$@"\n\n/
- if $@ && $class->debug_loader;
+ chomp $col;
+ next if $col !~ /^(.*)\s+REFERENCES\s+(\w+) (?: \s* \( (.*) \) )? /ix;
+
+ my ($cols, $f_table, $f_cols) = ($1, $2, $3);
+
+ if($cols =~ /^\(/) { # Table-level
+ $cols =~ s/^\(\s*//;
+ $cols =~ s/\s*\)$//;
+ }
+ else { # Inline
+ $cols =~ s/\s+.*$//;
}
+
+ my $cond;
+
+ if($f_cols) {
+ my @cols = map { s/\s*//g; $_ } split(/\s*,\s*/,$cols);
+ my @f_cols = map { s/\s*//g; $_ } split(/\s*,\s*/,$f_cols);
+ die "Mismatched column count in rel for $table => $f_table"
+ if @cols != @f_cols;
+ $cond = {};
+ for(my $i = 0 ; $i < @cols; $i++) {
+ $cond->{$f_cols[$i]} = $cols[$i];
+ }
+ eval { $self->_make_cond_rel( $table, $f_table, $cond ) };
+ }
+ else {
+ eval { $self->_make_simple_rel( $table, $f_table, $cols ) };
+ }
+
+ warn qq/\# belongs_to_many failed "$@"\n\n/
+ if $@ && $self->debug;
}
}
}
sub _tables {
- my $class = shift;
- my $dbh = $class->storage->dbh;
+ my $self = shift;
+ my $dbh = $self->schema->storage->dbh;
my $sth = $dbh->prepare("SELECT * FROM sqlite_master");
$sth->execute;
my @tables;
}
sub _table_info {
- my ( $class, $table ) = @_;
+ my ( $self, $table ) = @_;
# find all columns.
- my $dbh = $class->storage->dbh;
+ my $dbh = $self->schema->storage->dbh;
my $sth = $dbh->prepare("PRAGMA table_info('$table')");
$sth->execute();
my @columns;