X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FDeploymentHandler%2FDad.pm;h=974884e2e103f9148009d5d95acc62ea6bdfc627;hb=ed45e175a490befb264f8d20f3e5702b6b0b22aa;hp=2c19b3d3afa6391c74321087b99bcf209a99159a;hpb=c4f4d4a2795f30717ae026c4a44b8a36a86ddcfb;p=dbsrgits%2FDBIx-Class-DeploymentHandler.git diff --git a/lib/DBIx/Class/DeploymentHandler/Dad.pm b/lib/DBIx/Class/DeploymentHandler/Dad.pm index 2c19b3d..974884e 100644 --- a/lib/DBIx/Class/DeploymentHandler/Dad.pm +++ b/lib/DBIx/Class/DeploymentHandler/Dad.pm @@ -1,59 +1,45 @@ package DBIx::Class::DeploymentHandler::Dad; +# ABSTRACT: Parent class for DeploymentHandlers + use Moose; use Method::Signatures::Simple; -use DBIx::Class::DeploymentHandler::Types; require DBIx::Class::Schema; # loaded for type constraint -require DBIx::Class::ResultSet; # loaded for type constraint use Carp::Clan '^DBIx::Class::DeploymentHandler'; has schema => ( isa => 'DBIx::Class::Schema', is => 'ro', required => 1, - handles => ['schema_version'], -); - -has upgrade_directory => ( # configuration - isa => 'Str', - is => 'ro', - required => 1, - default => 'sql', ); -has backup_directory => ( # configuration +has backup_directory => ( isa => 'Str', is => 'ro', predicate => 'has_backup_directory', ); -has to_version => ( # configuration +has to_version => ( is => 'ro', lazy_build => 1, ); -sub _build_to_version { $_[0]->schema->schema_version } +sub _build_to_version { $_[0]->schema_version } -has databases => ( # configuration - coerce => 1, - isa => 'DBIx::Class::DeploymentHandler::Databases', - is => 'ro', - default => sub { [qw( MySQL SQLite PostgreSQL )] }, +has schema_version => ( + is => 'ro', + lazy_build => 1, ); -has sqltargs => ( # configuration - isa => 'HashRef', - is => 'ro', - default => sub { {} }, -); +sub _build_schema_version { $_[0]->schema->schema_version } method install { croak 'Install not possible as versions table already exists in database' if $self->version_storage_is_installed; - my $ddl = $self->_deploy; + my $ddl = $self->deploy; - $self->version_storage->add_database_version({ + $self->add_database_version({ version => $self->to_version, ddl => $ddl, }); @@ -62,40 +48,169 @@ method install { sub upgrade { my $self = shift; while ( my $version_list = $self->next_version_set ) { - $self->_upgrade_single_step($version_list); + my ($ddl, $upgrade_sql) = @{$self->upgrade_single_step($version_list)||[]}; $self->add_database_version({ version => $version_list->[-1], - # ddl => $ddl, - # upgrade_sql => $upgrade_sql, + ddl => $ddl, + upgrade_sql => $upgrade_sql, }); } } +sub downgrade { + my $self = shift; + while ( my $version_list = $self->previous_version_set ) { + $self->downgrade_single_step($version_list); + + # do we just delete a row here? I think so but not sure + $self->delete_database_version({ version => $version_list->[-1] }); + } +} + method backup { $self->storage->backup($self->backup_directory) } __PACKAGE__->meta->make_immutable; 1; +# vim: ts=2 sw=2 expandtab + +__END__ + =pod =attr schema -=attr upgrade_directory +The L (B) that is used to talk to the database +and generate the DDL. + +=attr schema_version + +The version that the schema is currently at. Defaults to +C<< $self->schema->schema_version >>. =attr backup_directory +The directory where backups are stored + =attr to_version -=attr databases +The version (defaults to schema's version) to migrate the database to =method install + $dh->install + +Deploys the current schema into the database. Populates C with +C and C. + +B: you typically need to call C<< $dh->prepare_deploy >> before you call +this method. + +B: you cannot install on top of an already installed database + =method upgrade + $dh->upgrade + +Upgrades the database one step at a time till L +returns C. Each upgrade step will add a C, C, and +C to the version storage (if C and/or C are +returned from L. + +=method downgrade + + $dh->downgrade + +Downgrades the database one step at a time till L +returns C. Each downgrade step will delete a C from the +version storage. + =method backup -__END__ + $dh->backup + +Simply calls backup on the C<< $schema->storage >>, passing in +C<< $self->backup_directory >> as an argument. Please test yourself before +assuming it will work. + +=head1 METHODS THAT ARE REQUIRED IN SUBCLASSES + +=head2 deploy + +See L. + +=head2 version_storage_is_installed + +See L. + +=head2 add_database_version + +See L. + +=head2 delete_database_version + +See L. + +=head2 next_version_set + +See L. + +=head2 previous_version_set + +See L. + +=head2 upgrade_single_step + +See L. + +=head2 downgrade_single_step + +See L. + +=head1 ORTHODOX METHODS + +These methods are not actually B as things will probably still work +if you don't implement them, but if you want your subclass to get along with +other subclasses (or more likely, tools made to use another subclass), you +should probably implement these too, even if they are no-ops. + +=head2 database_version + +see L + +=head2 prepare_deploy + +see L + +=head2 prepare_resultsource_install + +see L + +=head2 install_resultsource + +see L + +=head2 prepare_upgrade + +see L + +=head2 prepare_downgrade + +see L + +=head2 SUBCLASSING + +All of the methods mentioned in L and +L can be implemented in any fashion you choose. In the +spirit of code reuse I have used roles to implement them in my two subclasses, +L and +L, but you are free to implement +them entirely in a subclass if you so choose to. + +For in-depth documentation on how methods are supposed to work, see the roles +L, +L, and +L. -vim: ts=2 sw=2 expandtab