preinstall may no longer connect to the database
[dbsrgits/DBIx-Class-DeploymentHandler.git] / lib / DBIx / Class / DeploymentHandler / DeployMethod / SQL / Translator.pm
CommitLineData
45d0d9d5 1package DBIx::Class::DeploymentHandler::DeployMethod::SQL::Translator;
334bced5 2use Moose;
9af9d0b2 3
9a3a62f1 4# ABSTRACT: Manage your SQL and Perl migrations in nicely laid out directories
5
9af9d0b2 6use autodie;
7use Carp qw( carp croak );
8
2e68a8e1 9use Method::Signatures::Simple;
7f50d101 10use Try::Tiny;
9af9d0b2 11
d23c7c77 12use SQL::Translator;
13require SQL::Translator::Diff;
9af9d0b2 14
d23c7c77 15require DBIx::Class::Storage; # loaded for type constraint
41863428 16use DBIx::Class::DeploymentHandler::Types;
17
9af9d0b2 18use File::Path 'mkpath';
19use File::Spec::Functions;
2e68a8e1 20
7521a845 21with 'DBIx::Class::DeploymentHandler::HandlesDeploy';
3c1b5ee8 22
d54b8d69 23has schema => (
24 isa => 'DBIx::Class::Schema',
25 is => 'ro',
26 required => 1,
d54b8d69 27);
28
334bced5 29has storage => (
30 isa => 'DBIx::Class::Storage',
31 is => 'ro',
32 lazy_build => 1,
33);
34
2eaf903b 35method _build_storage {
36 my $s = $self->schema->storage;
37 $s->_determine_driver;
38 $s
39}
40
02a7b8ac 41has sql_translator_args => (
334bced5 42 isa => 'HashRef',
43 is => 'ro',
44 default => sub { {} },
45);
46has upgrade_directory => (
47 isa => 'Str',
48 is => 'ro',
49 required => 1,
50 default => 'sql',
51);
52
334bced5 53has databases => (
54 coerce => 1,
55 isa => 'DBIx::Class::DeploymentHandler::Databases',
56 is => 'ro',
57 default => sub { [qw( MySQL SQLite PostgreSQL )] },
58);
59
a7d53deb 60has txn_wrap => (
61 is => 'ro',
62 isa => 'Bool',
63 default => 1,
64);
65
73caa630 66has schema_version => (
67 is => 'ro',
68 lazy_build => 1,
69);
70
71method _build_schema_version { $self->schema->schema_version }
72
76d311e7 73method __ddl_consume_with_prefix($type, $versions, $prefix) {
262166c1 74 my $base_dir = $self->upgrade_directory;
75
76d08d08 76 my $main = catfile( $base_dir, $type );
77 my $generic = catfile( $base_dir, '_generic' );
78 my $common =
79 catfile( $base_dir, '_common', $prefix, join q(-), @{$versions} );
262166c1 80
81 my $dir;
82 if (-d $main) {
76d08d08 83 $dir = catfile($main, $prefix, join q(-), @{$versions})
262166c1 84 } elsif (-d $generic) {
9af9d0b2 85 $dir = catfile($generic, $prefix, join q(-), @{$versions});
262166c1 86 } else {
9af9d0b2 87 croak "neither $main or $generic exist; please write/generate some SQL";
262166c1 88 }
89
90 opendir my($dh), $dir;
41219a5d 91 my %files = map { $_ => "$dir/$_" } grep { /\.(?:sql|pl)$/ && -f "$dir/$_" } readdir $dh;
262166c1 92 closedir $dh;
93
94 if (-d $common) {
95 opendir my($dh), $common;
41219a5d 96 for my $filename (grep { /\.(?:sql|pl)$/ && -f catfile($common,$_) } readdir $dh) {
262166c1 97 unless ($files{$filename}) {
9af9d0b2 98 $files{$filename} = catfile($common,$filename);
262166c1 99 }
100 }
101 closedir $dh;
102 }
103
104 return [@files{sort keys %files}]
105}
3c1b5ee8 106
fc4b7602 107method _ddl_preinstall_consume_filenames($type, $version) {
108 $self->__ddl_consume_with_prefix($type, [ $version ], 'preinstall')
109}
110
76d311e7 111method _ddl_schema_consume_filenames($type, $version) {
112 $self->__ddl_consume_with_prefix($type, [ $version ], 'schema')
3c1b5ee8 113}
114
76d311e7 115method _ddl_schema_produce_filename($type, $version) {
76d08d08 116 my $dirname = catfile( $self->upgrade_directory, $type, 'schema', $version );
117 mkpath($dirname) unless -d $dirname;
d54b8d69 118
76d08d08 119 return catfile( $dirname, '001-auto.sql' );
d54b8d69 120}
121
76d311e7 122method _ddl_schema_up_consume_filenames($type, $versions) {
123 $self->__ddl_consume_with_prefix($type, $versions, 'up')
3c1b5ee8 124}
125
76d311e7 126method _ddl_schema_down_consume_filenames($type, $versions) {
127 $self->__ddl_consume_with_prefix($type, $versions, 'down')
a41a04e5 128}
129
76d311e7 130method _ddl_schema_up_produce_filename($type, $versions) {
131 my $dir = $self->upgrade_directory;
132
76d08d08 133 my $dirname = catfile( $dir, $type, 'up', join q(-), @{$versions});
134 mkpath($dirname) unless -d $dirname;
a41a04e5 135
76d08d08 136 return catfile( $dirname, '001-auto.sql'
a41a04e5 137 );
138}
139
76d311e7 140method _ddl_schema_down_produce_filename($type, $versions, $dir) {
76d08d08 141 my $dirname = catfile( $dir, $type, 'down', join q(-), @{$versions} );
142 mkpath($dirname) unless -d $dirname;
24f4524b 143
76d08d08 144 return catfile( $dirname, '001-auto.sql');
24f4524b 145}
146
41219a5d 147method _run_sql_and_perl($filenames) {
148 my @files = @{$filenames};
149 my $storage = $self->storage;
2e68a8e1 150
c8a2f7bd 151
a7d53deb 152 my $guard = $self->schema->txn_scope_guard if $self->txn_wrap;
153
41219a5d 154 my $sql;
155 for my $filename (@files) {
156 if ($filename =~ /\.sql$/) {
157 my @sql = @{$self->_read_sql_file($filename)};
158 $sql .= join "\n", @sql;
159
160 foreach my $line (@sql) {
161 $storage->_query_start($line);
162 try {
163 # do a dbh_do cycle here, as we need some error checking in
164 # place (even though we will ignore errors)
165 $storage->dbh_do (sub { $_[1]->do($line) });
166 }
167 catch {
168 carp "$_ (running '${line}')"
169 }
170 $storage->_query_end($line);
171 }
0841a743 172 } elsif ( $filename =~ /^(.+)\.pl$/ ) {
0841a743 173 my $filedata = do { local( @ARGV, $/ ) = $filename; <> };
0841a743 174
175 no warnings 'redefine';
5b5defbc 176 my $fn = eval "$filedata";
0841a743 177 use warnings;
178
9faec51a 179 if ($@) {
5b5defbc 180 carp "$filename failed to compile: $@";
9faec51a 181 } elsif (ref $fn eq 'CODE') {
5b5defbc 182 $fn->($self->schema)
98c9484a 183 } else {
5b5defbc 184 carp "$filename should define an anonymouse sub that takes a schema but it didn't!";
98c9484a 185 }
41219a5d 186 } else {
fc4b7602 187 croak "A file ($filename) got to deploy that wasn't sql or perl!";
2e68a8e1 188 }
2e68a8e1 189 }
a7d53deb 190
191 $guard->commit if $self->txn_wrap;
41219a5d 192
193 return $sql;
194}
195
196sub deploy {
197 my $self = shift;
92c34cab 198 my $version = shift || $self->schema_version;
41219a5d 199
200 return $self->_run_sql_and_perl($self->_ddl_schema_consume_filenames(
201 $self->storage->sqlt_type,
92c34cab 202 $version,
41219a5d 203 ));
2e68a8e1 204}
205
80ff6f6d 206sub preinstall {
9faec51a 207 my $self = shift;
208 my $args = shift;
209 my $version = $args->{version} || $self->schema_version;
210 my $storage_type = $args->{storage_type} || $self->storage->sqlt_type;
fc4b7602 211
212 my @files = @{$self->_ddl_preinstall_consume_filenames(
9faec51a 213 $storage_type,
fc4b7602 214 $version,
215 )};
216
217 for my $filename (@files) {
218 # We ignore sql for now (till I figure out what to do with it)
219 if ( $filename =~ /^(.+)\.pl$/ ) {
fc4b7602 220 my $filedata = do { local( @ARGV, $/ ) = $filename; <> };
fc4b7602 221
9faec51a 222 no warnings 'redefine';
5b5defbc 223 my $fn = eval "$filedata";
fc4b7602 224 use warnings;
5b5defbc 225
9faec51a 226 if ($@) {
3fa64c79 227 carp "$filename failed to compile: $@";
9faec51a 228 } elsif (ref $fn eq 'CODE') {
fc4b7602 229 $fn->()
230 } else {
5b5defbc 231 carp "$filename should define an anonymous sub but it didn't!";
fc4b7602 232 }
233 } else {
234 croak "A file ($filename) got to preinstall_scripts that wasn't sql or perl!";
235 }
236 }
237}
238
c8a2f7bd 239sub _prepare_install {
73caa630 240 my $self = shift;
02a7b8ac 241 my $sqltargs = { %{$self->sql_translator_args}, %{shift @_} };
c8a2f7bd 242 my $to_file = shift;
2e68a8e1 243 my $schema = $self->schema;
244 my $databases = $self->databases;
245 my $dir = $self->upgrade_directory;
73caa630 246 my $version = $self->schema_version;
d54b8d69 247
9600776d 248 my $sqlt = SQL::Translator->new({
d54b8d69 249 add_drop_table => 1,
2e68a8e1 250 ignore_constraint_names => 1,
d54b8d69 251 ignore_index_names => 1,
252 parser => 'SQL::Translator::Parser::DBIx::Class',
3aaf766f 253 %{$sqltargs}
9600776d 254 });
2e68a8e1 255
d53e0bfc 256 my $sqlt_schema = $sqlt->translate( data => $schema )
387b11d2 257 or croak($sqlt->error);
2e68a8e1 258
259 foreach my $db (@$databases) {
260 $sqlt->reset;
261 $sqlt->{schema} = $sqlt_schema;
262 $sqlt->producer($db);
263
c8a2f7bd 264 my $filename = $self->$to_file($db, $version, $dir);
9600776d 265 if (-e $filename ) {
2e68a8e1 266 carp "Overwriting existing DDL file - $filename";
267 unlink $filename;
268 }
269
270 my $output = $sqlt->translate;
271 if(!$output) {
272 carp("Failed to translate to $db, skipping. (" . $sqlt->error . ")");
273 next;
274 }
387b11d2 275 open my $file, q(>), $filename;
2e68a8e1 276 print {$file} $output;
277 close $file;
278 }
279}
280
c8a2f7bd 281sub _resultsource_install_filename {
282 my ($self, $source_name) = @_;
283 return sub {
284 my ($self, $type, $version) = @_;
285 my $dirname = catfile( $self->upgrade_directory, $type, 'schema', $version );
286 mkpath($dirname) unless -d $dirname;
287
288 return catfile( $dirname, "001-auto-$source_name.sql" );
289 }
290}
291
292sub install_resultsource {
293 my ($self, $source, $version) = @_;
294
295 my $rs_install_file =
296 $self->_resultsource_install_filename($source->source_name);
297
298 my $files = [
299 $self->$rs_install_file(
300 $self->storage->sqlt_type,
301 $version,
302 )
303 ];
304 $self->_run_sql_and_perl($files);
305}
306
307sub prepare_resultsource_install {
308 my $self = shift;
309 my $source = shift;
310
311 my $filename = $self->_resultsource_install_filename($source->source_name);
312 $self->_prepare_install({
313 parser_args => { sources => [$source->source_name], }
314 }, $filename);
315}
316
91557c90 317sub prepare_deploy {
c8a2f7bd 318 my $self = shift;
319 $self->_prepare_install({}, '_ddl_schema_produce_filename');
320}
321
a41a04e5 322sub prepare_upgrade {
9600776d 323 my ($self, $from_version, $to_version, $version_set) = @_;
76d311e7 324 $self->_prepare_changegrade($from_version, $to_version, $version_set, 'up');
325}
326
327sub prepare_downgrade {
328 my ($self, $from_version, $to_version, $version_set) = @_;
329
76d311e7 330 $self->_prepare_changegrade($from_version, $to_version, $version_set, 'down');
331}
332
333method _prepare_changegrade($from_version, $to_version, $version_set, $direction) {
2e68a8e1 334 my $schema = $self->schema;
335 my $databases = $self->databases;
336 my $dir = $self->upgrade_directory;
02a7b8ac 337 my $sqltargs = $self->sql_translator_args;
2e68a8e1 338
73caa630 339 my $schema_version = $self->schema_version;
2e68a8e1 340
341 $sqltargs = {
342 add_drop_table => 1,
343 ignore_constraint_names => 1,
344 ignore_index_names => 1,
345 %{$sqltargs}
346 };
347
348 my $sqlt = SQL::Translator->new( $sqltargs );
349
350 $sqlt->parser('SQL::Translator::Parser::DBIx::Class');
d53e0bfc 351 my $sqlt_schema = $sqlt->translate( data => $schema )
387b11d2 352 or croak($sqlt->error);
2e68a8e1 353
354 foreach my $db (@$databases) {
355 $sqlt->reset;
356 $sqlt->{schema} = $sqlt_schema;
357 $sqlt->producer($db);
358
76d311e7 359 my $prefilename = $self->_ddl_schema_produce_filename($db, $from_version, $dir);
2e68a8e1 360 unless(-e $prefilename) {
361 carp("No previous schema file found ($prefilename)");
362 next;
363 }
76d311e7 364 my $diff_file_method = "_ddl_schema_${direction}_produce_filename";
365 my $diff_file = $self->$diff_file_method($db, $version_set, $dir );
2e68a8e1 366 if(-e $diff_file) {
76d311e7 367 carp("Overwriting existing $direction-diff file - $diff_file");
2e68a8e1 368 unlink $diff_file;
369 }
370
371 my $source_schema;
372 {
373 my $t = SQL::Translator->new({
374 %{$sqltargs},
375 debug => 0,
376 trace => 0,
377 });
378
379 $t->parser( $db ) # could this really throw an exception?
387b11d2 380 or croak($t->error);
2e68a8e1 381
382 my $out = $t->translate( $prefilename )
387b11d2 383 or croak($t->error);
2e68a8e1 384
385 $source_schema = $t->schema;
386
387 $source_schema->name( $prefilename )
388 unless $source_schema->name;
389 }
390
391 # The "new" style of producers have sane normalization and can support
392 # diffing a SQL file against a DBIC->SQLT schema. Old style ones don't
393 # And we have to diff parsed SQL against parsed SQL.
394 my $dest_schema = $sqlt_schema;
395
396 unless ( "SQL::Translator::Producer::$db"->can('preprocess_schema') ) {
397 my $t = SQL::Translator->new({
398 %{$sqltargs},
399 debug => 0,
400 trace => 0,
401 });
402
403 $t->parser( $db ) # could this really throw an exception?
387b11d2 404 or croak($t->error);
2e68a8e1 405
76d311e7 406 my $filename = $self->_ddl_schema_produce_filename($db, $to_version, $dir);
2e68a8e1 407 my $out = $t->translate( $filename )
387b11d2 408 or croak($t->error);
2e68a8e1 409
410 $dest_schema = $t->schema;
411
412 $dest_schema->name( $filename )
413 unless $dest_schema->name;
414 }
415
416 my $diff = SQL::Translator::Diff::schema_diff(
417 $source_schema, $db,
418 $dest_schema, $db,
419 $sqltargs
420 );
387b11d2 421 open my $file, q(>), $diff_file;
2e68a8e1 422 print {$file} $diff;
423 close $file;
424 }
425}
426
334bced5 427method _read_sql_file($file) {
428 return unless $file;
429
aabd4237 430 open my $fh, '<', $file;
0d19af1d 431 my @data = split /;\n/, join '', <$fh>;
334bced5 432 close $fh;
433
434 @data = grep {
0d19af1d 435 $_ && # remove blank lines
436 !/^(BEGIN|BEGIN TRANSACTION|COMMIT)/ # strip txn's
437 } map {
438 s/^\s+//; s/\s+$//; # trim whitespace
439 join '', grep { !/^--/ } split /\n/ # remove comments
440 } @data;
334bced5 441
442 return \@data;
443}
444
7d2a6974 445sub downgrade_single_step {
76d311e7 446 my $self = shift;
627581cd 447 my $version_set = shift @_;
41219a5d 448
449 my $sql = $self->_run_sql_and_perl($self->_ddl_schema_down_consume_filenames(
76d311e7 450 $self->storage->sqlt_type,
627581cd 451 $version_set,
41219a5d 452 ));
3249629f 453
41219a5d 454 return ['', $sql];
76d311e7 455}
456
7d2a6974 457sub upgrade_single_step {
7521a845 458 my $self = shift;
627581cd 459 my $version_set = shift @_;
41219a5d 460
461 my $sql = $self->_run_sql_and_perl($self->_ddl_schema_up_consume_filenames(
334bced5 462 $self->storage->sqlt_type,
627581cd 463 $version_set,
41219a5d 464 ));
465 return ['', $sql];
334bced5 466}
467
aabd4237 468__PACKAGE__->meta->make_immutable;
469
2e68a8e1 4701;
e051bb00 471
e52174e3 472# vim: ts=2 sw=2 expandtab
473
e051bb00 474__END__
475
bcc72297 476=head1 DESCRIPTION
477
478This class is the meat of L<DBIx::Class::DeploymentHandler>. It takes care of
479generating sql files representing schemata as well as sql files to move from
480one version of a schema to the rest. One of the hallmark features of this
481class is that it allows for multiple sql files for deploy and upgrade, allowing
482developers to fine tune deployment. In addition it also allows for perl files
483to be run at any stage of the process.
484
485For basic usage see L<DBIx::Class::DeploymentHandler::HandlesDeploy>. What's
486documented here is extra fun stuff or private methods.
487
488=head1 DIRECTORY LAYOUT
489
92c34cab 490Arguably this is the best feature of L<DBIx::Class::DeploymentHandler>. It's
491heavily based upon L<DBIx::Migration::Directories>, but has some extensions and
492modifications, so even if you are familiar with it, please read this. I feel
493like the best way to describe the layout is with the following example:
494
495 $sql_migration_dir
496 |- SQLite
497 | |- down
4f85efc6 498 | | `- 2-1
92c34cab 499 | | `- 001-auto.sql
500 | |- schema
501 | | `- 1
502 | | `- 001-auto.sql
503 | `- up
504 | |- 1-2
505 | | `- 001-auto.sql
506 | `- 2-3
507 | `- 001-auto.sql
508 |- _common
509 | |- down
4f85efc6 510 | | `- 2-1
92c34cab 511 | | `- 002-remove-customers.pl
512 | `- up
513 | `- 1-2
514 | `- 002-generate-customers.pl
515 |- _generic
516 | |- down
4f85efc6 517 | | `- 2-1
92c34cab 518 | | `- 001-auto.sql
519 | |- schema
520 | | `- 1
521 | | `- 001-auto.sql
522 | `- up
523 | `- 1-2
524 | |- 001-auto.sql
525 | `- 002-create-stored-procedures.sql
526 `- MySQL
527 |- down
4f85efc6 528 | `- 2-1
92c34cab 529 | `- 001-auto.sql
80ff6f6d 530 |- preinstall
531 | `- 1
532 | |- 001-create_database.pl
533 | `- 002-create_users_and_permissions.pl
92c34cab 534 |- schema
535 | `- 1
536 | `- 001-auto.sql
537 `- up
538 `- 1-2
539 `- 001-auto.sql
540
541So basically, the code
542
543 $dm->deploy(1)
544
545on an C<SQLite> database that would simply run
546C<$sql_migration_dir/SQLite/schema/1/001-auto.sql>. Next,
547
548 $dm->upgrade_single_step([1,2])
549
550would run C<$sql_migration_dir/SQLite/up/1-2/001-auto.sql> followed by
551C<$sql_migration_dir/_common/up/1-2/002-generate-customers.pl>.
552
553Now, a C<.pl> file doesn't have to be in the C<_common> directory, but most of
554the time it probably should be, since perl scripts will mostly be database
555independent.
556
557C<_generic> exists for when you for some reason are sure that your SQL is
558generic enough to run on all databases. Good luck with that one.
559
80ff6f6d 560Note that unlike most steps in the process, C<preinstall> will not run SQL, as
561there may not even be an database at preinstall time. It will run perl scripts
562just like the other steps in the process, but nothing is passed to them.
563Until people have used this more it will remain freeform, but a recommended use
564of preinstall is to have it prompt for username and password, and then call the
565appropriate C<< CREATE DATABASE >> commands etc.
566
92c34cab 567=head1 PERL SCRIPTS
568
7d0b0f2b 569A perl script for this tool is very simple. It merely needs to contain an
570anonymous sub that takes a L<DBIx::Class::Schema> as it's only argument.
92c34cab 571A very basic perl script might look like:
572
573 #!perl
574
575 use strict;
576 use warnings;
577
7d0b0f2b 578 sub {
92c34cab 579 my $schema = shift;
580
581 $schema->resultset('Users')->create({
582 name => 'root',
583 password => 'root',
584 })
585 }
bcc72297 586
eb28403b 587=attr schema
a65184c8 588
bcc72297 589The L<DBIx::Class::Schema> (B<required>) that is used to talk to the database
590and generate the DDL.
591
eb28403b 592=attr storage
a65184c8 593
bcc72297 594The L<DBIx::Class::Storage> that is I<actually> used to talk to the database
595and generate the DDL. This is automatically created with L</_build_storage>.
596
02a7b8ac 597=attr sql_translator_args
cfc9edf9 598
02a7b8ac 599The arguments that get passed to L<SQL::Translator> when it's used.
a65184c8 600
eb28403b 601=attr upgrade_directory
cfc9edf9 602
603The directory (default C<'sql'>) that upgrades are stored in
604
eb28403b 605=attr databases
cfc9edf9 606
607The types of databases (default C<< [qw( MySQL SQLite PostgreSQL )] >>) to
608generate files for
609
eb28403b 610=attr txn_wrap
611
bcc72297 612Set to true (which is the default) to wrap all upgrades and deploys in a single
613transaction.
614
73caa630 615=attr schema_version
616
617The version the schema on your harddrive is at. Defaults to
618C<< $self->schema->schema_version >>.
619
eb28403b 620=method __ddl_consume_with_prefix
a65184c8 621
bcc72297 622 $dm->__ddl_consume_with_prefix( 'SQLite', [qw( 1.00 1.01 )], 'up' )
623
624This is the meat of the multi-file upgrade/deploy stuff. It returns a list of
625files in the order that they should be run for a generic "type" of upgrade.
626You should not be calling this in user code.
627
eb28403b 628=method _ddl_schema_consume_filenames
a65184c8 629
bcc72297 630 $dm->__ddl_schema_consume_filenames( 'SQLite', [qw( 1.00 )] )
631
632Just a curried L</__ddl_consume_with_prefix>. Get's a list of files for an
633initial deploy.
634
eb28403b 635=method _ddl_schema_produce_filename
a65184c8 636
bcc72297 637 $dm->__ddl_schema_produce_filename( 'SQLite', [qw( 1.00 )] )
638
639Returns a single file in which an initial schema will be stored.
640
eb28403b 641=method _ddl_schema_up_consume_filenames
a65184c8 642
bcc72297 643 $dm->_ddl_schema_up_consume_filenames( 'SQLite', [qw( 1.00 )] )
644
645Just a curried L</__ddl_consume_with_prefix>. Get's a list of files for an
646upgrade.
647
eb28403b 648=method _ddl_schema_down_consume_filenames
a65184c8 649
bcc72297 650 $dm->_ddl_schema_down_consume_filenames( 'SQLite', [qw( 1.00 )] )
651
652Just a curried L</__ddl_consume_with_prefix>. Get's a list of files for a
653downgrade.
654
eb28403b 655=method _ddl_schema_up_produce_filenames
a65184c8 656
bcc72297 657 $dm->_ddl_schema_up_produce_filename( 'SQLite', [qw( 1.00 1.01 )] )
658
659Returns a single file in which the sql to upgrade from one schema to another
660will be stored.
661
662=method _ddl_schema_down_produce_filename
663
664 $dm->_ddl_schema_down_produce_filename( 'SQLite', [qw( 1.00 1.01 )] )
665
666Returns a single file in which the sql to downgrade from one schema to another
667will be stored.
a65184c8 668
eb28403b 669=method _resultsource_install_filename
a65184c8 670
bcc72297 671 my $filename_fn = $dm->_resultsource_install_filename('User');
672 $dm->$filename_fn('SQLite', '1.00')
673
674Returns a function which in turn returns a single filename used to install a
675single resultsource. Weird interface is convenient for me. Deal with it.
676
eb28403b 677=method _run_sql_and_perl
678
bcc72297 679 $dm->_run_sql_and_perl([qw( list of filenames )])
a65184c8 680
bcc72297 681Simply put, this runs the list of files passed to it. If the file ends in
682C<.sql> it runs it as sql and if it ends in C<.pl> it runs it as a perl file.
a65184c8 683
bcc72297 684Depending on L</txn_wrap> all of the files run will be wrapped in a single
685transaction.
eb28403b 686
bcc72297 687=method _prepare_install
a65184c8 688
bcc72297 689 $dm->_prepare_install({ add_drop_table => 0 }, sub { 'file_to_create' })
a65184c8 690
bcc72297 691Generates the sql file for installing the database. First arg is simply
692L<SQL::Translator> args and the second is a coderef that returns the filename
693to store the sql in.
a65184c8 694
bcc72297 695=method _prepare_changegrade
696
697 $dm->_prepare_changegrade('1.00', '1.01', [qw( 1.00 1.01)], 'up')
a65184c8 698
bcc72297 699Generates the sql file for migrating from one schema version to another. First
700arg is the version to start from, second is the version to go to, third is the
701L<version set|DBIx::Class::DeploymentHandler/VERSION SET>, and last is the
702direction of the changegrade, be it 'up' or 'down'.
a65184c8 703
bcc72297 704=method _read_sql_file
a65184c8 705
bcc72297 706 $dm->_read_sql_file('foo.sql')
a65184c8 707
bcc72297 708Reads a sql file and returns lines in an C<ArrayRef>. Strips out comments,
709transactions, and blank lines.
eb28403b 710