X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=DBSchema.pm;h=7f4c3150b7a232e219382c36fe79b8529f07cdbc;hb=01e769f4c32d9fcae64746252d2ded26fc0e35ae;hp=9e131889ff39c88d5b454a903c8c06b69b42f391;hpb=f8f8b6b29989b0524eda577c8154d3eabf598d48;p=DBIx-DBSchema.git diff --git a/DBSchema.pm b/DBSchema.pm index 9e13188..7f4c315 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.05; +use DBIx::DBSchema::Table 0.08; use DBIx::DBSchema::Index; use DBIx::DBSchema::Column; -use DBIx::DBSchema::ColGroup::Unique; -use DBIx::DBSchema::ColGroup::Index; +use DBIx::DBSchema::ForeignKey; -$VERSION = "0.35_01"; +our $VERSION = '0.44'; $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 ] ] ] @@ -250,7 +252,7 @@ with B set true before all other arguments, it will also drop tables. See L, -L and +L and L for additional specifics and limitations. @@ -276,10 +278,10 @@ specified database, will attempt to use generic SQL syntax. #gosh, false laziness w/DBSchema::Table::sql_alter_schema sub sql_update_schema { - #my($self, $new, $dbh) = ( shift, shift, _dbh(@_) ); my($self, $opt, $new, $dbh) = ( shift, _parse_opt(\@_), shift, _dbh(@_) ); my @r = (); + my @later = (); foreach my $table ( $new->tables ) { @@ -288,14 +290,18 @@ sub sql_update_schema { warn "$table exists\n" if $DEBUG > 1; push @r, - $self->table($table)->sql_alter_table( $new->table($table), $dbh ); + $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 ); } @@ -316,6 +322,8 @@ sub sql_update_schema { } + push @r, @later; + warn join("\n", @r). "\n" if $DEBUG > 1; @@ -370,7 +378,12 @@ sub pretty_print { "'". $table->column($_)->type. "', ". "'". $table->column($_)->null. "', ". "'". $table->column($_)->length. "', ". - "'". $table->column($_)->default. "', ". + + ( ref($table->column($_)->default) + ? "\\'". ${ $table->column($_)->default }. "'" + : "'". $table->column($_)->default. "'" + ).', '. + "'". $table->column($_)->local. "',\n" } $table->columns ). @@ -414,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. @@ -452,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' => $_, @@ -512,11 +532,23 @@ bugfixes and more. 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 Freeside Internet Services, Inc. +Copyright (c) 2007-2015 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. @@ -525,17 +557,22 @@ the same terms as Perl itself. Multiple primary keys are not yet supported. -Foreign keys and other constraints are not yet supported. - -Eventually it would be nice to have additional transformations (deleted, -modified columns). sql_update_schema doesn't deal with deleted or modified -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 @@ -549,16 +586,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,