X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=DBSchema.pm;h=89354cd1b432ea1f909f05504ce57ff77901f718;hb=HEAD;hp=78adaca4cbeff6166ccf98f8bd76b361c729b556;hpb=400aa157abf08369aef787b093814ab9f4523015;p=DBIx-DBSchema.git diff --git a/DBSchema.pm b/DBSchema.pm index 78adaca..89354cd 100644 --- a/DBSchema.pm +++ b/DBSchema.pm @@ -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 recommended. If you need to load and save your schema -to a file, see the L and L methods. +to a file, see the L and L methods. Creates a schema as specified by a data structure such as that created by B 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 contributed column and table dropping, Pg bugfixes and more. +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.