X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FDeploymentHandler%2FDeployMethod%2FSQL%2FTranslator.pm;h=7adfa6116e8c56067072471d8be3e4ccf08dda4a;hb=538a79a7b8ed3611e535a828c8428b34a7419374;hp=6de2694d6658bf8f52fb83266239dfcf76a0c277;hpb=92c34cab12b48aa8e779b1ce0a0e5affcb30cdaa;p=dbsrgits%2FDBIx-Class-DeploymentHandler.git diff --git a/lib/DBIx/Class/DeploymentHandler/DeployMethod/SQL/Translator.pm b/lib/DBIx/Class/DeploymentHandler/DeployMethod/SQL/Translator.pm index 6de2694..7adfa61 100644 --- a/lib/DBIx/Class/DeploymentHandler/DeployMethod/SQL/Translator.pm +++ b/lib/DBIx/Class/DeploymentHandler/DeployMethod/SQL/Translator.pm @@ -1,6 +1,8 @@ package DBIx::Class::DeploymentHandler::DeployMethod::SQL::Translator; use Moose; +# ABSTRACT: Manage your SQL and Perl migrations in nicely laid out directories + use autodie; use Carp qw( carp croak ); @@ -22,7 +24,6 @@ has schema => ( isa => 'DBIx::Class::Schema', is => 'ro', required => 1, - handles => [qw( schema_version )], ); has storage => ( @@ -37,7 +38,7 @@ method _build_storage { $s } -has sqltargs => ( +has sql_translator_args => ( isa => 'HashRef', is => 'ro', default => sub { {} }, @@ -62,6 +63,13 @@ has txn_wrap => ( default => 1, ); +has schema_version => ( + is => 'ro', + lazy_build => 1, +); + +method _build_schema_version { $self->schema->schema_version } + method __ddl_consume_with_prefix($type, $versions, $prefix) { my $base_dir = $self->upgrade_directory; @@ -96,6 +104,10 @@ method __ddl_consume_with_prefix($type, $versions, $prefix) { return [@files{sort keys %files}] } +method _ddl_preinstall_consume_filenames($type, $version) { + $self->__ddl_consume_with_prefix($type, [ $version ], 'preinstall') +} + method _ddl_schema_consume_filenames($type, $version) { $self->__ddl_consume_with_prefix($type, [ $version ], 'schema') } @@ -158,22 +170,21 @@ method _run_sql_and_perl($filenames) { $storage->_query_end($line); } } elsif ( $filename =~ /^(.+)\.pl$/ ) { - my $package = $1; my $filedata = do { local( @ARGV, $/ ) = $filename; <> }; - # make the package name more palateable to perl - $package =~ s/\W/_/g; no warnings 'redefine'; - eval "package $package;\n\n$filedata"; + my $fn = eval "$filedata"; use warnings; - if (my $fn = $package->can('run')) { - $fn->($self->schema); + if ($@) { + carp "$filename failed to compile: $@"; + } elsif (ref $fn eq 'CODE') { + $fn->($self->schema) } else { - carp "$filename should define a run method that takes a schema but it didn't!"; + carp "$filename should define an anonymouse sub that takes a schema but it didn't!"; } } else { - croak "A file got to deploy that wasn't sql or perl!"; + croak "A file ($filename) got to deploy that wasn't sql or perl!"; } } @@ -192,14 +203,45 @@ sub deploy { )); } -sub _prepare_install { +sub preinstall_scripts { my $self = shift; - my $sqltargs = { %{$self->sqltargs}, %{shift @_} }; + my $version = shift || $self->schema_version; + + my @files = @{$self->_ddl_preinstall_consume_filenames( + $self->storage->sqlt_type, + $version, + )}; + + for my $filename (@files) { + # We ignore sql for now (till I figure out what to do with it) + if ( $filename =~ /^(.+)\.pl$/ ) { + my $filedata = do { local( @ARGV, $/ ) = $filename; <> }; + + no warnings 'redefine'; + my $fn = eval "$filedata"; + use warnings; + + if ($@) { + carp "$filename failed to compile: $@"; + } elsif (ref $fn eq 'CODE') { + $fn->() + } else { + carp "$filename should define an anonymous sub but it didn't!"; + } + } else { + croak "A file ($filename) got to preinstall_scripts that wasn't sql or perl!"; + } + } +} + +sub _prepare_install { + my $self = shift; + my $sqltargs = { %{$self->sql_translator_args}, %{shift @_} }; my $to_file = shift; my $schema = $self->schema; my $databases = $self->databases; my $dir = $self->upgrade_directory; - my $version = $schema->schema_version; + my $version = $self->schema_version; my $sqlt = SQL::Translator->new({ add_drop_table => 1, @@ -270,7 +312,7 @@ sub prepare_resultsource_install { }, $filename); } -sub prepare_install { +sub prepare_deploy { my $self = shift; $self->_prepare_install({}, '_ddl_schema_produce_filename'); } @@ -290,9 +332,9 @@ method _prepare_changegrade($from_version, $to_version, $version_set, $direction my $schema = $self->schema; my $databases = $self->databases; my $dir = $self->upgrade_directory; - my $sqltargs = $self->sqltargs; + my $sqltargs = $self->sql_translator_args; - my $schema_version = $schema->schema_version; + my $schema_version = $self->schema_version; $sqltargs = { add_drop_table => 1, @@ -539,9 +581,9 @@ and generate the DDL. The L that is I used to talk to the database and generate the DDL. This is automatically created with L. -=attr sqltargs +=attr sql_translator_args -#rename +The arguments that get passed to L when it's used. =attr upgrade_directory @@ -557,6 +599,11 @@ generate files for Set to true (which is the default) to wrap all upgrades and deploys in a single transaction. +=attr schema_version + +The version the schema on your harddrive is at. Defaults to +C<< $self->schema->schema_version >>. + =method __ddl_consume_with_prefix $dm->__ddl_consume_with_prefix( 'SQLite', [qw( 1.00 1.01 )], 'up' )