heirarchy should work now, next up, tests
[dbsrgits/DBIx-Class-DeploymentHandler.git] / lib / DBIx / Class / DeploymentHandler / DeployMethod / SQL / Translator.pm
index 7622ff2..467581e 100644 (file)
@@ -6,6 +6,7 @@ use SQL::Translator;
 require SQL::Translator::Diff;
 require DBIx::Class::Storage;   # loaded for type constraint
 use autodie;
+use File::Path;
 
 with 'DBIx::Class::DeploymentHandler::HandlesDeploy';
 
@@ -54,65 +55,67 @@ has _filedata => (
   is  => 'rw',
 );
 
-method _ddl_schema_in_filenames($type, $version, $dir) {
-  my $filename = ref $self->schema;
-  $filename =~ s/::/-/g;
+method __ddl_in_with_prefix($type, $versions, $prefix) {
+  my $base_dir = $self->upgrade_directory;
 
-  my %files;
+  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} );
 
-  if (-d "$dir/$type") {
-    my $dirname = File::Spec->catfile(
-      $dir, $type, 'schema', $version, '001-auto.sql'
-    );
-    opendir my $dh, $dirname;
-    %files = map { $_ => "$dirname/$_" } grep { -f "$dirname/$_" } readdir($dh);
-    closedir $dh;
-
-  } elsif (-d "$dir/_generic") {
-    $filename = File::Spec->catfile(
-      $dir, '_generic', 'schema', $version, '001-auto.sql'
-    );
+  my $dir;
+  if (-d $main) {
+    $dir = File::Spec->catfile($main, $prefix, join q(-), @{$versions})
+  } elsif (-d $generic) {
+    $dir = File::Spec->catfile($main, $prefix, join q(-), @{$versions})
   } else {
-    $filename = File::Spec->catfile(
-      $dir, '_common', 'schema', $version, '001-auto.sql'
-    );
+    die 'PREPARE TO SQL'
   }
 
-  return [$filename];
-}
+  opendir my($dh), $dir;
+  my %files = map { $_ => "$dir/$_" } grep { /\.sql$/ && -f "$dir/$_" } readdir($dh);
+  closedir $dh;
 
-method _ddl_schema_out_filename($type, $version, $dir) {
-  my $filename = ref $self->schema;
-  $filename =~ s/::/-/g;
+  if (-d $common) {
+    opendir my($dh), $common;
+    for my $filename (grep { /\.sql$/ && -f "$common/$_" } readdir($dh)) {
+      unless ($files{$filename}) {
+        $files{$filename} = "$common/$_";
+      }
+    }
+    closedir $dh;
+  }
 
-  $filename = File::Spec->catfile(
-    $dir, $type, 'schema', $version, '001-auto.sql'
-  );
-  );
+  return [@files{sort keys %files}]
+}
 
-  return $filename;
+method _ddl_schema_in_filenames($type, $version) {
+  $self->__ddl_in_with_prefix($type, [ $version ], 'schema')
 }
 
-method _ddl_schema_diff_in_filenames($type, $versions, $dir) {
-  my $filename = ref $self->schema;
-  $filename =~ s/::/-/g;
+method _ddl_schema_out_filename($type, $version, $dir) {
+  my $dirname = File::Spec->catfile(
+    $dir, $type, 'schema', $version
+  );
+  File::Path::mkpath($dirname) unless -d $dirname;
 
-  $filename = File::Spec->catfile(
-    $dir, $type, 'diff', join( q(-), @{$versions} ), '001-auto.sql'
+  return File::Spec->catfile(
+    $dirname, '001-auto.sql'
   );
+}
 
-  return [ $filename ];
+method _ddl_schema_diff_in_filenames($type, $versions, $dir) {
+  $self->__ddl_in_with_prefix($type, $versions, 'diff')
 }
 
 method _ddl_schema_diff_out_filename($type, $versions, $dir) {
-  my $filename = ref $self->schema;
-  $filename =~ s/::/-/g;
-
-  $filename = File::Spec->catfile(
-    $dir, $type, 'diff', join( q(-), @{$versions} ), '001-auto.sql'
+  my $dirname = File::Spec->catfile(
+    $dir, $type, 'diff', join( q(-), @{$versions} )
   );
+  File::Path::mkpath($dirname) unless -d $dirname;
 
-  return $filename;
+  return File::Spec->catfile(
+    $dirname, '001-auto.sql'
+  );
 }
 
 method _deployment_statements {
@@ -122,7 +125,7 @@ method _deployment_statements {
   my $sqltargs = $self->sqltargs;
   my $version  = $self->schema_version;
 
-  my @filenames = @{$self->_ddl_schema_in_filenames($type, $version, $dir)};
+  my @filenames = @{$self->_ddl_schema_in_filenames($type, $version)};
 
   for my $filename (@filenames) {
     if(-f $filename) {
@@ -379,7 +382,6 @@ sub _upgrade_single_step {
   my @upgrade_files = @{$self->_ddl_schema_diff_in_filenames(
     $self->storage->sqlt_type,
     \@version_set,
-    $self->upgrade_directory,
   )};
 
   for my $upgrade_file (@upgrade_files) {