load, and adds them to the schema at runtime, including relationships,
etc. Does not process drops or changes.
+Returns a list of the new monikers added.
+
=cut
-sub rescan { shift->_loader->rescan }
+sub rescan { my $self = shift; $self->_loader->rescan($self) }
=head1 EXAMPLE
bless $self => $class;
- $self->{db_schema} ||= '';
$self->_ensure_arrayref(qw/additional_classes
additional_base_classes
left_base_classes
=head2 rescan
+Arguments: schema
+
Rescan the database for newly added tables. Does
-not process drops or changes.
+not process drops or changes. Returns a list of
+the newly added table monikers.
+
+The schema argument should be the schema class
+or object to be affected. It should probably
+be derived from the original schema_class used
+during L</load>.
=cut
sub rescan {
- my $self = shift;
+ my ($self, $schema) = @_;
+
+ $self->{schema} = $schema;
my @created;
my @current = $self->_tables_list;
}
$self->_load_tables(@created);
+
+ return map { $self->monikers->{$_} } @created;
}
sub _load_tables {
@tables = grep { ! /$exclude/ } @tables if $exclude;
# Save the new tables to the tables list
- push(@{$self->{_tables}}, @tables);
+ foreach (@tables) {
+ $self->{_tables}->{$_} = 1;
+ }
# Set up classes/monikers
{
sub run_tests {
my $self = shift;
- plan tests => 76;
+ plan tests => 80;
$self->create();
my $obj15 = $rsobj15->find(1);
isa_ok( $obj15->loader_test14, $class14 );
}
+
+ # rescan test
+ SKIP: {
+ skip 'SQLite does not like schema changes while connected', 4
+ if $self->{vendor} =~ /sqlite/i;
+
+ my @statements_rescan = (
+ qq{
+ CREATE TABLE loader_test25 (
+ id INTEGER NOT NULL PRIMARY KEY,
+ loader_test2 INTEGER NOT NULL,
+ FOREIGN KEY (loader_test2) REFERENCES loader_test2 (id)
+ ) $self->{innodb}
+ },
+ q{ INSERT INTO loader_test25 (id,loader_test2) VALUES(123, 1) },
+ q{ INSERT INTO loader_test25 (id,loader_test2) VALUES(321, 2) },
+ );
+
+ my $dbh = $self->dbconnect(1);
+ $dbh->do($_) for @statements_rescan;
+ $dbh->disconnect;
+
+ my @new = $conn->rescan;
+ is(scalar(@new), 1);
+ is($new[0], 'LoaderTest25');
+
+ my $rsobj25 = $conn->resultset('LoaderTest25');
+ isa_ok($rsobj25, 'DBIx::Class::ResultSet');
+ my $obj25 = $rsobj25->find(123);
+ isa_ok( $obj25->loader_test2, $class2);
+ }
+
}
}
},
q{ INSERT INTO loader_test15 (id,loader_test14) VALUES (1,123) },
- );
+ );
$self->drop_tables;
loader_test14
/;
+ my @tables_rescan = qw/ loader_test25 /;
+
my $drop_fk_mysql =
q{ALTER TABLE loader_test10 DROP FOREIGN KEY loader_test11_fk;};
$dbh->do("DROP TABLE $_") for (@tables_implicit_rels);
}
}
+ unless($self->{vendor} =~ /sqlite/i) {
+ $dbh->do("DROP TABLE $_") for (@tables_rescan);
+ }
$dbh->do("DROP TABLE $_") for (@tables);
$dbh->disconnect;
}