package DBIx::Class::DeploymentHandler::Dad;
+# ABSTRACT: Parent class for DeploymentHandlers
+
use Moose;
use Method::Signatures::Simple;
require DBIx::Class::Schema; # loaded for type constraint
use Carp::Clan '^DBIx::Class::DeploymentHandler';
+use Log::Contextual::WarnLogger;
+use Log::Contextual ':log', -default_logger => Log::Contextual::WarnLogger->new({
+ env_prefix => 'DBICDH'
+});
has schema => (
isa => 'DBIx::Class::Schema',
is => 'ro',
required => 1,
- handles => ['schema_version'],
);
has backup_directory => (
has to_version => (
is => 'ro',
+ isa => 'Str',
lazy_build => 1,
);
-sub _build_to_version { $_[0]->schema->schema_version }
+sub _build_to_version { $_[0]->schema_version }
+
+has schema_version => (
+ is => 'ro',
+ isa => 'Str',
+ lazy_build => 1,
+);
+
+sub _build_schema_version { $_[0]->schema->schema_version }
method install {
+ log_info { '[DBICDH] installing version ' . $self->to_version };
croak 'Install not possible as versions table already exists in database'
if $self->version_storage_is_installed;
}
sub upgrade {
+ log_info { '[DBICDH] upgrading' };
my $self = shift;
while ( my $version_list = $self->next_version_set ) {
- my ($ddl, $upgrade_sql) = @{$self->upgrade_single_step($version_list)||[]};
+ my ($ddl, $upgrade_sql) = @{
+ $self->upgrade_single_step({ version_set => $version_list })
+ ||[]};
$self->add_database_version({
version => $version_list->[-1],
}
sub downgrade {
+ log_info { '[DBICDH] upgrading' };
my $self = shift;
while ( my $version_list = $self->previous_version_set ) {
- $self->downgrade_single_step($version_list);
+ $self->downgrade_single_step({ version_set => $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) }
+method backup {
+ log_info { '[DBICDH] backing up' };
+ $self->storage->backup($self->backup_directory)
+}
__PACKAGE__->meta->make_immutable;
1;
+# vim: ts=2 sw=2 expandtab
+
+__END__
+
=pod
=attr schema
The L<DBIx::Class::Schema> (B<required>) 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 that backups are stored in
+The directory where backups are stored
=attr to_version
Deploys the current schema into the database. Populates C<version_storage> with
C<version> and C<ddl>.
-B<Note>: you typically need to call C<< $dh->prepare_install >> before you call
+B<Note>: you typically need to call C<< $dh->prepare_deploy >> before you call
this method.
B<Note>: you cannot install on top of an already installed database
$dh->downgrade
Downgrades the database one step at a time till L</previous_version_set>
-returns C<undef>. Each downgrade step will delete a C<version>from the
+returns C<undef>. Each downgrade step will delete a C<version> from the
version storage.
=method backup
=head1 METHODS THAT ARE REQUIRED IN SUBCLASSES
+=head2 deploy
+
+See L<DBIx::Class::DeploymentHandler::HandlesDeploy/deploy>.
+
=head2 version_storage_is_installed
- warn q(I can't version this database!)
- unless $dh->version_storage_is_installed
+See L<DBIx::Class::DeploymentHandler::HandlesVersionStorage/version_storage_is_installed>.
-return true iff the version storage is installed.
+=head2 add_database_version
-=head2 deploy
+See L<DBIx::Class::DeploymentHandler::HandlesVersionStorage/add_database_version>.
- $dh->deploy
+=head2 delete_database_version
-Deploy the schema to the database.
+See L<DBIx::Class::DeploymentHandler::HandlesVersionStorage/delete_database_version>.
-=head2 add_database_version
+=head2 next_version_set
- $dh->add_database_version({
- version => '1.02',
- ddl => $ddl # can be undef,
- upgrade_sql => $sql # can be undef,
- });
+See L<DBIx::Class::DeploymentHandler::HandlesVersioning/next_version_set>.
-Store a new version into the version storage
+=head2 previous_version_set
-=head2 delete_database_version
+See L<DBIx::Class::DeploymentHandler::HandlesVersioning/previous_version_set>.
- $dh->delete_database_version({ version => '1.02' })
+=head2 upgrade_single_step
-simply deletes given database version from the version storage
+See L<DBIx::Class::DeploymentHandler::HandlesDeploy/upgrade_single_step>.
-=head2 next_version_set
+=head2 downgrade_single_step
- print 'versions to install: ';
- while (my $vs = $dh->next_version_set) {
- print join q(, ), @{$vs}
- }
- print qq(\n);
+See L<DBIx::Class::DeploymentHandler::HandlesDeploy/downgrade_single_step>.
-return an arrayref describing each version that needs to be
-installed to upgrade to C<< $dh->to_version >>.
+=head1 ORTHODOX METHODS
-=head2 previous_version_set
+These methods are not actually B<required> 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.
- print 'versions to uninstall: ';
- while (my $vs = $dh->previous_version_set) {
- print join q(, ), @{$vs}
- }
- print qq(\n);
+=head2 database_version
-return an arrayref describing each version that needs to be
-"installed" to downgrade to C<< $dh->to_version >>.
+see L<DBIx::Class::DeploymentHandler::HandlesVersionStorage/database_version>
-=head2 upgrade_single_step
+=head2 prepare_deploy
- my ($ddl, $sql) = @{$dh->upgrade_single_step($version_set)||[]}
+see L<DBIx::Class::DeploymentHandler::HandlesDeploy/prepare_deploy>
-call a single upgrade migration. Takes an arrayref describing the version to
-upgrade to. Optionally return an arrayref containing C<$ddl> describing
-version installed and C<$sql> used to get to that version.
+=head2 prepare_resultsource_install
-=head2 downgrade_single_step
+see L<DBIx::Class::DeploymentHandler::HandlesDeploy/prepare_resultsource_install>
- $dh->upgrade_single_step($version_set);
+=head2 install_resultsource
-call a single downgrade migration. Takes an arrayref describing the version to
-downgrade to.
+see L<DBIx::Class::DeploymentHandler::HandlesDeploy/install_resultsource>
-__END__
+=head2 prepare_upgrade
+
+see L<DBIx::Class::DeploymentHandler::HandlesDeploy/prepare_upgrade>
+
+=head2 prepare_downgrade
+
+see L<DBIx::Class::DeploymentHandler::HandlesDeploy/prepare_downgrade>
+
+=head2 SUBCLASSING
+
+All of the methods mentioned in L</METHODS THAT ARE REQUIRED IN SUBCLASSES> and
+L</ORTHODOX METHODS> 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<DBIx::Class::DeploymentHandler> and
+L<DBIx::Class::DeploymentHandler::Deprecated>, 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<DBIx::Class::DeploymentHandler::HandlesDeploy>,
+L<DBIx::Class::DeploymentHandler::HandlesVersioning>, and
+L<DBIx::Class::DeploymentHandler::HandlesVersionStorage>.
-vim: ts=2 sw=2 expandtab