X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FDBIx%2FClass%2FDeploymentHandler%2FDeployMethod%2FSQL%2FTranslator.pm;h=84340c5b06ab6999aace06daea62a58eabf8a6a0;hb=f1db4758786d0c5c3a7c94c9051c90e5df86fc87;hp=cf36dfad29701e4b7b44549a42b501b3735f74b6;hpb=9a3a62f18776c2b6fe11bbf8ce32d8c3e3d0dd45;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 cf36dfa..84340c5 100644 --- a/lib/DBIx/Class/DeploymentHandler/DeployMethod/SQL/Translator.pm +++ b/lib/DBIx/Class/DeploymentHandler/DeployMethod/SQL/Translator.pm @@ -104,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') } @@ -166,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!"; } } @@ -200,6 +203,37 @@ sub deploy { )); } +sub preinstall_scripts { + my $self = 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 @_} }; @@ -459,7 +493,7 @@ like the best way to describe the layout is with the following example: $sql_migration_dir |- SQLite | |- down - | | `- 1-2 + | | `- 2-1 | | `- 001-auto.sql | |- schema | | `- 1 @@ -471,14 +505,14 @@ like the best way to describe the layout is with the following example: | `- 001-auto.sql |- _common | |- down - | | `- 1-2 + | | `- 2-1 | | `- 002-remove-customers.pl | `- up | `- 1-2 | `- 002-generate-customers.pl |- _generic | |- down - | | `- 1-2 + | | `- 2-1 | | `- 001-auto.sql | |- schema | | `- 1 @@ -489,7 +523,7 @@ like the best way to describe the layout is with the following example: | `- 002-create-stored-procedures.sql `- MySQL |- down - | `- 1-2 + | `- 2-1 | `- 001-auto.sql |- schema | `- 1 @@ -519,8 +553,8 @@ generic enough to run on all databases. Good luck with that one. =head1 PERL SCRIPTS -A perl script for this tool is very simple. It merely needs to contain a -sub called C that takes a L as it's only argument. +A perl script for this tool is very simple. It merely needs to contain an +anonymous sub that takes a L as it's only argument. A very basic perl script might look like: #!perl @@ -528,7 +562,7 @@ A very basic perl script might look like: use strict; use warnings; - sub run { + sub { my $schema = shift; $schema->resultset('Users')->create({