X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FDeploymentHandler.pm;h=74602ed3ec5deb9a20a97699edf4d8edc1ff0dd7;hb=88fecddb0e689b3ecdbefdf9ba4912ad301ba357;hp=a792c25d22bd3cf1df5c3d5bf746b1eb6a6b0e13;hpb=6df6dcb95ffa56978b1cb0aa9e6b0b4ca012a573;p=dbsrgits%2FDBIx-Class-DeploymentHandler.git diff --git a/lib/DBIx/Class/DeploymentHandler.pm b/lib/DBIx/Class/DeploymentHandler.pm index a792c25..74602ed 100644 --- a/lib/DBIx/Class/DeploymentHandler.pm +++ b/lib/DBIx/Class/DeploymentHandler.pm @@ -12,7 +12,9 @@ with 'DBIx::Class::DeploymentHandler::WithApplicatorDumple' => { class_name => 'DBIx::Class::DeploymentHandler::DeployMethod::SQL::Translator', delegate_name => 'deploy_method', attributes_to_assume => [qw(schema schema_version)], - attributes_to_copy => [qw( databases script_directory sql_translator_args )], + attributes_to_copy => [qw( + ignore_ddl databases script_directory sql_translator_args force_overwrite + )], }, 'DBIx::Class::DeploymentHandler::WithApplicatorDumple' => { interface_role => 'DBIx::Class::DeploymentHandler::HandlesVersioning', @@ -31,17 +33,20 @@ with 'DBIx::Class::DeploymentHandler::WithReasonableDefaults'; sub prepare_version_storage_install { my $self = shift; - $self->prepare_resultsource_install( - $self->version_storage->version_rs->result_source - ); + $self->prepare_resultsource_install({ + result_source => $self->version_storage->version_rs->result_source + }); } sub install_version_storage { my $self = shift; - $self->install_resultsource( - $self->version_storage->version_rs->result_source - ); + my $version = (shift||{})->{version} || $self->schema_version; + + $self->install_resultsource({ + result_source => $self->version_storage->version_rs->result_source, + version => $version, + }); } sub prepare_install { @@ -54,6 +59,85 @@ sub prepare_install { sub BUILD { $_[0]->version_storage } __PACKAGE__->meta->make_immutable; +sub dev_version_instaled { shift->database_version eq 'DEV' } + +use SQL::Translator; +sub install_dev_version { + my ($self, $extra) = @_; + + die 'roll back existing dev version before installing a new dev version' + if $self->dev_version_installed; + + my $from_schema = do { + my $t = SQL::Translator->new({ + debug => 0, + trace => 0, + parser => 'SQL::Translator::Parser::YAML', + }); + $t->translate($self->deploy_method->_ddl_protoschema_produce_filename( + $self->database_version, $self->script_directory + ) or die $t->error; + $t->schema; + }; + + my $to_schema = do { + my $t = SQL::Translator->new({ + parser => 'SQL::Translator::Parser::DBIx::Class', + parser_args => { + package => $self->schema, + }, + }); + $t->translate or die $t->error; + $t->schema; + }; + + my $db = $self->deploy_method->storage->sqlt_type; + + my @up = [SQL::Translator::Diff::schema_diff( + $source_schema, $db, + $dest_schema, $db, + $sqltargs + )]; + + my @down = [SQL::Translator::Diff::schema_diff( + $dest_schema, $db, + $source_schema, $db, + $sqltargs + )]; + + $self->deploy_method->_run_sql_array(\@up); + + $self->version_storage->version_rs->create({ + version => 'DEV', + upgrade_sql => \@up, + downgrade_sql => \@down, + extra => $extra, + }); +} + +sub remove_dev_version { + my ($self, $extra) = @_; + + die 'no dev version installed to remove' + unless $self->dev_version_installed; + + my ($dev_data, $to_version) = $self->version_storage + ->version_rs + ->search(undef, { + order_by => { -desc => 'id' }, + rows => 2, + })->all; + + $self->deploy_method->_run_sql_array(\@sql_to_run); + + $self->version_storage->version_rs->create({ + version => $to_version->version, + upgrade_sql => \@sql_to_run, + downgrade_sql => [], # not meant to be "reverted" + extra => $extra + }) +} + 1; #vim: ts=2 sw=2 expandtab @@ -86,20 +170,23 @@ or for upgrades: sql_translator_args => { add_drop_table => 0 }, }); - $dh->prepare_upgrade(1, 2); + $dh->prepare_upgrade({ + from_version => 1, + to_version => 2, + }); $dh->upgrade; =head1 DESCRIPTION -C is, as it's name suggests, a tool for +C is, as its name suggests, a tool for deploying and upgrading databases with L. It is designed to be much more flexible than L, hence the use of L and lots of roles. C itself is just a recommended set of roles -that we think will not only work well for everyone, but will also yeild the -best overall mileage. Each role it uses has it's own nuances and +that we think will not only work well for everyone, but will also yield the +best overall mileage. Each role it uses has its own nuances and documentation, so I won't describe all of them here, but here are a few of the major benefits over how L worked (and L tries to maintain compatibility @@ -171,10 +258,14 @@ Install the version storage and not the rest of the tables You started your project and weren't using C? Lucky for you I had you in mind when I wrote this doc. -First off, you'll want to just install the C: +First, +L +in your main schema file (maybe using C<$VERSION>). + +Then you'll want to just install the version_storage: my $s = My::Schema->connect(...); - my $dh = DBIx::Class::DeploymentHandler->({ schema => $s }); + my $dh = DBIx::Class::DeploymentHandler->new({ schema => $s }); $dh->prepare_version_storage_install; $dh->install_version_storage; @@ -185,6 +276,21 @@ Then set your database version: Now you should be able to use C like normal! +=head1 LOGGING + +This is a complex tool, and because of that sometimes you'll want to see +what exactly is happening. The best way to do that is to use the built in +logging functionality. It the standard six log levels; C, C, +C, C, C, and C. Most of those are pretty self +explanatory. Generally a safe level to see what all is going on is debug, +which will give you everything except for the exact SQL being run. + +To enable the various logging levels all you need to do is set an environment +variables: C, C, C, C, +C, and C. Each level can be set on its own, +but the default is the first three on and the last three off, and the levels +cascade, so if you turn on trace the rest will turn on automatically. + =head1 DONATIONS If you'd like to thank me for the work I've done on this module, don't give me