croak since we have no throw_exception
[dbsrgits/DBIx-Class-DeploymentHandler.git] / lib / DBIx / Class / DeploymentHandler / DeployMethod / SQL / Translator.pm
index 4b6c9f5..00953d8 100644 (file)
@@ -1,16 +1,22 @@
 package DBIx::Class::DeploymentHandler::DeployMethod::SQL::Translator;
 use Moose;
+
+use autodie;
+use Carp qw( carp croak );
+
 use Method::Signatures::Simple;
 use Try::Tiny;
+
 use SQL::Translator;
 require SQL::Translator::Diff;
+
 require DBIx::Class::Storage;   # loaded for type constraint
-use autodie;
-use File::Path;
+use DBIx::Class::DeploymentHandler::Types;
 
-with 'DBIx::Class::DeploymentHandler::HandlesDeploy';
+use File::Path 'mkpath';
+use File::Spec::Functions;
 
-use Carp 'carp';
+with 'DBIx::Class::DeploymentHandler::HandlesDeploy';
 
 has schema => (
   isa      => 'DBIx::Class::Schema',
@@ -53,6 +59,7 @@ has databases => (
 has _filedata => (
   isa => 'ArrayRef[Str]',
   is  => 'rw',
+  default => sub { [] },
 );
 
 has txn_wrap => (
@@ -64,28 +71,29 @@ has txn_wrap => (
 method __ddl_consume_with_prefix($type, $versions, $prefix) {
   my $base_dir = $self->upgrade_directory;
 
-  my $main    = File::Spec->catfile( $base_dir, $type                         );
-  my $generic = File::Spec->catfile( $base_dir, '_generic'                    );
-  my $common =  File::Spec->catfile( $base_dir, '_common', $prefix, join q(-), @{$versions} );
+  my $main    = catfile( $base_dir, $type      );
+  my $generic = catfile( $base_dir, '_generic' );
+  my $common  =
+    catfile( $base_dir, '_common', $prefix, join q(-), @{$versions} );
 
   my $dir;
   if (-d $main) {
-    $dir = File::Spec->catfile($main, $prefix, join q(-), @{$versions})
+    $dir = catfile($main, $prefix, join q(-), @{$versions})
   } elsif (-d $generic) {
-    $dir = File::Spec->catfile($main, $prefix, join q(-), @{$versions})
+    $dir = catfile($generic, $prefix, join q(-), @{$versions});
   } else {
-    die 'PREPARE TO SQL'
+    croak "neither $main or $generic exist; please write/generate some SQL";
   }
 
   opendir my($dh), $dir;
-  my %files = map { $_ => "$dir/$_" } grep { /\.sql$/ && -f "$dir/$_" } readdir($dh);
+  my %files = map { $_ => "$dir/$_" } grep { /\.sql$/ && -f "$dir/$_" } readdir $dh;
   closedir $dh;
 
   if (-d $common) {
     opendir my($dh), $common;
-    for my $filename (grep { /\.sql$/ && -f "$common/$_" } readdir($dh)) {
+    for my $filename (grep { /\.sql$/ && -f catfile($common,$_) } readdir $dh) {
       unless ($files{$filename}) {
-        $files{$filename} = "$common/$_";
+        $files{$filename} = catfile($common,$filename);
       }
     }
     closedir $dh;
@@ -99,15 +107,10 @@ method _ddl_schema_consume_filenames($type, $version) {
 }
 
 method _ddl_schema_produce_filename($type, $version) {
-  my $base_dir = $self->upgrade_directory;
-  my $dirname = File::Spec->catfile(
-    $base_dir, $type, 'schema', $version
-  );
-  File::Path::mkpath($dirname) unless -d $dirname;
+  my $dirname = catfile( $self->upgrade_directory, $type, 'schema', $version );
+  mkpath($dirname) unless -d $dirname;
 
-  return File::Spec->catfile(
-    $dirname, '001-auto.sql'
-  );
+  return catfile( $dirname, '001-auto.sql' );
 }
 
 method _ddl_schema_up_consume_filenames($type, $versions) {
@@ -121,38 +124,18 @@ method _ddl_schema_down_consume_filenames($type, $versions) {
 method _ddl_schema_up_produce_filename($type, $versions) {
   my $dir = $self->upgrade_directory;
 
-  my $dirname = File::Spec->catfile(
-    $dir, $type, 'up', join( q(-), @{$versions} )
-  );
-  File::Path::mkpath($dirname) unless -d $dirname;
+  my $dirname = catfile( $dir, $type, 'up', join q(-), @{$versions});
+  mkpath($dirname) unless -d $dirname;
 
-  return File::Spec->catfile(
-    $dirname, '001-auto.sql'
+  return catfile( $dirname, '001-auto.sql'
   );
 }
 
 method _ddl_schema_down_produce_filename($type, $versions, $dir) {
-  my $dirname = File::Spec->catfile(
-    $dir, $type, 'down', join( q(-), @{$versions} )
-  );
-  File::Path::mkpath($dirname) unless -d $dirname;
+  my $dirname = catfile( $dir, $type, 'down', join q(-), @{$versions} );
+  mkpath($dirname) unless -d $dirname;
 
-  return File::Spec->catfile(
-    $dirname, '001-auto.sql'
-  );
-}
-
-method _deployment_statements {
-  my $type     = $self->storage->sqlt_type;
-  my $version  = $self->schema_version;
-
-  for my $filename (@{$self->_ddl_schema_consume_filenames($type, $version)}) {
-      open my $file, q(<), $filename
-        or carp "Can't open $filename ($!)";
-      my @rows = <$file>;
-      close $file;
-      return join '', @rows;
-  }
+  return catfile( $dirname, '001-auto.sql');
 }
 
 sub _deploy {
@@ -161,9 +144,12 @@ sub _deploy {
 
   my $guard = $self->schema->txn_scope_guard if $self->txn_wrap;
 
-  foreach my $line ( split /;\n/, $self->_deployment_statements ) {
-    $line = join '', grep { !/^--/ } split /\n/, $line;
-    next if !$line || $line =~ /^BEGIN TRANSACTION|^COMMIT|^\s+$/;
+  my @sql = map @{$self->_read_sql_file($_)}, @{$self->_ddl_schema_consume_filenames(
+      $self->storage->sqlt_type,
+      $self->schema_version
+    )};
+
+  foreach my $line (@sql) {
     $storage->_query_start($line);
     try {
       # do a dbh_do cycle here, as we need some error checking in
@@ -177,6 +163,7 @@ sub _deploy {
   }
 
   $guard->commit if $self->txn_wrap;
+  return join "\n", @sql;
 }
 
 sub prepare_install {
@@ -187,22 +174,16 @@ sub prepare_install {
   my $sqltargs  = $self->sqltargs;
   my $version = $schema->schema_version;
 
-  unless( -d $dir ) {
-    carp "Upgrade directory $dir does not exist, using ./\n";
-    $dir = './';
-  }
-
-
   my $sqlt = SQL::Translator->new({
     add_drop_table          => 1,
     ignore_constraint_names => 1,
     ignore_index_names      => 1,
     parser                  => 'SQL::Translator::Parser::DBIx::Class',
-    %{$sqltargs || {}}
+    %{$sqltargs}
   });
 
-  my $sqlt_schema = $sqlt->translate({ data => $schema })
-    or $self->throw_exception ($sqlt->error);
+  my $sqlt_schema = $sqlt->translate( data => $schema )
+    or croak($sqlt->error);
 
   foreach my $db (@$databases) {
     $sqlt->reset;
@@ -220,11 +201,7 @@ sub prepare_install {
       carp("Failed to translate to $db, skipping. (" . $sqlt->error . ")");
       next;
     }
-    my $file;
-    unless( open $file, q(>), $filename ) {
-      $self->throw_exception("Can't open $filename for writing ($!)");
-      next;
-    }
+    open my $file, q(>), $filename;
     print {$file} $output;
     close $file;
   }
@@ -233,7 +210,7 @@ sub prepare_install {
 sub prepare_upgrade {
   my ($self, $from_version, $to_version, $version_set) = @_;
 
-  $from_version ||= $self->db_version;
+  $from_version ||= '1.0'; #$self->database_version;
   $to_version   ||= $self->schema_version;
 
   # for updates prepared automatically (rob's stuff)
@@ -276,8 +253,8 @@ method _prepare_changegrade($from_version, $to_version, $version_set, $direction
   my $sqlt = SQL::Translator->new( $sqltargs );
 
   $sqlt->parser('SQL::Translator::Parser::DBIx::Class');
-  my $sqlt_schema = $sqlt->translate({ data => $schema })
-    or $self->throw_exception ($sqlt->error);
+  my $sqlt_schema = $sqlt->translate( data => $schema )
+    or croak($sqlt->error);
 
   foreach my $db (@$databases) {
     $sqlt->reset;
@@ -305,10 +282,10 @@ method _prepare_changegrade($from_version, $to_version, $version_set, $direction
       });
 
       $t->parser( $db ) # could this really throw an exception?
-        or $self->throw_exception ($t->error);
+        or croak($t->error);
 
       my $out = $t->translate( $prefilename )
-        or $self->throw_exception ($t->error);
+        or croak($t->error);
 
       $source_schema = $t->schema;
 
@@ -329,11 +306,11 @@ method _prepare_changegrade($from_version, $to_version, $version_set, $direction
       });
 
       $t->parser( $db ) # could this really throw an exception?
-        or $self->throw_exception ($t->error);
+        or croak($t->error);
 
       my $filename = $self->_ddl_schema_produce_filename($db, $to_version, $dir);
       my $out = $t->translate( $filename )
-        or $self->throw_exception ($t->error);
+        or croak($t->error);
 
       $dest_schema = $t->schema;
 
@@ -346,11 +323,7 @@ method _prepare_changegrade($from_version, $to_version, $version_set, $direction
        $dest_schema,   $db,
        $sqltargs
     );
-    my $file;
-    unless(open $file, q(>), $diff_file) {
-      $self->throw_exception("Can't write to $diff_file ($!)");
-      next;
-    }
+    open my $file, q(>), $diff_file;
     print {$file} $diff;
     close $file;
   }
@@ -359,37 +332,31 @@ method _prepare_changegrade($from_version, $to_version, $version_set, $direction
 method _read_sql_file($file) {
   return unless $file;
 
-  open my $fh, '<', $file or carp("Can't open upgrade file, $file ($!)");
-  my @data = split /\n/, join '', <$fh>;
+  open my $fh, '<', $file;
+  my @data = split /;\n/, join '', <$fh>;
   close $fh;
 
   @data = grep {
-    $_ &&
-    !/^--/ &&
-    !/^(BEGIN|BEGIN TRANSACTION|COMMIT)/m
-  } split /;/,
-    join '', @data;
+    $_ && # remove blank lines
+    !/^(BEGIN|BEGIN TRANSACTION|COMMIT)/ # strip txn's
+  } map {
+    s/^\s+//; s/\s+$//; # trim whitespace
+    join '', grep { !/^--/ } split /\n/ # remove comments
+  } @data;
 
   return \@data;
 }
 
-# these are exactly the same for now
 sub _downgrade_single_step {
   my $self = shift;
   my @version_set = @{ shift @_ };
-  my @upgrade_files = @{$self->_ddl_schema_up_consume_filenames(
+  my @downgrade_files = @{$self->_ddl_schema_down_consume_filenames(
     $self->storage->sqlt_type,
     \@version_set,
   )};
 
-  for my $upgrade_file (@upgrade_files) {
-    unless (-f $upgrade_file) {
-      # croak?
-      carp "Upgrade not possible, no upgrade file found ($upgrade_file), please create one\n";
-      return;
-    }
-
-    $self->_filedata($self->_read_sql_file($upgrade_file)); # I don't like this --fREW 2010-02-22
+  for my $downgrade_file (@downgrade_files) {
+    $self->_filedata($self->_read_sql_file($downgrade_file)); # I don't like this --fREW 2010-02-22
 
     my $guard = $self->schema->txn_scope_guard if $self->txn_wrap;
     $self->_do_upgrade;
@@ -406,12 +373,6 @@ sub _upgrade_single_step {
   )};
 
   for my $upgrade_file (@upgrade_files) {
-    unless (-f $upgrade_file) {
-      # croak?
-      carp "Upgrade not possible, no upgrade file found ($upgrade_file), please create one\n";
-      return;
-    }
-
     $self->_filedata($self->_read_sql_file($upgrade_file)); # I don't like this --fREW 2010-02-22
     my $guard = $self->schema->txn_scope_guard if $self->txn_wrap;
     $self->_do_upgrade;
@@ -422,7 +383,6 @@ sub _upgrade_single_step {
 method _do_upgrade { $self->_run_upgrade(qr/.*?/) }
 
 method _run_upgrade($stm) {
-  return unless $self->_filedata;
   my @statements = grep { $_ =~ $stm } @{$self->_filedata};
 
   for (@statements) {
@@ -437,6 +397,8 @@ method _apply_statement($statement) {
   $self->storage->dbh->do($_) or carp "SQL was: $_"
 }
 
+__PACKAGE__->meta->make_immutable;
+
 1;
 
 __END__