X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=DBSchema.pm;h=7ba1921e3a1abefc05cba493016d31ac2cd59ec7;hb=e7dd1d416aab83e26b2403e6b5e9737ca674703a;hp=9baa34e18fb61a48839a0113a179d6c5f020264d;hpb=177e858cd165c73658ef352436d3eae90fb54991;p=DBIx-DBSchema.git diff --git a/DBSchema.pm b/DBSchema.pm index 9baa34e..7ba1921 100644 --- a/DBSchema.pm +++ b/DBSchema.pm @@ -1,19 +1,19 @@ package DBIx::DBSchema; use strict; -use vars qw($VERSION $DEBUG $errstr); 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::ColGroup::Unique; -use DBIx::DBSchema::ColGroup::Index; +use DBIx::DBSchema::ForeignKey; -$VERSION = "0.40_01"; +our $VERSION = '0.46_02'; $VERSION = eval $VERSION; # modperlstyle: convert the string into a number -$DEBUG = 0; +our $DEBUG = 0; + +our $errstr; =head1 NAME @@ -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 and tables -(and, as of 0.33, indices). +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; @@ -420,18 +427,29 @@ sub pretty_print { } keys %indices - ). "\n }, \n" + ). "\n }, \n". + + #foreign_keys + " 'foreign_keys' => [ ". join( ",\n ", + + map { my $name = $_->constraint; + "'$name' => { \n". + " },\n"; + } + $table->foreign_keys + + ). "\n ], \n" + + ; } $self->tables ). "}\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. @@ -458,11 +476,7 @@ sub pretty_read { 'primary_key' => $info->{'primary_key'}, 'columns' => \@columns, - #old-style indices - 'unique' => DBIx::DBSchema::ColGroup::Unique->new($info->{'unique'}), - 'index' => DBIx::DBSchema::ColGroup::Index->new($info->{'index'}), - - #new-style indices + #indices 'indices' => [ map { my $idx_info = $info->{'indices'}{$_}; DBIx::DBSchema::Index->new({ 'name' => $_, @@ -484,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 @@ -513,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-2010 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. @@ -531,15 +552,22 @@ the same terms as Perl itself. Multiple primary keys are not yet supported. -Foreign keys and other constraints are not yet supported. - -sql_update_schema doesn't deal with deleted columns yet. +Foreign keys: need to support dropping, NOT VALID, reverse engineering w/mysql Need to port and test with additional databases Each DBIx::DBSchema object should have a name which corresponds to its name within the SQL database engine (DBI data source). +Need to support "using" index attribute in pretty_read and in reverse +engineering + +sql CREATE TABLE output should convert integers +(i.e. use DBI qw(:sql_types);) to local types using DBI->type_info plus a hash +to fudge things + +=head2 PRETTY_ BUGS + pretty_print is actually pretty ugly. pretty_print isn't so good about quoting values... save/load is a much better @@ -553,16 +581,9 @@ when nothing is given in the read. Perhaps pretty_read should eval column types so that we can use DBI qw(:sql_types) here instead of externally. -Need to support "using" index attribute in pretty_read and in reverse -engineering - perhaps we should just get rid of pretty_read entirely. pretty_print is useful for debugging, but pretty_read is pretty bunk. -sql CREATE TABLE output should convert integers -(i.e. use DBI qw(:sql_types);) to local types using DBI->type_info plus a hash -to fudge things - =head1 SEE ALSO L, L,