From: Brandon Black Date: Sat, 31 Mar 2007 01:07:15 +0000 (+0000) Subject: added test for rescan, fixed a few issues X-Git-Tag: 0.03999_01~5 X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=commitdiff_plain;h=a60b5b8dba39bf151b904b4fa5b53d65117b2801;p=dbsrgits%2FDBIx-Class-Schema-Loader.git added test for rescan, fixed a few issues --- diff --git a/lib/DBIx/Class/Schema/Loader.pm b/lib/DBIx/Class/Schema/Loader.pm index a51bfc5..72abc6f 100644 --- a/lib/DBIx/Class/Schema/Loader.pm +++ b/lib/DBIx/Class/Schema/Loader.pm @@ -290,9 +290,11 @@ Re-scans the database for newly added tables since the initial 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 diff --git a/lib/DBIx/Class/Schema/Loader/Base.pm b/lib/DBIx/Class/Schema/Loader/Base.pm index 0207217..6664d70 100644 --- a/lib/DBIx/Class/Schema/Loader/Base.pm +++ b/lib/DBIx/Class/Schema/Loader/Base.pm @@ -209,7 +209,6 @@ sub new { bless $self => $class; - $self->{db_schema} ||= ''; $self->_ensure_arrayref(qw/additional_classes additional_base_classes left_base_classes @@ -313,13 +312,23 @@ sub load { =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. =cut sub rescan { - my $self = shift; + my ($self, $schema) = @_; + + $self->{schema} = $schema; my @created; my @current = $self->_tables_list; @@ -330,6 +339,8 @@ sub rescan { } $self->_load_tables(@created); + + return map { $self->monikers->{$_} } @created; } sub _load_tables { @@ -345,7 +356,9 @@ 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 { diff --git a/t/lib/dbixcsl_common_tests.pm b/t/lib/dbixcsl_common_tests.pm index 99a2d13..2e4143c 100644 --- a/t/lib/dbixcsl_common_tests.pm +++ b/t/lib/dbixcsl_common_tests.pm @@ -43,7 +43,7 @@ sub _monikerize { sub run_tests { my $self = shift; - plan tests => 76; + plan tests => 80; $self->create(); @@ -444,6 +444,38 @@ sub run_tests { 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); + } + } } @@ -744,7 +776,7 @@ sub create { }, q{ INSERT INTO loader_test15 (id,loader_test14) VALUES (1,123) }, - ); + ); $self->drop_tables; @@ -817,6 +849,8 @@ sub 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;}; @@ -843,6 +877,9 @@ sub drop_tables { $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; }