use strict;
use vars qw($VERSION $DEBUG $errstr);
use Storable;
-use DBIx::DBSchema::_util qw(_load_driver _dbh);
+use DBIx::DBSchema::_util qw(_load_driver _dbh _parse_opt);
use DBIx::DBSchema::Table 0.05;
use DBIx::DBSchema::Index;
use DBIx::DBSchema::Column;
use DBIx::DBSchema::ColGroup::Unique;
use DBIx::DBSchema::ColGroup::Index;
-$VERSION = "0.34_01";
+$VERSION = "0.34_02";
$VERSION = eval $VERSION; # modperlstyle: convert the string into a number
$DEBUG = 0;
Although the username and password are optional, it is best to call this method
with a database handle or data source including a valid username and password -
-a DBI connection will be opened and the quoting and type mapping will be more
-reliable.
+a DBI connection will be opened and used to check the database version as well
+as for more reliable quoting and type mapping. Note that the database
+connection will be used passively, B<not> to actually run the CREATE
+statements.
If passed a DBI data source (or handle) such as `DBI:mysql:database' or
`DBI:Pg:dbname=database', will use syntax specific to that database engine.
map { $self->table($_)->sql_create_table($dbh); } $self->tables;
}
-=item sql_update_schema PROTOTYPE_SCHEMA [ DATABASE_HANDLE | DATA_SOURCE [ USERNAME PASSWORD [ ATTR ] ] ]
+=item sql_update_schema [ OPTIONS_HASHREF, ] PROTOTYPE_SCHEMA [ DATABASE_HANDLE | DATA_SOURCE [ USERNAME PASSWORD [ ATTR ] ] ]
Returns a list of SQL statements to update this schema so that it is idential
to the provided prototype schema, also a DBIx::DBSchema object.
- #Optionally, the data source can be specified by passing an open DBI database
- #handle, or by passing the DBI data source name, username and password.
- #
- #If passed a DBI data source (or handle) such as `DBI:mysql:database' or
- #`DBI:Pg:dbname=database', will use syntax specific to that database engine.
- #Currently supported databases are MySQL and PostgreSQL.
- #
- #If not passed a data source (or handle), or if there is no driver for the
- #specified database, will attempt to use generic SQL syntax.
-
-Right now this method knows how to add new tables and alter existing tables.
-It doesn't know how to drop tables yet.
+Right now this method knows how to add new tables and alter existing tables,
+including indices. If specifically requested by passing an options hashref
+with B<drop_tables> set true before all other arguments, it will also drop
+tables.
See L<DBIx::DBSchema::Table/sql_alter_table>,
L<DBIx::DBSchema::Column/sql_add_coumn> and
L<DBIx::DBSchema::Column/sql_alter_column> for additional specifics and
limitations.
+The data source can be specified by passing an open DBI database handle, or by
+passing the DBI data source name, username and password.
+
+Although the username and password are optional, it is best to call this method
+with a database handle or data source including a valid username and password -
+a DBI connection will be opened and used to check the database version as well
+as for more reliable quoting and type mapping. Note that the database
+connection will be used passively, B<not> to actually run the CREATE
+statements.
+
+If passed a DBI data source (or handle) such as `DBI:mysql:database' or
+`DBI:Pg:dbname=database', will use syntax specific to that database engine.
+Currently supported databases are MySQL and PostgreSQL.
+
+If not passed a data source (or handle), or if there is no driver for the
+specified database, will attempt to use generic SQL syntax.
+
=cut
#gosh, false laziness w/DBSchema::Table::sql_alter_schema
sub sql_update_schema {
- my($self, $new, $dbh) = ( shift, shift, _dbh(@_) );
+ #my($self, $new, $dbh) = ( shift, shift, _dbh(@_) );
+ my($self, $opt, $new, $dbh) = ( shift, _parse_opt(\@_), shift, _dbh(@_) );
my @r = ();
}
- # drop tables not in $new
- foreach my $table ( $self->tables ) {
+ if ( $opt->{'drop_tables'} ) {
- if ( !$new->table($table) ) {
+ warn "drop_tables enabled\n" if $DEBUG;
+
+ # drop tables not in $new
+ foreach my $table ( grep !$new->table($_), $self->tables ) {
warn "table $table should be dropped.\n" if $DEBUG;
- push @r,
- $self->table($table)->sql_drop_table( $dbh );
+ push @r, $self->table($table)->sql_drop_table( $dbh );
+
}
+
}
warn join("\n", @r). "\n"
}
-=item update_schema PROTOTYPE_SCHEMA, DATABASE_HANDLE | DATA_SOURCE [ USERNAME PASSWORD [ ATTR ] ]
+=item update_schema [ OPTIONS_HASHREF, ] PROTOTYPE_SCHEMA, DATABASE_HANDLE | DATA_SOURCE [ USERNAME PASSWORD [ ATTR ] ]
Same as sql_update_schema, except actually runs the SQL commands to update
the schema. Throws a fatal error if any statement fails.
=cut
sub update_schema {
- my($self, $new, $dbh) = ( shift, shift, _dbh(@_) );
+ #my($self, $new, $dbh) = ( shift, shift, _dbh(@_) );
+ my($self, $opt, $new, $dbh) = ( shift, _parse_opt(\@_), shift, _dbh(@_) );
- foreach my $statement ( $self->sql_update_schema( $new, $dbh ) ) {
+ foreach my $statement ( $self->sql_update_schema( $opt, $new, $dbh ) ) {
$dbh->do( $statement )
or die "Error: ". $dbh->errstr. "\n executing: $statement";
}
Foreign keys and other constraints are not yet supported.
Eventually it would be nice to have additional transformations (deleted,
-modified columns, deleted tables). sql_update_schema doesn't drop tables
-or deal with deleted or modified columns yet.
+modified columns). sql_update_schema doesn't deal with deleted or modified
+columns yet.
Need to port and test with additional databases
sub unique {
my $self = shift;
- carp ref($self) . "->unique method is deprecated; see ->indices";
+ carp ref($self) . "->unique method is deprecated; see ->indices";
#croak ref($self). "->unique method is deprecated; see ->indices";
- $self->_unique(@_);
+ $self->_unique(@_);
}
sub _unique {
carp ref($self). "->index method is deprecated; see ->indices";
#croak ref($self). "->index method is deprecated; see ->indices";
- $self->_index(@_);
+ $self->_index(@_);
}
Returns a list of SQL statements to alter this table so that it is identical
to the provided table, also a DBIx::DBSchema::Table object.
- #Optionally, the data source can be specified by passing an open DBI database
- #handle, or by passing the DBI data source name, username and password.
- #
- #If passed a DBI data source (or handle) such as `DBI:Pg:dbname=database', will
- #use PostgreSQL-specific syntax. Non-standard syntax for other engines (if
- #applicable) may also be supported in the future.
- #
- #If not passed a data source (or handle), or if there is no driver for the
- #specified database, will attempt to use generic SQL syntax.
+The data source can be specified by passing an open DBI database handle, or by
+passing the DBI data source name, username and password.
+
+Although the username and password are optional, it is best to call this method
+with a database handle or data source including a valid username and password -
+a DBI connection will be opened and used to check the database version as well
+as for more reliable quoting and type mapping. Note that the database
+connection will be used passively, B<not> to actually run the CREATE
+statements.
+
+If passed a DBI data source (or handle) such as `DBI:mysql:database' or
+`DBI:Pg:dbname=database', will use syntax specific to that database engine.
+Currently supported databases are MySQL and PostgreSQL.
+
+If not passed a data source (or handle), or if there is no driver for the
+specified database, will attempt to use generic SQL syntax.
=cut