missing test from git
[DBIx-DBSchema.git] / DBSchema.pm
index 78adaca..89354cd 100644 (file)
@@ -3,12 +3,12 @@ package DBIx::DBSchema;
 use strict;
 use Storable;
 use DBIx::DBSchema::_util qw(_load_driver _dbh _parse_opt);
-use DBIx::DBSchema::Table 0.08;
+use DBIx::DBSchema::Table 0.12;
 use DBIx::DBSchema::Index;
 use DBIx::DBSchema::Column;
 use DBIx::DBSchema::ForeignKey;
 
-our $VERSION = '0.42_01';
+our $VERSION = '0.47';
 $VERSION = eval $VERSION; # modperlstyle: convert the string into a number
 
 our $DEBUG = 0;
@@ -55,9 +55,8 @@ This module implements an OO-interface to database schemas.  Using this module,
 you can create a database schema with an OO Perl interface.  You can read the
 schema from an existing database.  You can save the schema to disk and restore
 it in a different process.  You can write SQL CREATE statements statements for
-different databases from a single source.  In recent versions, you can
-transform one schema to another, adding any necessary new columns, tables,
-indices and foreign keys.
+different databases from a single source.  You can transform one schema to
+another, adding any necessary new columns, tables, indices and foreign keys.
 
 Currently supported databases are MySQL, PostgreSQL and SQLite.  Sybase and
 Oracle drivers are partially implemented.  DBIx::DBSchema will attempt to use
@@ -236,7 +235,10 @@ specified database, will attempt to use generic SQL syntax.
 
 sub sql {
   my($self, $dbh) = ( shift, _dbh(@_) );
-  map { $self->table($_)->sql_create_table($dbh); } $self->tables;
+  ( 
+    ( map { $self->table($_)->sql_create_table($dbh); } $self->tables ),
+    ( map { $self->table($_)->sql_add_constraints($dbh); } $self->tables ),
+  );
 }
 
 =item sql_update_schema [ OPTIONS_HASHREF, ] PROTOTYPE_SCHEMA [ DATABASE_HANDLE | DATA_SOURCE [ USERNAME PASSWORD [ ATTR ] ] ]
@@ -279,6 +281,7 @@ sub sql_update_schema {
   my($self, $opt, $new, $dbh) = ( shift, _parse_opt(\@_), shift, _dbh(@_) );
 
   my @r = ();
+  my @later = ();
 
   foreach my $table ( $new->tables ) {
   
@@ -286,17 +289,19 @@ sub sql_update_schema {
   
       warn "$table exists\n" if $DEBUG > 1;
 
-      push @r, $self->table($table)->sql_alter_table( $new->table($table),
-                                                      $dbh,
-                                                      $opt
-                                                    );
+      push @r,
+        $self->table($table)->sql_alter_table( $new->table($table),
+                                                 $dbh, $opt );
+      push @later,
+        $self->table($table)->sql_alter_constraints( $new->table($table),
+                                                       $dbh, $opt );
 
     } else {
   
       warn "table $table does not exist.\n" if $DEBUG;
 
-      push @r, 
-        $new->table($table)->sql_create_table( $dbh );
+      push @r,     $new->table($table)->sql_create_table(    $dbh );
+      push @later, $new->table($table)->sql_add_constraints( $dbh );
   
     }
   
@@ -317,6 +322,8 @@ sub sql_update_schema {
 
   }
 
+  push @r, @later;
+
   warn join("\n", @r). "\n"
     if $DEBUG > 1;
 
@@ -439,12 +446,10 @@ sub pretty_print {
   ). "}\n";
 }
 
-=cut
-
 =item pretty_read HASHREF
 
 This method is B<not> recommended.  If you need to load and save your schema
-to a file, see the L</load|load> and L</save|save> methods.
+to a file, see the L</load> and L</save> methods.
 
 Creates a schema as specified by a data structure such as that created by
 B<pretty_print> method.
@@ -493,16 +498,8 @@ sub pretty_read {
 sub _tables_from_dbh {
   my($dbh) = @_;
   my $driver = _load_driver($dbh);
-  my $db_catalog =
-    scalar(eval "DBIx::DBSchema::DBD::$driver->default_db_catalog");
-  my $db_schema  =
-    scalar(eval "DBIx::DBSchema::DBD::$driver->default_db_schema");
-  my $sth = $dbh->table_info($db_catalog, $db_schema, '', 'TABLE')
-    or die $dbh->errstr;
-  #map { $_->{TABLE_NAME} } grep { $_->{TABLE_TYPE} eq 'TABLE' }
-  #  @{ $sth->fetchall_arrayref({ TABLE_NAME=>1, TABLE_TYPE=>1}) };
-  map { $_->[0] } grep { $_->[1] =~ /^TABLE$/i }
-    @{ $sth->fetchall_arrayref([2,3]) };
+  my $driver_class = "DBIx::DBSchema::DBD::$driver";
+  $driver_class->tables($dbh);
 }
 
 =back
@@ -522,16 +519,31 @@ internal usage of the old API.
 Slaven Rezic <srezic@cpan.org> contributed column and table dropping, Pg
 bugfixes and more.
 
+Nathan Anderson <http://1id.com/=nathan.anderson> contribued updates to the
+SQLite and Sybase drivers.
+
 =head1 CONTRIBUTIONS
 
 Contributions are welcome!  I'm especially keen on any interest in the top
 items/projects below under BUGS.
 
+=head1 REPOSITORY
+
+The code is available from our public git repository:
+
+  git clone git://git.freeside.biz/DBIx-DBSchema.git
+
+Or on the web:
+
+  http://freeside.biz/gitweb/?p=DBIx-DBSchema.git
+  Or:
+  http://freeside.biz/gitlist/DBIx-DBSchema.git
+
 =head1 COPYRIGHT
 
 Copyright (c) 2000-2007 Ivan Kohler
 Copyright (c) 2000 Mail Abuse Prevention System LLC
-Copyright (c) 2007-2013 Freeside Internet Services, Inc.
+Copyright (c) 2007-2017 Freeside Internet Services, Inc.
 All rights reserved.
 This program is free software; you can redistribute it and/or modify it under
 the same terms as Perl itself.