X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=script%2Fdbicdump;h=5c72419808b76b45de3306b1c39eaafc4b298423;hb=dbe5c90463dd1b323513739b1d27607186caddac;hp=a1481365047a95b30682949e04d4617ef4983952;hpb=93acebe1048b67ece93a054c632253a57c3a1999;p=dbsrgits%2FDBIx-Class-Schema-Loader.git diff --git a/script/dbicdump b/script/dbicdump index a148136..5c72419 100644 --- a/script/dbicdump +++ b/script/dbicdump @@ -1,30 +1,72 @@ #!/usr/bin/perl +=encoding UTF-8 + =head1 NAME dbicdump - Dump a schema using DBIx::Class::Schema::Loader =head1 SYNOPSIS - dbicdump [-o = ] + dbicdump + dbicdump [-I ] [-o = ] \ + Examples: - $ dbicdump -o dump_directory=./lib \ - -o components='["InflateColumn::DateTime"]' \ - MyApp::Schema dbi:SQLite:./foo.db '{ quote_char => "\"" }' + $ dbicdump schema.conf + + $ dbicdump -o dump_directory=./lib \ + -o components='["InflateColumn::DateTime"]' \ + MyApp::Schema dbi:SQLite:./foo.db + + $ dbicdump -o dump_directory=./lib \ + -o components='["InflateColumn::DateTime"]' \ + MyApp::Schema dbi:SQLite:./foo.db '{ quote_char => "\"" }' + + $ dbicdump -Ilib -o dump_directory=./lib \ + -o components='["InflateColumn::DateTime"]' \ + -o preserve_case=1 \ + MyApp::Schema dbi:mysql:database=foo user pass \ + '{ quote_char => "`" }' - $ dbicdump -o dump_directory=./lib \ - -o components='["InflateColumn::DateTime"]' \ - -o preserve_case=1 \ - MyApp::Schema dbi:mysql:database=foo user pass '{ quote_char => "`" }' + $ dbicdump -o dump_directory=./lib \ + -o components='["InflateColumn::DateTime"]' \ + MyApp::Schema 'dbi:mysql:database=foo;host=domain.tld;port=3306' \ + user pass On Windows that would be: - $ dbicdump -o dump_directory=.\lib ^ - -o components="[q{InflateColumn::DateTime}]" ^ - -o preserve_case=1 ^ - MyApp::Schema dbi:mysql:database=foo user pass "{ quote_char => q{`} }" + $ dbicdump -o dump_directory=.\lib ^ + -o components="[q{InflateColumn::DateTime}]" ^ + -o preserve_case=1 ^ + MyApp::Schema dbi:mysql:database=foo user pass ^ + "{ quote_char => q{`} }" + +Configuration files must have schema_class and connect_info sections, +an example of a general config file is as follows: + + schema_class MyApp::Schema + + lib /extra/perl/libs + + # connection string + + dsn dbi:mysql:example + user root + pass secret + + + # dbic loader options + + dump_directory ./lib + components InflateColumn::DateTime + components TimeStamp + + +Using a config file requires L installed. + +The optional C key is equivalent to the C<-I> option. =head1 DESCRIPTION @@ -43,13 +85,9 @@ specified. L, L. -=head1 AUTHOR - -Dagfinn Ilmari Mannsåker C<< >> +=head1 AUTHORS -=head1 CONTRIBUTORS - -Caelum: Rafael Kitover +See L. =head1 LICENSE @@ -61,32 +99,84 @@ under the same terms as Perl itself. use strict; use warnings; use Getopt::Long; - use Pod::Usage; - -use DBIx::Class::Schema::Loader qw/ make_schema_at /; -require DBIx::Class::Schema::Loader::Base; +use DBIx::Class::Schema::Loader 'make_schema_at'; +use DBIx::Class::Schema::Loader::Base (); +use DBIx::Class::Schema::Loader::Optional::Dependencies (); +require lib; my $loader_options; -GetOptions( 'loader-option|o=s%' => \&handle_option ); +Getopt::Long::Configure('gnu_getopt'); + +GetOptions( + 'I=s' => sub { shift; lib->import(shift) }, + 'loader-option|o=s%' => \&handle_option, +); + $loader_options->{dump_directory} ||= '.'; -my ($schema_class, @loader_connect_info) = @ARGV - or pod2usage(1); +if (@ARGV == 1) { + if (not DBIx::Class::Schema::Loader::Optional::Dependencies->req_ok_for('dbicdump_config')) { + die sprintf "You must install the following CPAN modules to use a config file with dbicdump: %s.\n", + DBIx::Class::Schema::Loader::Optional::Dependencies->req_missing_for('dbicdump_config'); + } -my $dsn = shift @loader_connect_info; + my $configuration_file = shift @ARGV; -my ($user, $pass) = $dsn =~ /sqlite/i ? ('', '') - : splice @loader_connect_info, 0, 2; + my $configurations = Config::Any->load_files({ + use_ext => 1, + flatten_to_hash => 1, + files => [$configuration_file] + }); -my @extra_connect_info_opts = map parse_value($_), @loader_connect_info; + my $c = (values %$configurations)[0]; -make_schema_at( - $schema_class, - $loader_options, - [ $dsn, $user, $pass, @extra_connect_info_opts ], -); + unless (keys %{$c->{connect_info}} && $c->{schema_class}) { + pod2usage(1); + } + + my @libs; + + if ($c->{lib}) { + if (ref $c->{lib}) { + @libs = @{ $c->{lib} }; + } + + @libs = ($c->{lib}); + } + + lib->import($_) for @libs; + + my ($dsn, $user, $pass, $options) = + map { $c->{connect_info}->{$_} } qw/dsn user pass options/; + $options ||= {}; + $c->{loader_options}->{dump_directory} ||= + $loader_options->{dump_directory}; + + make_schema_at( + $c->{schema_class}, + $c->{loader_options} || {}, + [ $dsn, $user, $pass, %{$options} ], + ); +} +else { + my ($schema_class, @loader_connect_info) = @ARGV + or pod2usage(1); + + my $dsn = shift @loader_connect_info; + + my ($user, $pass) = $dsn =~ /sqlite/i ? ('', '') + : splice @loader_connect_info, 0, 2; + + my @extra_connect_info_opts = map parse_value($_), @loader_connect_info; + + make_schema_at( + $schema_class, + $loader_options, + [ $dsn, $user, $pass, @extra_connect_info_opts ], + ); +} exit 0;