1 package DBIx::Class::DeploymentHandler::Filesystem;
4 use Method::Signatures::Simple;
5 use File::Path 'mkpath';
6 use File::Spec::Functions;
9 has script_directory => (
16 has ignore_ddl => ( is => 'ro' );
19 method _ddl_protoschema_produce_filename($version) {
20 my $dirname = catfile( $self->script_directory, '_source', 'deploy', $version );
21 mkpath($dirname) unless -d $dirname;
23 return catfile( $dirname, '001-auto.yml' );
27 method _ddl_protoschema_deploy_consume_filenames($version) {
28 my $base_dir = $self->script_directory;
30 my $dir = catfile( $base_dir, '_source', 'deploy', $version);
31 return [] unless -d $dir;
33 opendir my($dh), $dir;
34 my %files = map { $_ => "$dir/$_" } grep { /\.yml$/ && -f "$dir/$_" } readdir $dh;
37 return [@files{sort keys %files}]
40 method _ddl_protoschema_upgrade_consume_filenames($versions) {
41 my $base_dir = $self->script_directory;
43 my $dir = catfile( $base_dir, '_preprocess_schema', 'upgrade', join q(-), @{$versions});
45 return [] unless -d $dir;
47 opendir my($dh), $dir;
48 my %files = map { $_ => "$dir/$_" } grep { /\.pl$/ && -f "$dir/$_" } readdir $dh;
51 return [@files{sort keys %files}]
54 method _ddl_protoschema_downgrade_consume_filenames($versions) {
55 my $base_dir = $self->script_directory;
57 my $dir = catfile( $base_dir, '_preprocess_schema', 'downgrade', join q(-), @{$versions});
59 return [] unless -d $dir;
61 opendir my($dh), $dir;
62 my %files = map { $_ => "$dir/$_" } grep { /\.pl$/ && -f "$dir/$_" } readdir $dh;
65 return [@files{sort keys %files}]
70 method __ddl_consume_with_prefix($type, $versions, $prefix) {
71 my $base_dir = $self->script_directory;
73 my $main = catfile( $base_dir, $type );
75 catfile( $base_dir, '_common', $prefix, join q(-), @{$versions} );
78 catfile( $base_dir, '_common', $prefix, '_any' );
82 $dir = catfile($main, $prefix, join q(-), @{$versions})
84 if ($self->ignore_ddl) {
87 die "$main does not exist; please write/generate some SQL"
90 my $dir_any = catfile($main, $prefix, '_any');
94 opendir my($dh), $dir;
96 map { $_ => "$dir/$_" }
97 grep { /\.(?:sql|pl|sql-\w+)$/ && -f "$dir/$_" }
101 die $_ unless $self->ignore_ddl;
103 for my $dirname (grep { -d $_ } $common, $common_any, $dir_any) {
104 opendir my($dh), $dirname;
105 for my $filename (grep { /\.(?:sql|pl)$/ && -f catfile($dirname,$_) } readdir $dh) {
106 unless ($files{$filename}) {
107 $files{$filename} = catfile($dirname,$filename);
113 return [@files{sort keys %files}]
116 method _ddl_initialize_consume_filenames($type, $version) {
117 $self->__ddl_consume_with_prefix($type, [ $version ], 'initialize')
120 method _ddl_schema_consume_filenames($type, $version) {
121 $self->__ddl_consume_with_prefix($type, [ $version ], 'deploy')
124 method _ddl_schema_upgrade_consume_filenames($type, $versions) {
125 $self->__ddl_consume_with_prefix($type, $versions, 'upgrade')
128 method _ddl_schema_downgrade_consume_filenames($type, $versions) {
129 $self->__ddl_consume_with_prefix($type, $versions, 'downgrade')
133 method _ddl_schema_produce_filename($type, $version) {
134 my $dirname = catfile( $self->script_directory, $type, 'deploy', $version );
135 mkpath($dirname) unless -d $dirname;
137 return catfile( $dirname, '001-auto.sql' );
140 method _ddl_schema_upgrade_produce_filename($type, $versions) {
141 my $dir = $self->script_directory;
143 my $dirname = catfile( $dir, $type, 'upgrade', join q(-), @{$versions});
144 mkpath($dirname) unless -d $dirname;
146 return catfile( $dirname, '001-auto.sql' );
149 method _ddl_schema_downgrade_produce_filename($type, $versions, $dir) {
150 my $dirname = catfile( $dir, $type, 'downgrade', join q(-), @{$versions} );
151 mkpath($dirname) unless -d $dirname;
153 return catfile( $dirname, '001-auto.sql');
157 method _read_sql_file($file) {
160 open my $fh, '<', $file;
161 my @data = split /;\n/, join '', <$fh>;
165 $_ && # remove blank lines
166 !/^(BEGIN|BEGIN TRANSACTION|COMMIT)/ # strip txn's
168 s/^\s+//; s/\s+$//; # trim whitespace
169 join '', grep { !/^--/ } split /\n/ # remove comments
175 method _coderefs_per_files($files) {
176 no warnings 'redefine';
177 [map eval do { local( @ARGV, $/ ) = $_; <> }, @$files]
181 method _write_data_string($filename, $data) {
182 open my $file, q(>), $filename;
188 method _write_data_list($filename, $data) {
189 open my $file, q(>), $filename;
190 print {$file} join ";\n", @$data;
194 __PACKAGE__->meta->make_immutable;